Skip to content

Commit 503072c

Browse files
committed
Update to mimalloc 3.6.1
1 parent fc1a504 commit 503072c

62 files changed

Lines changed: 1904 additions & 1340 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎Include/internal/mimalloc/mimalloc-override.h‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ not accidentally mix pointers from different allocators).
5555
#define posix_memalign(p,a,n) mi_posix_memalign(p,a,n)
5656
#define _posix_memalign(p,a,n) mi_posix_memalign(p,a,n)
5757

58+
// C23
59+
#define free_sized(p,n) mi_free_sized(p,n)
60+
#define free_aligned_sized(p,a,n) mi_free_aligned_sized(p,a,n)
61+
5862
// Microsoft aligned variants
5963
#define _aligned_malloc(n,a) mi_malloc_aligned(n,a)
6064
#define _aligned_realloc(p,n,a) mi_realloc_aligned(p,n,a)

‎Include/internal/mimalloc/mimalloc.h‎

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ terms of the MIT license. A copy of the license can be found in the file
88
#ifndef MIMALLOC_H
99
#define MIMALLOC_H
1010

11-
#define MI_MALLOC_VERSION 30600 // major + 2 digits minor + 2 digits patch
11+
#define MI_MALLOC_VERSION 30601 // major + 2 digits minor + 2 digits patch
1212

1313
// ------------------------------------------------------
1414
// Compiler specific attributes
@@ -144,8 +144,11 @@ mi_decl_export void mi_free_small(void* p) mi_attr_noexcept;
144144
// As `mi_free_small` but `p` should not be a NULL pointer.
145145
mi_decl_export void mi_free_small_nonnull(void* p) mi_attr_noexcept;
146146

147-
// For runtime's: return the current owner thread-id of the page containing an allocation.
148-
mi_decl_nodiscard mi_decl_export size_t mi_thread_id_of(const void* p) mi_attr_noexcept;
147+
mi_decl_export void mi_free_size_aligned(void* p, size_t size, size_t alignment) mi_attr_noexcept;
148+
mi_decl_export void mi_free_aligned(void* p, size_t alignment) mi_attr_noexcept;
149+
150+
// Checked free: always checks the pointer is valid before free-ing (and otherwise ignores the pointer)
151+
mi_decl_export bool mi_cfree(void* p) mi_attr_noexcept;
149152

150153

151154
// -------------------------------------------------------------------------------------
@@ -434,6 +437,9 @@ mi_decl_export void mi_theap_delete(mi_theap_t* theap) mi_attr_noexcept;
434437
// Abandon all theap pages, preserving live blocks and the theap for reuse. The owner must be the current thread or quiescent outside mimalloc (excluding concurrent heap/theap deletion).
435438
mi_decl_export void mi_theap_quiescent_abandon(mi_theap_t* theap) mi_attr_noexcept;
436439

440+
// For runtime's: return the current owner thread-id of the page containing an allocation.
441+
mi_decl_nodiscard mi_decl_export size_t mi_thread_id_of(const void* p) mi_attr_noexcept;
442+
437443

438444
// ------------------------------------------------------
439445
// Deprecated
@@ -497,7 +503,7 @@ typedef enum mi_option_e {
497503
mi_option_guarded_sample_rate, // guard an object in the min/max range about every N requested bytes (=0)
498504
mi_option_guarded_sample_seed, // can be set to allow for a (more) deterministic re-execution when a guard page is triggered (=0)
499505
mi_option_generic_collect, // collect theaps every N (=10000) generic allocation calls
500-
mi_option_page_reclaim_on_free, // heap-creation default for reclaim on free: -1 disallow, 0 originating theap only, 1 allow across theaps
506+
mi_option_page_reclaim_on_free, // heap-creation default for reclaim on free: -1 disallow, 0 originating theap only (default), 1 allow across theaps
501507
mi_option_page_full_retain, // retain N full (small) pages per size class (=2)
502508
mi_option_page_max_candidates, // max candidate pages to consider for allocation (=4)
503509
mi_option_max_vabits, // max user space virtual address bits to consider (=48)
@@ -514,7 +520,7 @@ typedef enum mi_option_e {
514520
mi_option_profile_inuse_interval, // number of in-use bytes grown between automatic snapshots of the heap profiler (=0, disabled)
515521
mi_option_profile_time_interval, // number of seconds between automatic snapshots of the heap profiler (=0, disabled)
516522
mi_option_profile_sample_rate, // sample rate (in bytes) for heap profiler (=512 KiB)
517-
mi_option_stats_merge_threshold, // on a page stats update, merge theap stats into the parent heap if N bytes were freed/allocated; 0 disables (=512 KiB)
523+
mi_option_stats_merge_threshold, // on a page stats update, merge theap stats into the parent heap if N bytes were freed/allocated; 0 disables (=4 MiB)
518524
mi_option_arena_purge_immediate_size, // ranges above this size are purged immediately
519525
_mi_option_last,
520526
// legacy option names
@@ -546,8 +552,6 @@ mi_decl_export void mi_option_set_default(mi_option_t option, long value);
546552
// note: we use `mi_cfree` as "checked free" and it checks if the pointer is in our theap before free-ing.
547553
// -------------------------------------------------------------------------------------------------------
548554

549-
mi_decl_export bool mi_cfree(void* p) mi_attr_noexcept;
550-
mi_decl_export void* mi__expand(void* p, size_t newsize) mi_attr_noexcept;
551555
mi_decl_nodiscard mi_decl_export size_t mi_malloc_size(const void* p) mi_attr_noexcept;
552556
mi_decl_nodiscard mi_decl_export size_t mi_malloc_good_size(size_t size) mi_attr_noexcept;
553557
mi_decl_nodiscard mi_decl_export size_t mi_malloc_usable_size(const void *p) mi_attr_noexcept;
@@ -556,21 +560,25 @@ mi_decl_export int mi_posix_memalign(void** p, size_t alignment, size_t size); /
556560
mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_memalign(size_t alignment, size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(2) mi_attr_alloc_align(1);
557561
mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_valloc(size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(1);
558562
mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_pvalloc(size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(1);
559-
mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_aligned_alloc(size_t alignment, size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(2) mi_attr_alloc_align(1);
560563

561564
mi_decl_nodiscard mi_decl_export void* mi_reallocarray(void* p, size_t count, size_t size) mi_attr_noexcept mi_attr_alloc_size2(2,3);
562565
mi_decl_nodiscard mi_decl_export int mi_reallocarr(void* ptrp, size_t count, size_t size) mi_attr_noexcept;
563566
mi_decl_nodiscard mi_decl_export void* mi_aligned_recalloc(void* p, size_t newcount, size_t size, size_t alignment) mi_attr_noexcept;
564567
mi_decl_nodiscard mi_decl_export void* mi_aligned_offset_recalloc(void* p, size_t newcount, size_t size, size_t alignment, size_t offset) mi_attr_noexcept;
565568

566-
mi_decl_export void mi_free_size_aligned(void* p, size_t size, size_t alignment) mi_attr_noexcept;
567-
mi_decl_export void mi_free_aligned(void* p, size_t alignment) mi_attr_noexcept;
568-
mi_decl_export int mi_dupenv_s(char** buf, size_t* size, const char* name) mi_attr_noexcept;
569+
// C11
570+
mi_decl_nodiscard mi_decl_export mi_decl_restrict void* mi_aligned_alloc(size_t alignment, size_t size) mi_attr_noexcept mi_attr_malloc mi_attr_alloc_size(2) mi_attr_alloc_align(1);
571+
572+
// C23
573+
mi_decl_export void mi_free_aligned_sized( void* p, size_t alignment, size_t size ) mi_attr_noexcept;
574+
mi_decl_export void mi_free_sized( void* p, size_t size ) mi_attr_noexcept;
569575

570-
// wide characters
571-
mi_decl_export int mi_wdupenv_s(wchar_t** buf, size_t* size, const wchar_t* name) mi_attr_noexcept;
572-
mi_decl_nodiscard mi_decl_export mi_decl_restrict wchar_t* mi_wcsdup(const wchar_t* s) mi_attr_noexcept mi_attr_malloc;
573-
mi_decl_nodiscard mi_decl_export mi_decl_restrict unsigned char* mi_mbsdup(const unsigned char* s) mi_attr_noexcept mi_attr_malloc;
576+
// MSVC
577+
mi_decl_export void* mi__expand(void* p, size_t newsize) mi_attr_noexcept;
578+
mi_decl_export int mi_dupenv_s(char** buf, size_t* size, const char* name) mi_attr_noexcept;
579+
mi_decl_export int mi_wdupenv_s(wchar_t** buf, size_t* size, const wchar_t* name) mi_attr_noexcept;
580+
mi_decl_nodiscard mi_decl_export mi_decl_restrict wchar_t* mi_wcsdup(const wchar_t* s) mi_attr_noexcept mi_attr_malloc;
581+
mi_decl_nodiscard mi_decl_export mi_decl_restrict unsigned char* mi_mbsdup(const unsigned char* s) mi_attr_noexcept mi_attr_malloc;
574582

575583
// --------------------------------------------------------
576584
// C++ wrappers
@@ -684,8 +692,8 @@ template<class T> struct _mi_stl_allocator_common {
684692
using propagate_on_container_copy_assignment = std::true_type;
685693
using propagate_on_container_move_assignment = std::true_type;
686694
using propagate_on_container_swap = std::true_type;
687-
template <class U, class ...Args> void construct(U* p, Args&& ...args) { ::new(p) U(std::forward<Args>(args)...); }
688-
template <class U> void destroy(U* p) mi_attr_noexcept { p->~U(); }
695+
// no construct/destroy: std::allocator_traits provides them, and declaring them
696+
// disables the memmove/memset/trivial-destroy fast paths of the STL containers
689697
#else
690698
void construct(pointer p, value_type const& val) { ::new(p) value_type(val); }
691699
void destroy(pointer p) { p->~value_type(); }

0 commit comments

Comments
 (0)