mirror of
https://github.com/microsoft/mimalloc.git
synced 2024-12-26 21:04:27 +08:00
rename must_free_whole -> has_partial_free
This commit is contained in:
parent
81a771161e
commit
a38c8dd0f9
@ -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;
|
||||||
|
|
||||||
|
10
src/os.c
10
src/os.c
@ -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`.
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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?
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user