From f08d9d489c167d90a0c174af7041180324e2bf92 Mon Sep 17 00:00:00 2001 From: Daan Leijen Date: Thu, 30 Mar 2023 09:19:35 -0700 Subject: [PATCH 1/7] bump version for further development --- cmake/mimalloc-config-version.cmake | 2 +- include/mimalloc.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/mimalloc-config-version.cmake b/cmake/mimalloc-config-version.cmake index 1141128c..ddbef08b 100644 --- a/cmake/mimalloc-config-version.cmake +++ b/cmake/mimalloc-config-version.cmake @@ -1,6 +1,6 @@ set(mi_version_major 1) set(mi_version_minor 8) -set(mi_version_patch 0) +set(mi_version_patch 1) set(mi_version ${mi_version_major}.${mi_version_minor}) set(PACKAGE_VERSION ${mi_version}) diff --git a/include/mimalloc.h b/include/mimalloc.h index 66545a8c..564be236 100644 --- a/include/mimalloc.h +++ b/include/mimalloc.h @@ -8,7 +8,7 @@ terms of the MIT license. A copy of the license can be found in the file #ifndef MIMALLOC_H #define MIMALLOC_H -#define MI_MALLOC_VERSION 180 // major + 2 digits minor +#define MI_MALLOC_VERSION 181 // major + 2 digits minor // ------------------------------------------------------ // Compiler specific attributes From 47d8cd916e6863cd01dc0c60c3270b591bf1687a Mon Sep 17 00:00:00 2001 From: Daan Leijen Date: Thu, 30 Mar 2023 09:21:07 -0700 Subject: [PATCH 2/7] fix compile without MADV_FREE (pr #715 by elbaro) --- src/prim/unix/prim.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/prim/unix/prim.c b/src/prim/unix/prim.c index 077bf820..4302d996 100644 --- a/src/prim/unix/prim.c +++ b/src/prim/unix/prim.c @@ -391,7 +391,7 @@ int _mi_prim_reset(void* start, size_t size) { err = unix_madvise(start, size, MADV_DONTNEED); } #else - int err = unix_madvise(start, csize, MADV_DONTNEED); + int err = unix_madvise(start, size, MADV_DONTNEED); #endif return err; } From 8607c4a5df28471afc0110de9b5c26f6ef063b69 Mon Sep 17 00:00:00 2001 From: Daan Leijen Date: Thu, 30 Mar 2023 09:24:06 -0700 Subject: [PATCH 3/7] fix compile without syscall (pr #714 by asuka-mio) --- src/prim/unix/prim.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/prim/unix/prim.c b/src/prim/unix/prim.c index 4302d996..011ffa7c 100644 --- a/src/prim/unix/prim.c +++ b/src/prim/unix/prim.c @@ -79,7 +79,7 @@ static int mi_prim_access(const char *fpath, int mode) { #elif !defined(__APPLE__) // avoid unused warnings static int mi_prim_open(const char* fpath, int open_flags) { - return open(fpath,open_flags,mode); + return open(fpath,open_flags); } static ssize_t mi_prim_read(int fd, void* buf, size_t bufsize) { return read(fd,buf,bufsize); From d3ec7f378ebc645b6b3bca8bb7ea92968d1284e3 Mon Sep 17 00:00:00 2001 From: Daan Leijen Date: Fri, 31 Mar 2023 10:25:32 -0700 Subject: [PATCH 4/7] fix compile on ppc64IE and s390x arches (issue #717) --- include/mimalloc/prim.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/mimalloc/prim.h b/include/mimalloc/prim.h index 68f0871e..10378c92 100644 --- a/include/mimalloc/prim.h +++ b/include/mimalloc/prim.h @@ -113,6 +113,10 @@ void _mi_prim_thread_associate_default_heap(mi_heap_t* heap); // for each thread (unequal to zero). //------------------------------------------------------------------- +// defined in `init.c`; do not use these directly +extern mi_decl_thread mi_heap_t* _mi_heap_default; // default heap to allocate from +extern bool _mi_process_is_initialized; // has mi_process_init been called? + static inline mi_threadid_t _mi_prim_thread_id(void) mi_attr_noexcept; #if defined(_WIN32) @@ -230,10 +234,6 @@ We try to circumvent this in an efficient way: - DragonFly: defaults are working but seem slow compared to freeBSD (see PR #323) ------------------------------------------------------------------------------------------- */ -// defined in `init.c`; do not use these directly -extern mi_decl_thread mi_heap_t* _mi_heap_default; // default heap to allocate from -extern bool _mi_process_is_initialized; // has mi_process_init been called? - static inline mi_heap_t* mi_prim_get_default_heap(void); #if defined(MI_MALLOC_OVERRIDE) From 3208dff17a3aa12a75afa05b8e10a7bffc3a961e Mon Sep 17 00:00:00 2001 From: Daan Leijen Date: Fri, 31 Mar 2023 10:33:36 -0700 Subject: [PATCH 5/7] remove extraneous forward declarations --- src/arena.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/arena.c b/src/arena.c index 152f7bea..de5e75ff 100644 --- a/src/arena.c +++ b/src/arena.c @@ -27,18 +27,6 @@ The arena allocation needs to be thread safe and we use an atomic bitmap to allo #include "bitmap.h" // atomic bitmap - -// os.c -void* _mi_os_alloc_aligned(size_t size, size_t alignment, bool commit, bool* large, mi_stats_t* stats); -void _mi_os_free_ex(void* p, size_t size, bool was_committed, mi_stats_t* stats); -void _mi_os_free(void* p, size_t size, mi_stats_t* stats); - -void* _mi_os_alloc_huge_os_pages(size_t pages, int numa_node, mi_msecs_t max_secs, size_t* pages_reserved, size_t* psize); -void _mi_os_free_huge_pages(void* p, size_t size, mi_stats_t* stats); - -bool _mi_os_commit(void* p, size_t size, bool* is_zero, mi_stats_t* stats); -bool _mi_os_decommit(void* addr, size_t size, mi_stats_t* stats); - /* ----------------------------------------------------------- Arena allocation ----------------------------------------------------------- */ From 05e7931b9480d64234c670bfcc6e38f6d9d7b224 Mon Sep 17 00:00:00 2001 From: Daan Leijen Date: Sat, 1 Apr 2023 11:28:34 -0700 Subject: [PATCH 6/7] prevent pedantic warning --- src/options.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/options.c b/src/options.c index 6f6655f2..33ea0a1f 100644 --- a/src/options.c +++ b/src/options.c @@ -288,7 +288,7 @@ static void mi_recurse_exit(void) { } void _mi_fputs(mi_output_fun* out, void* arg, const char* prefix, const char* message) { - if (out==NULL || (FILE*)out==stdout || (FILE*)out==stderr) { // TODO: use mi_out_stderr for stderr? + if (out==NULL || (void*)out==(void*)stdout || (void*)out==(void*)stderr) { // TODO: use mi_out_stderr for stderr? if (!mi_recurse_enter()) return; out = mi_out_get_default(&arg); if (prefix != NULL) out(prefix, arg); From cc4ed36c7ef514e7f6ff953c2f821830021aa551 Mon Sep 17 00:00:00 2001 From: Daan Leijen Date: Mon, 3 Apr 2023 12:30:18 -0700 Subject: [PATCH 7/7] prepare for new release --- readme.md | 6 ++++-- src/alloc.c | 8 ++++---- src/arena.c | 2 +- src/bitmap.c | 2 +- src/os.c | 6 ++---- src/page.c | 2 +- src/segment.c | 2 +- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/readme.md b/readme.md index 10e1695b..003cd8cf 100644 --- a/readme.md +++ b/readme.md @@ -12,8 +12,8 @@ is a general purpose allocator with excellent [performance](#performance) charac Initially developed by Daan Leijen for the runtime systems of the [Koka](https://koka-lang.github.io) and [Lean](https://github.com/leanprover/lean) languages. -Latest release tag: `v2.1.0` (2023-03-29). -Latest stable tag: `v1.8.0` (2023-03-29). +Latest release tag: `v2.1.1` (2023-04-03). +Latest stable tag: `v1.8.1` (2023-04-03). mimalloc is a drop-in replacement for `malloc` and can be used in other programs without code changes, for example, on dynamically linked ELF-based systems (Linux, BSD, etc.) you can use it as: @@ -78,6 +78,8 @@ Note: the `v2.x` version has a new algorithm for managing internal mimalloc page and fragmentation compared to mimalloc `v1.x` (especially for large workloads). Should otherwise have similar performance (see [below](#performance)); please report if you observe any significant performance regression. +* 2023-04-03, `v1.8.1`, `v2.1.1`: Fixes build issues on some platforms. + * 2023-03-29, `v1.8.0`, `v2.1.0`: Improved support dynamic overriding on Windows 11. Improved tracing precision with [asan](#asan) and [Valgrind](#valgrind), and added Windows event tracing [ETW](#ETW) (contributed by Xinglong He). Created an OS abstraction layer to make it easier to port and separate platform dependent code (in `src/prim`). Fixed C++ STL compilation on older Microsoft C++ compilers, and various small bug fixes. diff --git a/src/alloc.c b/src/alloc.c index 75d8999c..a0d67fa8 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -75,8 +75,8 @@ extern inline void* _mi_page_malloc(mi_heap_t* heap, mi_page_t* page, size_t siz ptrdiff_t delta = ((uint8_t*)padding - (uint8_t*)block - (size - MI_PADDING_SIZE)); #if (MI_DEBUG>=2) mi_assert_internal(delta >= 0 && mi_page_usable_block_size(page) >= (size - MI_PADDING_SIZE + delta)); - mi_track_mem_defined(padding,sizeof(mi_padding_t)); // note: re-enable since mi_page_usable_block_size may set noaccess #endif + mi_track_mem_defined(padding,sizeof(mi_padding_t)); // note: re-enable since mi_page_usable_block_size may set noaccess padding->canary = (uint32_t)(mi_ptr_encode(page,block,page->keys)); padding->delta = (uint32_t)(delta); #if MI_PADDING_CHECK @@ -406,7 +406,7 @@ static mi_decl_noinline void _mi_free_block_mt(mi_page_t* page, mi_block_t* bloc } - #if (MI_DEBUG!=0) && !MI_TRACK_ENABLED && !MI_TSAN // note: when tracking, cannot use mi_usable_size with multi-threading + #if (MI_DEBUG>0) && !MI_TRACK_ENABLED && !MI_TSAN // note: when tracking, cannot use mi_usable_size with multi-threading memset(block, MI_DEBUG_FREED, mi_usable_size(block)); #endif @@ -458,7 +458,7 @@ static inline void _mi_free_block(mi_page_t* page, bool local, mi_block_t* block // owning thread can free a block directly if mi_unlikely(mi_check_is_double_free(page, block)) return; mi_check_padding(page, block); - #if (MI_DEBUG!=0) && !MI_TRACK_ENABLED && !MI_TSAN + #if (MI_DEBUG>0) && !MI_TRACK_ENABLED && !MI_TSAN memset(block, MI_DEBUG_FREED, mi_page_block_size(page)); #endif mi_block_set_next(page, block, page->local_free); @@ -546,7 +546,7 @@ void mi_free(void* p) mi_attr_noexcept if mi_unlikely(mi_check_is_double_free(page, block)) return; mi_check_padding(page, block); mi_stat_free(page, block); - #if (MI_DEBUG!=0) && !MI_TRACK_ENABLED && !MI_TSAN + #if (MI_DEBUG>0) && !MI_TRACK_ENABLED && !MI_TSAN memset(block, MI_DEBUG_FREED, mi_page_block_size(page)); #endif mi_track_free_size(p, mi_page_usable_size_of(page,block)); // faster then mi_usable_size as we already know the page and that p is unaligned diff --git a/src/arena.c b/src/arena.c index de5e75ff..ff3c0871 100644 --- a/src/arena.c +++ b/src/arena.c @@ -184,7 +184,7 @@ static mi_decl_noinline void* mi_arena_allocate(int numa_node, size_t size, size bool* is_pinned, bool* is_zero, mi_arena_id_t req_arena_id, size_t* memid, mi_os_tld_t* tld ) { - MI_UNUSED_RELEASE(alignment); + MI_UNUSED(alignment); mi_assert_internal(alignment <= MI_SEGMENT_ALIGN); const size_t max_arena = mi_atomic_load_relaxed(&mi_arena_count); const size_t bcount = mi_block_count_of_size(size); diff --git a/src/bitmap.c b/src/bitmap.c index 8483de0b..e64b1860 100644 --- a/src/bitmap.c +++ b/src/bitmap.c @@ -281,7 +281,7 @@ bool _mi_bitmap_try_find_from_claim_across(mi_bitmap_t bitmap, const size_t bitm // Helper for masks across fields; returns the mid count, post_mask may be 0 static size_t mi_bitmap_mask_across(mi_bitmap_index_t bitmap_idx, size_t bitmap_fields, size_t count, size_t* pre_mask, size_t* mid_mask, size_t* post_mask) { - MI_UNUSED_RELEASE(bitmap_fields); + MI_UNUSED(bitmap_fields); const size_t bitidx = mi_bitmap_index_bit_in_field(bitmap_idx); if mi_likely(bitidx + count <= MI_BITMAP_FIELD_BITS) { *pre_mask = mi_bitmap_mask_(count, bitidx); diff --git a/src/os.c b/src/os.c index a6732081..1171a1ab 100644 --- a/src/os.c +++ b/src/os.c @@ -411,10 +411,8 @@ static bool mi_os_resetx(void* addr, size_t size, bool reset, mi_stats_t* stats) else _mi_stat_decrease(&stats->reset, csize); if (!reset) return true; // nothing to do on unreset! - #if (MI_DEBUG>1) && !MI_TRACK_ENABLED // && !MI_TSAN - if (MI_SECURE==0) { - memset(start, 0, csize); // pretend it is eagerly reset - } + #if (MI_DEBUG>1) && !MI_SECURE && !MI_TRACK_ENABLED // && !MI_TSAN + memset(start, 0, csize); // pretend it is eagerly reset #endif int err = _mi_prim_reset(start, csize); diff --git a/src/page.c b/src/page.c index aa9f1bde..7da12c3a 100644 --- a/src/page.c +++ b/src/page.c @@ -383,7 +383,7 @@ void _mi_page_abandon(mi_page_t* page, mi_page_queue_t* pq) { mi_assert_internal(mi_page_thread_free_flag(page)==MI_NEVER_DELAYED_FREE); mi_page_set_heap(page, NULL); -#if MI_DEBUG>1 +#if (MI_DEBUG>1) && !MI_TRACK_ENABLED // check there are no references left.. for (mi_block_t* block = (mi_block_t*)pheap->thread_delayed_free; block != NULL; block = mi_block_nextx(pheap, block, pheap->keys)) { mi_assert_internal(_mi_ptr_page(block) != page); diff --git a/src/segment.c b/src/segment.c index ae15847c..56b7a06c 100644 --- a/src/segment.c +++ b/src/segment.c @@ -482,7 +482,7 @@ static void mi_segment_os_free(mi_segment_t* segment, size_t segment_size, mi_se // called by threads that are terminating to free cached segments void _mi_segment_thread_collect(mi_segments_tld_t* tld) { - MI_UNUSED_RELEASE(tld); + MI_UNUSED(tld); #if MI_DEBUG>=2 if (!_mi_is_main_thread()) { mi_assert_internal(tld->pages_reset.first == NULL);