mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-05 23:19:31 +03:00
merge from dev
This commit is contained in:
commit
6ccfb5a93e
2 changed files with 15 additions and 13 deletions
|
@ -10,7 +10,7 @@ option(MI_SEE_ASM "Generate assembly files" OFF)
|
||||||
option(MI_CHECK_FULL "Use full internal invariant checking in DEBUG mode" OFF)
|
option(MI_CHECK_FULL "Use full internal invariant checking in DEBUG mode" OFF)
|
||||||
option(MI_USE_CXX "Use the C++ compiler to compile the library" OFF)
|
option(MI_USE_CXX "Use the C++ compiler to compile the library" OFF)
|
||||||
option(MI_SECURE "Use security mitigations (like guard pages and randomization)" OFF)
|
option(MI_SECURE "Use security mitigations (like guard pages and randomization)" OFF)
|
||||||
option(MI_SECURE_FULL "Use full security mitigations (like double free protection, more expensive)" OFF)
|
option(MI_SECURE_FULL "Use full security mitigations, may be more expensive (includes double-free mitigation)" OFF)
|
||||||
option(MI_LOCAL_DYNAMIC_TLS "Use slightly slower, dlopen-compatible TLS mechanism (Unix)" OFF)
|
option(MI_LOCAL_DYNAMIC_TLS "Use slightly slower, dlopen-compatible TLS mechanism (Unix)" OFF)
|
||||||
option(MI_BUILD_TESTS "Build test executables" ON)
|
option(MI_BUILD_TESTS "Build test executables" ON)
|
||||||
|
|
||||||
|
@ -72,8 +72,9 @@ if(MI_OVERRIDE MATCHES "ON")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(MI_SECURE_FULL MATCHES "ON")
|
if(MI_SECURE_FULL MATCHES "ON")
|
||||||
message(STATUS "Set full secure build (experimental) (MI_SECURE_FULL=ON)")
|
message(STATUS "Set full secure build (may be more expensive) (MI_SECURE_FULL=ON)")
|
||||||
list(APPEND mi_defines MI_SECURE=4)
|
list(APPEND mi_defines MI_SECURE=4)
|
||||||
|
set(MI_SECURE "ON")
|
||||||
else()
|
else()
|
||||||
if(MI_SECURE MATCHES "ON")
|
if(MI_SECURE MATCHES "ON")
|
||||||
message(STATUS "Set secure build (MI_SECURE=ON)")
|
message(STATUS "Set secure build (MI_SECURE=ON)")
|
||||||
|
|
23
src/page.c
23
src/page.c
|
@ -439,15 +439,15 @@ void _mi_page_retire(mi_page_t* page) {
|
||||||
#define MI_MAX_SLICES (1UL << MI_MAX_SLICE_SHIFT)
|
#define MI_MAX_SLICES (1UL << MI_MAX_SLICE_SHIFT)
|
||||||
#define MI_MIN_SLICES (2)
|
#define MI_MIN_SLICES (2)
|
||||||
|
|
||||||
static void mi_page_free_list_extend_secure(mi_heap_t* heap, mi_page_t* page, size_t extend, mi_stats_t* stats) {
|
static void mi_page_free_list_extend_secure(mi_heap_t* const heap, mi_page_t* const page, const size_t extend, mi_stats_t* const stats) {
|
||||||
UNUSED(stats);
|
UNUSED(stats);
|
||||||
#if (MI_SECURE<=2)
|
#if (MI_SECURE<=2)
|
||||||
mi_assert_internal(page->free == NULL);
|
mi_assert_internal(page->free == NULL);
|
||||||
mi_assert_internal(page->local_free == NULL);
|
mi_assert_internal(page->local_free == NULL);
|
||||||
#endif
|
#endif
|
||||||
mi_assert_internal(page->capacity + extend <= page->reserved);
|
mi_assert_internal(page->capacity + extend <= page->reserved);
|
||||||
void* page_area = _mi_page_start(_mi_page_segment(page), page, NULL);
|
void* const page_area = _mi_page_start(_mi_page_segment(page), page, NULL);
|
||||||
size_t bsize = page->block_size;
|
const size_t bsize = page->block_size;
|
||||||
|
|
||||||
// initialize a randomized free list
|
// initialize a randomized free list
|
||||||
// set up `slice_count` slices to alternate between
|
// set up `slice_count` slices to alternate between
|
||||||
|
@ -475,7 +475,7 @@ static void mi_page_free_list_extend_secure(mi_heap_t* heap, mi_page_t* page, si
|
||||||
uintptr_t rnd = heap->random;
|
uintptr_t rnd = heap->random;
|
||||||
for (size_t i = 1; i < extend; i++) {
|
for (size_t i = 1; i < extend; i++) {
|
||||||
// call random_shuffle only every INTPTR_SIZE rounds
|
// call random_shuffle only every INTPTR_SIZE rounds
|
||||||
size_t round = i%MI_INTPTR_SIZE;
|
const size_t round = i%MI_INTPTR_SIZE;
|
||||||
if (round == 0) rnd = _mi_random_shuffle(rnd);
|
if (round == 0) rnd = _mi_random_shuffle(rnd);
|
||||||
// select a random next slice index
|
// select a random next slice index
|
||||||
size_t next = ((rnd >> 8*round) & (slice_count-1));
|
size_t next = ((rnd >> 8*round) & (slice_count-1));
|
||||||
|
@ -485,7 +485,7 @@ static void mi_page_free_list_extend_secure(mi_heap_t* heap, mi_page_t* page, si
|
||||||
}
|
}
|
||||||
// and link the current block to it
|
// and link the current block to it
|
||||||
counts[next]--;
|
counts[next]--;
|
||||||
mi_block_t* block = blocks[current];
|
mi_block_t* const block = blocks[current];
|
||||||
blocks[current] = (mi_block_t*)((uint8_t*)block + bsize); // bump to the following block
|
blocks[current] = (mi_block_t*)((uint8_t*)block + bsize); // bump to the following block
|
||||||
mi_block_set_next(page, block, blocks[next]); // and set next; note: we may have `current == next`
|
mi_block_set_next(page, block, blocks[next]); // and set next; note: we may have `current == next`
|
||||||
current = next;
|
current = next;
|
||||||
|
@ -496,7 +496,7 @@ static void mi_page_free_list_extend_secure(mi_heap_t* heap, mi_page_t* page, si
|
||||||
heap->random = _mi_random_shuffle(rnd);
|
heap->random = _mi_random_shuffle(rnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static mi_decl_noinline void mi_page_free_list_extend( mi_page_t* page, size_t extend, mi_stats_t* stats)
|
static mi_decl_noinline void mi_page_free_list_extend( mi_page_t* const page, const size_t extend, mi_stats_t* const stats)
|
||||||
{
|
{
|
||||||
UNUSED(stats);
|
UNUSED(stats);
|
||||||
#if (MI_SECURE <= 2)
|
#if (MI_SECURE <= 2)
|
||||||
|
@ -504,19 +504,20 @@ static mi_decl_noinline void mi_page_free_list_extend( mi_page_t* page, size_t e
|
||||||
mi_assert_internal(page->local_free == NULL);
|
mi_assert_internal(page->local_free == NULL);
|
||||||
#endif
|
#endif
|
||||||
mi_assert_internal(page->capacity + extend <= page->reserved);
|
mi_assert_internal(page->capacity + extend <= page->reserved);
|
||||||
void* page_area = _mi_page_start(_mi_page_segment(page), page, NULL );
|
void* const page_area = _mi_page_start(_mi_page_segment(page), page, NULL );
|
||||||
size_t bsize = page->block_size;
|
const size_t bsize = page->block_size;
|
||||||
mi_block_t* start = mi_page_block_at(page, page_area, page->capacity);
|
mi_block_t* const start = mi_page_block_at(page, page_area, page->capacity);
|
||||||
|
|
||||||
// initialize a sequential free list
|
// initialize a sequential free list
|
||||||
mi_block_t* last = mi_page_block_at(page, page_area, page->capacity + extend - 1);
|
mi_block_t* const last = mi_page_block_at(page, page_area, page->capacity + extend - 1);
|
||||||
mi_block_t* block = start;
|
mi_block_t* block = start;
|
||||||
while(block <= last) {
|
while(block <= last) {
|
||||||
mi_block_t* next = (mi_block_t*)((uint8_t*)block + bsize);
|
mi_block_t* next = (mi_block_t*)((uint8_t*)block + bsize);
|
||||||
mi_block_set_next(page,block,next);
|
mi_block_set_next(page,block,next);
|
||||||
block = next;
|
block = next;
|
||||||
}
|
}
|
||||||
mi_block_set_next(page, last, NULL);
|
// prepend to free list (usually `NULL`)
|
||||||
|
mi_block_set_next(page, last, page->free);
|
||||||
page->free = start;
|
page->free = start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue