diff options
-rw-r--r-- | mymalloc.h | 29 |
1 files changed, 18 insertions, 11 deletions
@@ -150,23 +150,30 @@ static void remote_free_finish(mstate ms) int malloc_trim(size_t pad) { - mstate ms = ms_tsd; + mstate m; + int ret = 0; CHECK(int, 0, pthread_mutex_lock(&global_mtx)); - { /* be lazy for sibling threads, readers are not synchronized */ - mstate m; - cds_list_for_each_entry(m, &arenas_unused, arena_node) - uatomic_set(&m->trim_check, 0); - cds_list_for_each_entry(m, &arenas_active, arena_node) - uatomic_set(&m->trim_check, 0); + + /* be lazy for active sibling threads, readers are not synchronized */ + cds_list_for_each_entry(m, &arenas_active, arena_node) + uatomic_set(&m->trim_check, 0); + + /* nobody is using idle arenas, clean immediately */ + cds_list_for_each_entry(m, &arenas_unused, arena_node) { + m->trim_check = 0; + remote_free_finish(m); + ret |= sys_trim(m, pad); } + CHECK(int, 0, pthread_mutex_unlock(&global_mtx)); - if (ms) { /* trim our own arena immediately */ - remote_free_finish(ms); - return sys_trim(ms, pad); + m = ms_tsd; + if (m) { /* trim our own arena immediately */ + remote_free_finish(m); + ret |= sys_trim(m, pad); } - return 0; + return ret; } static void remote_free_enqueue(mstate fm, void *mem) |