Skip to content

Commit 698bb2c

Browse files
committed
split out _mi_page_try_use_delayed_free for contention reduction (issue microsoft#630)
1 parent 7bef5f5 commit 698bb2c

File tree

3 files changed

+10
-3
lines changed

3 files changed

+10
-3
lines changed

include/mimalloc-internal.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ void _mi_heap_delayed_free_all(mi_heap_t* heap);
117117
bool _mi_heap_delayed_free_partial(mi_heap_t* heap);
118118
void _mi_heap_collect_retired(mi_heap_t* heap, bool force);
119119

120-
bool _mi_page_use_delayed_free(mi_page_t* page, mi_delayed_t delay, bool override_never);
120+
void _mi_page_use_delayed_free(mi_page_t* page, mi_delayed_t delay, bool override_never);
121+
bool _mi_page_try_use_delayed_free(mi_page_t* page, mi_delayed_t delay, bool override_never);
121122
size_t _mi_page_queue_append(mi_heap_t* heap, mi_page_queue_t* pq, mi_page_queue_t* append);
122123
void _mi_deferred_free(mi_heap_t* heap, bool force);
123124

src/alloc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,7 @@ bool _mi_free_delayed_block(mi_block_t* block) {
531531
// some blocks may end up in the page `thread_free` list with no blocks in the
532532
// heap `thread_delayed_free` list which may cause the page to be never freed!
533533
// (it would only be freed if we happen to scan it in `mi_page_queue_find_free_ex`)
534-
if (!_mi_page_use_delayed_free(page, MI_USE_DELAYED_FREE, false /* dont overwrite never delayed */)) {
534+
if (!_mi_page_try_use_delayed_free(page, MI_USE_DELAYED_FREE, false /* dont overwrite never delayed */)) {
535535
return false;
536536
}
537537

src/page.c

+7-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,13 @@ bool _mi_page_is_valid(mi_page_t* page) {
122122
}
123123
#endif
124124

125-
bool _mi_page_use_delayed_free(mi_page_t* page, mi_delayed_t delay, bool override_never) {
125+
void _mi_page_use_delayed_free(mi_page_t* page, mi_delayed_t delay, bool override_never) {
126+
while (!_mi_page_try_use_delayed_free(page, delay, override_never)) {
127+
mi_atomic_yield();
128+
}
129+
}
130+
131+
bool _mi_page_try_use_delayed_free(mi_page_t* page, mi_delayed_t delay, bool override_never) {
126132
mi_thread_free_t tfreex;
127133
mi_delayed_t old_delay;
128134
mi_thread_free_t tfree;

0 commit comments

Comments
 (0)