@@ -444,11 +444,11 @@ static void bucket_free_chunk(bucket_t *bucket, void *ptr, slab_t *slab,
444444 // remove slab
445445 slab_list_item_t * slab_it = & slab -> iter ;
446446 assert (slab_it -> val != NULL );
447- pool_unregister_slab ( bucket -> pool , slab_it -> val );
447+ destroy_slab ( slab_it -> val );
448448 DL_DELETE (bucket -> available_slabs , slab_it );
449449 assert (bucket -> available_slabs_num > 0 );
450450 bucket -> available_slabs_num -- ;
451- destroy_slab ( slab_it -> val );
451+ pool_unregister_slab ( bucket -> pool , slab_it -> val );
452452 }
453453 } else {
454454 // return this chunk to the pool
@@ -1133,6 +1133,43 @@ static umf_result_t disjoint_pool_get_name(void *pool, const char **name) {
11331133 return UMF_RESULT_SUCCESS ;
11341134}
11351135
1136+ umf_result_t disjoint_pool_trim_memory (void * pool , size_t minBytesToKeep ) {
1137+ assert (pool != NULL );
1138+ disjoint_pool_t * hPool = (disjoint_pool_t * )pool ;
1139+
1140+ for (size_t i = 0 ; i < hPool -> buckets_num ; i ++ ) {
1141+ bucket_t * bucket = hPool -> buckets [i ];
1142+ utils_mutex_lock (& bucket -> bucket_lock );
1143+
1144+ // remove empty slabs from the pool
1145+ slab_list_item_t * it = NULL , * tmp = NULL ;
1146+ LL_FOREACH_SAFE (bucket -> available_slabs , it , tmp ) {
1147+ slab_t * slab = it -> val ;
1148+ if (slab -> num_chunks_allocated == 0 ) {
1149+ if (minBytesToKeep >= slab -> slab_size ) {
1150+ // if we still have bytes to keep, do not remove slab
1151+ minBytesToKeep -= slab -> slab_size ;
1152+ continue ;
1153+ }
1154+
1155+ // remove slab
1156+ destroy_slab (slab );
1157+ DL_DELETE (bucket -> available_slabs , it );
1158+ assert (bucket -> available_slabs_num > 0 );
1159+ bucket -> available_slabs_num -- ;
1160+ pool_unregister_slab (hPool , slab );
1161+
1162+ // update stats
1163+ bucket_update_stats (bucket , 0 , -1 );
1164+ }
1165+ }
1166+
1167+ utils_mutex_unlock (& bucket -> bucket_lock );
1168+ }
1169+
1170+ return UMF_RESULT_SUCCESS ;
1171+ }
1172+
11361173static umf_memory_pool_ops_t UMF_DISJOINT_POOL_OPS = {
11371174 .version = UMF_POOL_OPS_VERSION_CURRENT ,
11381175 .initialize = disjoint_pool_initialize ,
@@ -1146,6 +1183,7 @@ static umf_memory_pool_ops_t UMF_DISJOINT_POOL_OPS = {
11461183 .get_last_allocation_error = disjoint_pool_get_last_allocation_error ,
11471184 .get_name = disjoint_pool_get_name ,
11481185 .ext_ctl = disjoint_pool_ctl ,
1186+ .ext_trim_memory = disjoint_pool_trim_memory ,
11491187};
11501188
11511189const umf_memory_pool_ops_t * umfDisjointPoolOps (void ) {
0 commit comments