@@ -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,46 @@ 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+ // tracking the number of bytes left to keep
1141+ int bytesLeftToKeep = (int )minBytesToKeep ;
1142+
1143+ for (size_t i = 0 ; i < hPool -> buckets_num ; i ++ ) {
1144+ bucket_t * bucket = hPool -> buckets [i ];
1145+ utils_mutex_lock (& bucket -> bucket_lock );
1146+
1147+ // remove empty slabs from the pool
1148+ slab_list_item_t * it = NULL , * tmp = NULL ;
1149+ LL_FOREACH_SAFE (bucket -> available_slabs , it , tmp ) {
1150+ slab_t * slab = it -> val ;
1151+ if (slab -> num_chunks_allocated == 0 ) {
1152+ if (bytesLeftToKeep > 0 ) {
1153+ // if we still have bytes to keep, do not remove slab
1154+ bytesLeftToKeep -= (int )slab -> slab_size ;
1155+ continue ;
1156+ }
1157+
1158+ // remove slab
1159+ destroy_slab (slab );
1160+ DL_DELETE (bucket -> available_slabs , it );
1161+ assert (bucket -> available_slabs_num > 0 );
1162+ bucket -> available_slabs_num -- ;
1163+ pool_unregister_slab (hPool , slab );
1164+
1165+ // update stats
1166+ bucket_update_stats (bucket , 0 , -1 );
1167+ }
1168+ }
1169+
1170+ utils_mutex_unlock (& bucket -> bucket_lock );
1171+ }
1172+
1173+ return UMF_RESULT_SUCCESS ;
1174+ }
1175+
11361176static umf_memory_pool_ops_t UMF_DISJOINT_POOL_OPS = {
11371177 .version = UMF_POOL_OPS_VERSION_CURRENT ,
11381178 .initialize = disjoint_pool_initialize ,
@@ -1146,6 +1186,7 @@ static umf_memory_pool_ops_t UMF_DISJOINT_POOL_OPS = {
11461186 .get_last_allocation_error = disjoint_pool_get_last_allocation_error ,
11471187 .get_name = disjoint_pool_get_name ,
11481188 .ext_ctl = disjoint_pool_ctl ,
1189+ .ext_trim_memory = disjoint_pool_trim_memory ,
11491190};
11501191
11511192const umf_memory_pool_ops_t * umfDisjointPoolOps (void ) {
0 commit comments