@@ -31,6 +31,21 @@ static umf_result_t umfPoolCreateInternal(const umf_memory_pool_ops_t *ops,
31
31
return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
32
32
}
33
33
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
+
34
49
umf_result_t ret = UMF_RESULT_SUCCESS ;
35
50
umf_memory_pool_handle_t pool =
36
51
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,
40
55
41
56
assert (ops -> version == UMF_VERSION_CURRENT );
42
57
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
+
43
64
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
+
45
72
// Check if the provider supports the free() operation.
46
73
bool upstreamDoesNotFree = umfIsFreeOpDefault (provider );
47
74
ret = umfTrackingMemoryProviderCreate (provider , pool , & pool -> provider ,
48
- upstreamDoesNotFree );
75
+ tracker , upstreamDoesNotFree );
49
76
if (ret != UMF_RESULT_SUCCESS ) {
50
77
goto err_provider_create ;
51
78
}
0 commit comments