mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-07-09 21:08:42 +03:00
Initial local deferred free impl
This commit is contained in:
parent
73c339235c
commit
f4d1ad552e
6 changed files with 55 additions and 5 deletions
|
@ -204,6 +204,8 @@ mi_heap_t* mi_heap_new(void) {
|
|||
// push on the thread local heaps list
|
||||
heap->next = heap->tld->heaps;
|
||||
heap->tld->heaps = heap;
|
||||
heap->deferred_free = NULL;
|
||||
heap->deferred_free_arg = NULL;
|
||||
return heap;
|
||||
}
|
||||
|
||||
|
@ -564,3 +566,9 @@ bool mi_heap_visit_blocks(const mi_heap_t* heap, bool visit_blocks, mi_block_vis
|
|||
mi_visit_blocks_args_t args = { visit_blocks, visitor, arg };
|
||||
return mi_heap_visit_areas(heap, &mi_heap_area_visitor, &args);
|
||||
}
|
||||
|
||||
|
||||
void mi_heap_register_deferred_free(mi_heap_t* heap,mi_local_deferred_free_fun* fun,void*arg) {
|
||||
heap->deferred_free = fun;
|
||||
heap->deferred_free_arg = arg;
|
||||
}
|
|
@ -99,7 +99,9 @@ mi_decl_cache_align const mi_heap_t _mi_heap_empty = {
|
|||
0, // page count
|
||||
MI_BIN_FULL, 0, // page retired min/max
|
||||
NULL, // next
|
||||
false
|
||||
false,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
// the thread-local default heap for allocation
|
||||
|
@ -130,7 +132,9 @@ mi_heap_t _mi_heap_main = {
|
|||
0, // page count
|
||||
MI_BIN_FULL, 0, // page retired min/max
|
||||
NULL, // next heap
|
||||
false // can reclaim
|
||||
false, // can reclaim
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
bool _mi_process_is_initialized = false; // set to `true` in `mi_process_init`.
|
||||
|
|
10
src/page.c
10
src/page.c
|
@ -737,9 +737,15 @@ static _Atomic(void*) deferred_arg; // = NULL
|
|||
|
||||
void _mi_deferred_free(mi_heap_t* heap, bool force) {
|
||||
heap->tld->heartbeat++;
|
||||
if (deferred_free != NULL && !heap->tld->recurse) {
|
||||
if (!heap->tld->recurse) {
|
||||
heap->tld->recurse = true;
|
||||
deferred_free(force, heap->tld->heartbeat, mi_atomic_load_ptr_relaxed(void,&deferred_arg));
|
||||
if (deferred_free != NULL) {
|
||||
deferred_free(force, heap->tld->heartbeat, mi_atomic_load_ptr_relaxed(void,&deferred_arg));
|
||||
}
|
||||
if (heap->deferred_free != NULL) {
|
||||
// TODO: Should heap->deferred_free_arg be an atomic load?
|
||||
(heap->deferred_free)(heap, force, heap->tld->heartbeat, heap->deferred_free_arg);
|
||||
}
|
||||
heap->tld->recurse = false;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue