mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-05 23:19:31 +03:00
split out _mi_page_try_use_delayed_free for contention reduction (issue #630)
This commit is contained in:
parent
7bef5f5f5b
commit
698bb2cae7
3 changed files with 10 additions and 3 deletions
|
@ -117,7 +117,8 @@ void _mi_heap_delayed_free_all(mi_heap_t* heap);
|
||||||
bool _mi_heap_delayed_free_partial(mi_heap_t* heap);
|
bool _mi_heap_delayed_free_partial(mi_heap_t* heap);
|
||||||
void _mi_heap_collect_retired(mi_heap_t* heap, bool force);
|
void _mi_heap_collect_retired(mi_heap_t* heap, bool force);
|
||||||
|
|
||||||
bool _mi_page_use_delayed_free(mi_page_t* page, mi_delayed_t delay, bool override_never);
|
void _mi_page_use_delayed_free(mi_page_t* page, mi_delayed_t delay, bool override_never);
|
||||||
|
bool _mi_page_try_use_delayed_free(mi_page_t* page, mi_delayed_t delay, bool override_never);
|
||||||
size_t _mi_page_queue_append(mi_heap_t* heap, mi_page_queue_t* pq, mi_page_queue_t* append);
|
size_t _mi_page_queue_append(mi_heap_t* heap, mi_page_queue_t* pq, mi_page_queue_t* append);
|
||||||
void _mi_deferred_free(mi_heap_t* heap, bool force);
|
void _mi_deferred_free(mi_heap_t* heap, bool force);
|
||||||
|
|
||||||
|
|
|
@ -531,7 +531,7 @@ bool _mi_free_delayed_block(mi_block_t* block) {
|
||||||
// some blocks may end up in the page `thread_free` list with no blocks in the
|
// some blocks may end up in the page `thread_free` list with no blocks in the
|
||||||
// heap `thread_delayed_free` list which may cause the page to be never freed!
|
// heap `thread_delayed_free` list which may cause the page to be never freed!
|
||||||
// (it would only be freed if we happen to scan it in `mi_page_queue_find_free_ex`)
|
// (it would only be freed if we happen to scan it in `mi_page_queue_find_free_ex`)
|
||||||
if (!_mi_page_use_delayed_free(page, MI_USE_DELAYED_FREE, false /* dont overwrite never delayed */)) {
|
if (!_mi_page_try_use_delayed_free(page, MI_USE_DELAYED_FREE, false /* dont overwrite never delayed */)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -122,7 +122,13 @@ bool _mi_page_is_valid(mi_page_t* page) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool _mi_page_use_delayed_free(mi_page_t* page, mi_delayed_t delay, bool override_never) {
|
void _mi_page_use_delayed_free(mi_page_t* page, mi_delayed_t delay, bool override_never) {
|
||||||
|
while (!_mi_page_try_use_delayed_free(page, delay, override_never)) {
|
||||||
|
mi_atomic_yield();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool _mi_page_try_use_delayed_free(mi_page_t* page, mi_delayed_t delay, bool override_never) {
|
||||||
mi_thread_free_t tfreex;
|
mi_thread_free_t tfreex;
|
||||||
mi_delayed_t old_delay;
|
mi_delayed_t old_delay;
|
||||||
mi_thread_free_t tfree;
|
mi_thread_free_t tfree;
|
||||||
|
|
Loading…
Add table
Reference in a new issue