@@ -31,6 +31,21 @@ static umf_result_t umfPoolCreateInternal(const umf_memory_pool_ops_t *ops,
3131 return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
3232 }
3333
34+ // NOTE: UMF_POOL_CREATE_FLAG_RESERVED is used when we want to create a
35+ // pool with non-default tracker (passed in params)
36+
37+ if ((flags & UMF_POOL_CREATE_FLAG_DISABLE_TRACKING ) &&
38+ (flags & UMF_POOL_CREATE_FLAG_RESERVED )) {
39+ // setting both flags is invalid
40+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
41+ }
42+
43+ if (flags == UMF_POOL_CREATE_FLAG_RESERVED && params == NULL ) {
44+ // if UMF_POOL_CREATE_FLAG_RESERVED flag is set the valid tracker
45+ // should be passed in params
46+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
47+ }
48+
3449 umf_result_t ret = UMF_RESULT_SUCCESS ;
3550 umf_memory_pool_handle_t pool =
3651 umf_ba_global_alloc (sizeof (umf_memory_pool_t ));
@@ -40,12 +55,24 @@ static umf_result_t umfPoolCreateInternal(const umf_memory_pool_ops_t *ops,
4055
4156 assert (ops -> version == UMF_VERSION_CURRENT );
4257
58+ umf_memory_tracker_handle_t tracker = NULL ;
59+ if (flags == UMF_POOL_CREATE_FLAG_RESERVED ) {
60+ // if UMF_POOL_CREATE_FLAG_RESERVED is set use the tracker from params
61+ tracker = params ;
62+ }
63+
4364 if (!(flags & UMF_POOL_CREATE_FLAG_DISABLE_TRACKING )) {
44- // Wrap provider with memory tracking provider.
65+ // Wrap provider with memory tracking provider
66+ if (tracker == NULL ) {
67+ // if UMF_POOL_CREATE_FLAG_PROXY_POOL is disabled use the default
68+ // tracker
69+ tracker = umfMemoryTrackerGet ();
70+ }
71+
4572 // Check if the provider supports the free() operation.
4673 bool upstreamDoesNotFree = umfIsFreeOpDefault (provider );
4774 ret = umfTrackingMemoryProviderCreate (provider , pool , & pool -> provider ,
48- upstreamDoesNotFree );
75+ tracker , upstreamDoesNotFree );
4976 if (ret != UMF_RESULT_SUCCESS ) {
5077 goto err_provider_create ;
5178 }
0 commit comments