mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-07-06 19:38:41 +03:00
collect every N generic calls
This commit is contained in:
parent
4f1edad4fe
commit
58d13f6a4f
6 changed files with 27 additions and 7 deletions
|
@ -105,6 +105,7 @@ mi_decl_hidden mi_decl_cache_align const mi_heap_t _mi_heap_empty = {
|
|||
{ {0}, {0}, 0, true }, // random
|
||||
0, // page count
|
||||
MI_BIN_FULL, 0, // page retired min/max
|
||||
0, 0, // generic count
|
||||
NULL, // next
|
||||
false, // can reclaim
|
||||
0, // tag
|
||||
|
@ -147,6 +148,7 @@ mi_decl_cache_align mi_heap_t _mi_heap_main = {
|
|||
{ {0x846ca68b}, {0}, 0, true }, // random
|
||||
0, // page count
|
||||
MI_BIN_FULL, 0, // page retired min/max
|
||||
0, 0, // generic count
|
||||
NULL, // next heap
|
||||
false, // can reclaim
|
||||
0, // tag
|
||||
|
|
|
@ -162,6 +162,7 @@ static mi_option_desc_t options[_mi_option_last] =
|
|||
UNINIT, MI_OPTION(guarded_sample_rate)}, // 1 out of N allocations in the min/max range will be guarded (=4000)
|
||||
{ 0, UNINIT, MI_OPTION(guarded_sample_seed)},
|
||||
{ 0, UNINIT, MI_OPTION(target_segments_per_thread) }, // abandon segments beyond this point, or 0 to disable.
|
||||
{ 10000, UNINIT, MI_OPTION(generic_collect) }, // collect heaps every N (=10000) generic allocation calls
|
||||
};
|
||||
|
||||
static void mi_option_init(mi_option_desc_t* desc);
|
||||
|
|
20
src/page.c
20
src/page.c
|
@ -970,11 +970,23 @@ void* _mi_malloc_generic(mi_heap_t* heap, size_t size, bool zero, size_t huge_al
|
|||
}
|
||||
mi_assert_internal(mi_heap_is_initialized(heap));
|
||||
|
||||
// call potential deferred free routines
|
||||
_mi_deferred_free(heap, false);
|
||||
// do administrative tasks every N generic mallocs
|
||||
if mi_unlikely(++heap->generic_count >= 100) {
|
||||
heap->generic_collect_count += heap->generic_count;
|
||||
heap->generic_count = 0;
|
||||
// call potential deferred free routines
|
||||
_mi_deferred_free(heap, false);
|
||||
|
||||
// free delayed frees from other threads (but skip contended ones)
|
||||
_mi_heap_delayed_free_partial(heap);
|
||||
// free delayed frees from other threads (but skip contended ones)
|
||||
_mi_heap_delayed_free_partial(heap);
|
||||
|
||||
// collect every once in a while (10000 by default)
|
||||
const long generic_collect = mi_option_get_clamp(mi_option_generic_collect, 1, 1000000L);
|
||||
if (heap->generic_collect_count >= generic_collect) {
|
||||
heap->generic_collect_count = 0;
|
||||
mi_heap_collect(heap, false /* force? */);
|
||||
}
|
||||
}
|
||||
|
||||
// find (or allocate) a page of the right size
|
||||
mi_page_t* page = mi_find_page(heap, size, huge_alignment);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue