mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-06 23:39:31 +03:00
merge from dev
This commit is contained in:
commit
10aca1cfb9
1 changed files with 6 additions and 2 deletions
|
@ -23,20 +23,22 @@ terms of the MIT license. A copy of the license can be found in the file
|
||||||
// Fall back to generic allocation only if the list is empty.
|
// Fall back to generic allocation only if the list is empty.
|
||||||
extern inline void* _mi_page_malloc(mi_heap_t* heap, mi_page_t* page, size_t size) mi_attr_noexcept {
|
extern inline void* _mi_page_malloc(mi_heap_t* heap, mi_page_t* page, size_t size) mi_attr_noexcept {
|
||||||
mi_assert_internal(page->xblock_size==0||mi_page_block_size(page) >= size);
|
mi_assert_internal(page->xblock_size==0||mi_page_block_size(page) >= size);
|
||||||
mi_block_t* block = page->free;
|
mi_block_t* const block = page->free;
|
||||||
if (mi_unlikely(block == NULL)) {
|
if (mi_unlikely(block == NULL)) {
|
||||||
return _mi_malloc_generic(heap, size);
|
return _mi_malloc_generic(heap, size);
|
||||||
}
|
}
|
||||||
mi_assert_internal(block != NULL && _mi_ptr_page(block) == page);
|
mi_assert_internal(block != NULL && _mi_ptr_page(block) == page);
|
||||||
// pop from the free list
|
// pop from the free list
|
||||||
page->free = mi_block_next(page, block);
|
|
||||||
page->used++;
|
page->used++;
|
||||||
|
page->free = mi_block_next(page, block);
|
||||||
mi_assert_internal(page->free == NULL || _mi_ptr_page(page->free) == page);
|
mi_assert_internal(page->free == NULL || _mi_ptr_page(page->free) == page);
|
||||||
|
|
||||||
#if (MI_DEBUG>0)
|
#if (MI_DEBUG>0)
|
||||||
if (!page->is_zero) { memset(block, MI_DEBUG_UNINIT, size); }
|
if (!page->is_zero) { memset(block, MI_DEBUG_UNINIT, size); }
|
||||||
#elif (MI_SECURE!=0)
|
#elif (MI_SECURE!=0)
|
||||||
block->next = 0; // don't leak internal data
|
block->next = 0; // don't leak internal data
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (MI_STAT>1)
|
#if (MI_STAT>1)
|
||||||
const size_t bsize = mi_page_usable_block_size(page);
|
const size_t bsize = mi_page_usable_block_size(page);
|
||||||
if (bsize <= MI_LARGE_OBJ_SIZE_MAX) {
|
if (bsize <= MI_LARGE_OBJ_SIZE_MAX) {
|
||||||
|
@ -44,6 +46,7 @@ extern inline void* _mi_page_malloc(mi_heap_t* heap, mi_page_t* page, size_t siz
|
||||||
mi_heap_stat_increase(heap, normal[bin], 1);
|
mi_heap_stat_increase(heap, normal[bin], 1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (MI_PADDING > 0) && defined(MI_ENCODE_FREELIST)
|
#if (MI_PADDING > 0) && defined(MI_ENCODE_FREELIST)
|
||||||
mi_padding_t* const padding = (mi_padding_t*)((uint8_t*)block + mi_page_usable_block_size(page));
|
mi_padding_t* const padding = (mi_padding_t*)((uint8_t*)block + mi_page_usable_block_size(page));
|
||||||
ptrdiff_t delta = ((uint8_t*)padding - (uint8_t*)block - (size - MI_PADDING_SIZE));
|
ptrdiff_t delta = ((uint8_t*)padding - (uint8_t*)block - (size - MI_PADDING_SIZE));
|
||||||
|
@ -54,6 +57,7 @@ extern inline void* _mi_page_malloc(mi_heap_t* heap, mi_page_t* page, size_t siz
|
||||||
const size_t maxpad = (delta > MI_MAX_ALIGN_SIZE ? MI_MAX_ALIGN_SIZE : delta); // set at most N initial padding bytes
|
const size_t maxpad = (delta > MI_MAX_ALIGN_SIZE ? MI_MAX_ALIGN_SIZE : delta); // set at most N initial padding bytes
|
||||||
for (size_t i = 0; i < maxpad; i++) { fill[i] = MI_DEBUG_PADDING; }
|
for (size_t i = 0; i < maxpad; i++) { fill[i] = MI_DEBUG_PADDING; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue