@@ -31,6 +31,18 @@ static umf_result_t umfPoolCreateInternal(const umf_memory_pool_ops_t *ops,
3131 return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
3232 }
3333
34+ if ((flags & UMF_POOL_CREATE_FLAG_DISABLE_TRACKING ) &&
35+ (flags & UMF_POOL_CREATE_FLAG_PROXY_POOL )) {
36+ // setting both flags is invalid
37+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
38+ }
39+
40+ if (flags == UMF_POOL_CREATE_FLAG_PROXY_POOL && params == NULL ) {
41+ // if UMF_POOL_CREATE_FLAG_PROXY_POOL flag is set the valid tracker
42+ // should be passed in params
43+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
44+ }
45+
3446 umf_result_t ret = UMF_RESULT_SUCCESS ;
3547 umf_memory_pool_handle_t pool =
3648 umf_ba_global_alloc (sizeof (umf_memory_pool_t ));
@@ -40,12 +52,25 @@ static umf_result_t umfPoolCreateInternal(const umf_memory_pool_ops_t *ops,
4052
4153 assert (ops -> version == UMF_VERSION_CURRENT );
4254
55+ umf_memory_tracker_handle_t tracker = NULL ;
56+ if (flags == UMF_POOL_CREATE_FLAG_PROXY_POOL ) {
57+ // if UMF_POOL_CREATE_FLAG_PROXY_POOL is set use the tracker from
58+ // params
59+ tracker = params ;
60+ }
61+
4362 if (!(flags & UMF_POOL_CREATE_FLAG_DISABLE_TRACKING )) {
44- // Wrap provider with memory tracking provider.
63+ // Wrap provider with memory tracking provider
64+ if (tracker == NULL ) {
65+ // if UMF_POOL_CREATE_FLAG_PROXY_POOL is disabled use the default
66+ // tracker
67+ tracker = umfMemoryTrackerGet ();
68+ }
69+
4570 // Check if the provider supports the free() operation.
4671 bool upstreamDoesNotFree = umfIsFreeOpDefault (provider );
4772 ret = umfTrackingMemoryProviderCreate (provider , pool , & pool -> provider ,
48- upstreamDoesNotFree );
73+ tracker , upstreamDoesNotFree );
4974 if (ret != UMF_RESULT_SUCCESS ) {
5075 goto err_provider_create ;
5176 }
0 commit comments