rename must_free_whole -> has_partial_free

This commit is contained in:
Daan 2024-05-16 14:41:10 -07:00
parent 81a771161e
commit a38c8dd0f9
6 changed files with 10 additions and 12 deletions

View File

@ -26,7 +26,7 @@ typedef struct mi_os_mem_config_s {
size_t large_page_size; // 0 if not supported, usually 2MiB (4MiB on Windows) size_t large_page_size; // 0 if not supported, usually 2MiB (4MiB on Windows)
size_t alloc_granularity; // smallest allocation size (usually 4KiB, on Windows 64KiB) size_t alloc_granularity; // smallest allocation size (usually 4KiB, on Windows 64KiB)
bool has_overcommit; // can we reserve more memory than can be actually committed? bool has_overcommit; // can we reserve more memory than can be actually committed?
bool must_free_whole; // must allocated blocks be freed as a whole (false for mmap, true for VirtualAlloc) bool has_partial_free; // can allocated blocks be freed partially? (true for mmap, false for VirtualAlloc)
bool has_virtual_reserve; // supports virtual address space reservation? (if true we can reserve virtual address space without using commit or physical memory) bool has_virtual_reserve; // supports virtual address space reservation? (if true we can reserve virtual address space without using commit or physical memory)
} mi_os_mem_config_t; } mi_os_mem_config_t;

View File

@ -12,8 +12,6 @@ terms of the MIT license. A copy of the license can be found in the file
/* ----------------------------------------------------------- /* -----------------------------------------------------------
Initialization. Initialization.
On windows initializes support for aligned allocation and
large OS pages (if MIMALLOC_LARGE_OS_PAGES is true).
----------------------------------------------------------- */ ----------------------------------------------------------- */
static mi_os_mem_config_t mi_os_mem_config = { static mi_os_mem_config_t mi_os_mem_config = {
@ -21,7 +19,7 @@ static mi_os_mem_config_t mi_os_mem_config = {
0, // large page size (usually 2MiB) 0, // large page size (usually 2MiB)
4096, // allocation granularity 4096, // allocation granularity
true, // has overcommit? (if true we use MAP_NORESERVE on mmap systems) true, // has overcommit? (if true we use MAP_NORESERVE on mmap systems)
false, // must free whole? (on mmap systems we can free anywhere in a mapped range, but on Windows we must free the entire span) false, // can we partially free allocated blocks? (on mmap systems we can free anywhere in a mapped range, but on Windows we must free the entire span)
true // has virtual reserve? (if true we can reserve virtual address space without using commit or physical memory) true // has virtual reserve? (if true we can reserve virtual address space without using commit or physical memory)
}; };
@ -254,7 +252,7 @@ static void* mi_os_prim_alloc_aligned(size_t size, size_t alignment, bool commit
if (size >= (SIZE_MAX - alignment)) return NULL; // overflow if (size >= (SIZE_MAX - alignment)) return NULL; // overflow
const size_t over_size = size + alignment; const size_t over_size = size + alignment;
if (mi_os_mem_config.must_free_whole) { // win32 virtualAlloc cannot free parts of an allocate block if (!mi_os_mem_config.has_partial_free) { // win32 virtualAlloc cannot free parts of an allocated block
// over-allocate uncommitted (virtual) memory // over-allocate uncommitted (virtual) memory
p = mi_os_prim_alloc(over_size, 1 /*alignment*/, false /* commit? */, false /* allow_large */, is_large, is_zero, stats); p = mi_os_prim_alloc(over_size, 1 /*alignment*/, false /* commit? */, false /* allow_large */, is_large, is_zero, stats);
if (p == NULL) return NULL; if (p == NULL) return NULL;
@ -275,7 +273,7 @@ static void* mi_os_prim_alloc_aligned(size_t size, size_t alignment, bool commit
p = mi_os_prim_alloc(over_size, 1, commit, false, is_large, is_zero, stats); p = mi_os_prim_alloc(over_size, 1, commit, false, is_large, is_zero, stats);
if (p == NULL) return NULL; if (p == NULL) return NULL;
// and selectively unmap parts around the over-allocated area. (noop on sbrk) // and selectively unmap parts around the over-allocated area.
void* aligned_p = mi_align_up_ptr(p, alignment); void* aligned_p = mi_align_up_ptr(p, alignment);
size_t pre_size = (uint8_t*)aligned_p - (uint8_t*)p; size_t pre_size = (uint8_t*)aligned_p - (uint8_t*)p;
size_t mid_size = _mi_align_up(size, _mi_os_page_size()); size_t mid_size = _mi_align_up(size, _mi_os_page_size());
@ -283,7 +281,7 @@ static void* mi_os_prim_alloc_aligned(size_t size, size_t alignment, bool commit
mi_assert_internal(pre_size < over_size&& post_size < over_size&& mid_size >= size); mi_assert_internal(pre_size < over_size&& post_size < over_size&& mid_size >= size);
if (pre_size > 0) { mi_os_prim_free(p, pre_size, commit, stats); } if (pre_size > 0) { mi_os_prim_free(p, pre_size, commit, stats); }
if (post_size > 0) { mi_os_prim_free((uint8_t*)aligned_p + mid_size, post_size, commit, stats); } if (post_size > 0) { mi_os_prim_free((uint8_t*)aligned_p + mid_size, post_size, commit, stats); }
// we can return the aligned pointer on `mmap` (and sbrk) systems // we can return the aligned pointer on `mmap` systems
p = aligned_p; p = aligned_p;
*base = aligned_p; // since we freed the pre part, `*base == p`. *base = aligned_p; // since we freed the pre part, `*base == p`.
} }

View File

@ -51,7 +51,7 @@ void _mi_prim_mem_init( mi_os_mem_config_t* config) {
config->page_size = 64*MI_KiB; // WebAssembly has a fixed page size: 64KiB config->page_size = 64*MI_KiB; // WebAssembly has a fixed page size: 64KiB
config->alloc_granularity = 16; config->alloc_granularity = 16;
config->has_overcommit = false; config->has_overcommit = false;
config->must_free_whole = true; config->has_partial_free = false;
config->has_virtual_reserve = false; config->has_virtual_reserve = false;
} }

View File

@ -144,7 +144,7 @@ void _mi_prim_mem_init( mi_os_mem_config_t* config )
} }
config->large_page_size = 2*MI_MiB; // TODO: can we query the OS for this? config->large_page_size = 2*MI_MiB; // TODO: can we query the OS for this?
config->has_overcommit = unix_detect_overcommit(); config->has_overcommit = unix_detect_overcommit();
config->must_free_whole = false; // mmap can free in parts config->has_partial_free = true; // mmap can free in parts
config->has_virtual_reserve = true; // todo: check if this true for NetBSD? (for anonymous mmap with PROT_NONE) config->has_virtual_reserve = true; // todo: check if this true for NetBSD? (for anonymous mmap with PROT_NONE)
// disable transparent huge pages for this process? // disable transparent huge pages for this process?

View File

@ -23,7 +23,7 @@ void _mi_prim_mem_init( mi_os_mem_config_t* config ) {
config->page_size = 64*MI_KiB; // WebAssembly has a fixed page size: 64KiB config->page_size = 64*MI_KiB; // WebAssembly has a fixed page size: 64KiB
config->alloc_granularity = 16; config->alloc_granularity = 16;
config->has_overcommit = false; config->has_overcommit = false;
config->must_free_whole = true; config->has_partial_free = false;
config->has_virtual_reserve = false; config->has_virtual_reserve = false;
} }

View File

@ -112,7 +112,7 @@ static bool win_enable_large_os_pages(size_t* large_page_size)
void _mi_prim_mem_init( mi_os_mem_config_t* config ) void _mi_prim_mem_init( mi_os_mem_config_t* config )
{ {
config->has_overcommit = false; config->has_overcommit = false;
config->must_free_whole = true; config->has_partial_free = false;
config->has_virtual_reserve = true; config->has_virtual_reserve = true;
// get the page size // get the page size
SYSTEM_INFO si; SYSTEM_INFO si;