@@ -1031,6 +1031,47 @@ const char *disjoint_pool_get_name(void *pool) {
10311031 return hPool -> params .name ;
10321032}
10331033
1034+ umf_result_t disjoint_pool_trim_memory (void * pool , size_t minBytesToKeep ) {
1035+ disjoint_pool_t * hPool = (disjoint_pool_t * )pool ;
1036+ if (hPool == NULL ) {
1037+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
1038+ }
1039+
1040+ for (size_t i = 0 ; i < hPool -> buckets_num ; i ++ ) {
1041+ bucket_t * bucket = hPool -> buckets [i ];
1042+ utils_mutex_lock (& bucket -> bucket_lock );
1043+
1044+ int skip = (int )minBytesToKeep ;
1045+
1046+ // remove empty slabs from the pool
1047+ slab_list_item_t * it = NULL , * tmp = NULL ;
1048+ LL_FOREACH_SAFE (bucket -> available_slabs , it , tmp ) {
1049+ slab_t * slab = it -> val ;
1050+ if (slab -> num_chunks_allocated == 0 ) {
1051+ // skip first minBytesToKeep bytes from each bucket
1052+ if (skip > 0 ) {
1053+ skip -= (int )slab -> slab_size ;
1054+ continue ;
1055+ }
1056+
1057+ // remove slab
1058+ pool_unregister_slab (hPool , slab );
1059+ DL_DELETE (bucket -> available_slabs , it );
1060+ assert (bucket -> available_slabs_num > 0 );
1061+ bucket -> available_slabs_num -- ;
1062+ destroy_slab (slab );
1063+
1064+ // update stats
1065+ bucket_update_stats (bucket , 0 , -1 );
1066+ }
1067+ }
1068+
1069+ utils_mutex_unlock (& bucket -> bucket_lock );
1070+ }
1071+
1072+ return UMF_RESULT_SUCCESS ;
1073+ }
1074+
10341075static umf_memory_pool_ops_t UMF_DISJOINT_POOL_OPS = {
10351076 .version = UMF_VERSION_CURRENT ,
10361077 .initialize = disjoint_pool_initialize ,
@@ -1044,6 +1085,7 @@ static umf_memory_pool_ops_t UMF_DISJOINT_POOL_OPS = {
10441085 .get_last_allocation_error = disjoint_pool_get_last_allocation_error ,
10451086 .ext_get_name = disjoint_pool_get_name ,
10461087 .ext_ctl = disjoint_pool_ctl ,
1088+ .trim_memory = disjoint_pool_trim_memory ,
10471089};
10481090
10491091const umf_memory_pool_ops_t * umfDisjointPoolOps (void ) {
0 commit comments