Skip to content

Commit 584dfb2

Browse files
authored
Merge pull request #380 from igchor/fix_rec_tracking2
Add runtime option to disable pool tracking per-pool and disable pool tracking for Proxy_pool
2 parents 3ff9eac + 68c667c commit 584dfb2

File tree

7 files changed

+121
-195
lines changed

7 files changed

+121
-195
lines changed

include/umf/memory_pool.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ typedef enum umf_pool_create_flag_t {
3535
UMF_POOL_CREATE_FLAG_OWN_PROVIDER =
3636
(1
3737
<< 0), ///< Pool will own the specified provider and destroy it in umfPoolDestroy
38+
UMF_POOL_CREATE_FLAG_DISABLE_TRACKING =
39+
(1 << 1), ///< Pool will not track memory allocations
3840
/// @cond
3941
UMF_POOL_CREATE_FLAG_FORCE_UINT32 = 0x7fffffff
4042
/// @endcond

src/CMakeLists.txt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,16 +118,15 @@ else()
118118
LIBS ${UMF_LIBS})
119119
endif()
120120

121+
if(UMF_ENABLE_POOL_TRACKING)
122+
set(UMF_PUBLIC_COMPILE_DEFINITIONS ${UMF_PUBLIC_COMPILE_DEFINITIONS}
123+
"UMF_ENABLE_POOL_TRACKING")
124+
endif()
125+
121126
target_link_directories(umf PRIVATE ${UMF_PRIVATE_LIBRARY_DIRS})
122127

123128
target_compile_definitions(umf PUBLIC ${UMF_PUBLIC_COMPILE_DEFINITIONS})
124129

125-
if(UMF_ENABLE_POOL_TRACKING)
126-
target_sources(umf PRIVATE memory_pool_tracking.c)
127-
else()
128-
target_sources(umf PRIVATE memory_pool_default.c)
129-
endif()
130-
131130
if(UMF_BUILD_LEVEL_ZERO_PROVIDER)
132131
target_sources(umf PRIVATE provider/provider_level_zero.c)
133132

src/memory_pool.c

Lines changed: 110 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,125 @@
1717
#include <assert.h>
1818
#include <stdlib.h>
1919

20+
#include "base_alloc_global.h"
21+
#include "memory_pool_internal.h"
22+
#include "memory_provider_internal.h"
23+
#include "provider_tracking.h"
24+
25+
static umf_result_t umfPoolCreateInternal(const umf_memory_pool_ops_t *ops,
26+
umf_memory_provider_handle_t provider,
27+
void *params,
28+
umf_pool_create_flags_t flags,
29+
umf_memory_pool_handle_t *hPool) {
30+
if (!ops || !provider || !hPool) {
31+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
32+
}
33+
34+
umf_result_t ret = UMF_RESULT_SUCCESS;
35+
umf_memory_pool_handle_t pool =
36+
umf_ba_global_alloc(sizeof(umf_memory_pool_t));
37+
if (!pool) {
38+
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
39+
}
40+
41+
assert(ops->version == UMF_VERSION_CURRENT);
42+
43+
if (!(flags & UMF_POOL_CREATE_FLAG_DISABLE_TRACKING)) {
44+
// wrap provider with memory tracking provider
45+
ret = umfTrackingMemoryProviderCreate(provider, pool, &pool->provider);
46+
if (ret != UMF_RESULT_SUCCESS) {
47+
goto err_provider_create;
48+
}
49+
} else {
50+
pool->provider = provider;
51+
}
52+
53+
pool->flags = flags;
54+
pool->ops = *ops;
55+
56+
ret = ops->initialize(pool->provider, params, &pool->pool_priv);
57+
if (ret != UMF_RESULT_SUCCESS) {
58+
goto err_pool_init;
59+
}
60+
61+
*hPool = pool;
62+
return UMF_RESULT_SUCCESS;
63+
64+
err_pool_init:
65+
if (!(flags & UMF_POOL_CREATE_FLAG_DISABLE_TRACKING)) {
66+
umfMemoryProviderDestroy(pool->provider);
67+
}
68+
err_provider_create:
69+
umf_ba_global_free(pool);
70+
return ret;
71+
}
72+
73+
void umfPoolDestroy(umf_memory_pool_handle_t hPool) {
74+
hPool->ops.finalize(hPool->pool_priv);
75+
if (hPool->flags & UMF_POOL_CREATE_FLAG_OWN_PROVIDER) {
76+
// Destroy associated memory provider.
77+
umf_memory_provider_handle_t hProvider = NULL;
78+
umfPoolGetMemoryProvider(hPool, &hProvider);
79+
umfMemoryProviderDestroy(hProvider);
80+
}
81+
82+
if (!(hPool->flags & UMF_POOL_CREATE_FLAG_DISABLE_TRACKING)) {
83+
// Destroy tracking provider.
84+
umfMemoryProviderDestroy(hPool->provider);
85+
}
86+
// TODO: this free keeps memory in base allocator, so it can lead to OOM in some scenarios (it should be optimized)
87+
umf_ba_global_free(hPool);
88+
}
89+
90+
umf_result_t umfFree(void *ptr) {
91+
#ifndef UMF_ENABLE_POOL_TRACKING
92+
return UMF_RESULT_ERROR_NOT_SUPPORTED;
93+
#endif
94+
95+
umf_memory_pool_handle_t hPool = umfPoolByPtr(ptr);
96+
if (hPool) {
97+
return umfPoolFree(hPool, ptr);
98+
}
99+
return UMF_RESULT_SUCCESS;
100+
}
101+
102+
umf_memory_pool_handle_t umfPoolByPtr(const void *ptr) {
103+
return umfMemoryTrackerGetPool(ptr);
104+
}
105+
106+
umf_result_t umfPoolGetMemoryProvider(umf_memory_pool_handle_t hPool,
107+
umf_memory_provider_handle_t *hProvider) {
108+
if (!hProvider) {
109+
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
110+
}
111+
112+
if (hPool->flags & UMF_POOL_CREATE_FLAG_DISABLE_TRACKING) {
113+
*hProvider = hPool->provider;
114+
} else {
115+
umfTrackingMemoryProviderGetUpstreamProvider(
116+
umfMemoryProviderGetPriv(hPool->provider), hProvider);
117+
}
118+
119+
return UMF_RESULT_SUCCESS;
120+
}
121+
20122
umf_result_t umfPoolCreate(const umf_memory_pool_ops_t *ops,
21123
umf_memory_provider_handle_t provider, void *params,
22124
umf_pool_create_flags_t flags,
23125
umf_memory_pool_handle_t *hPool) {
24126
libumfInit();
25-
umf_result_t ret = umfPoolCreateInternal(ops, provider, params, hPool);
127+
128+
#ifndef UMF_ENABLE_POOL_TRACKING
129+
// if tracking is not enabled during compilation, disable it for each pool here as well
130+
flags |= UMF_POOL_CREATE_FLAG_DISABLE_TRACKING;
131+
#endif
132+
133+
umf_result_t ret =
134+
umfPoolCreateInternal(ops, provider, params, flags, hPool);
26135
if (ret != UMF_RESULT_SUCCESS) {
27136
return ret;
28137
}
29138
assert(*hPool != NULL);
30-
(*hPool)->own_provider = (flags & UMF_POOL_CREATE_FLAG_OWN_PROVIDER);
31139

32140
return UMF_RESULT_SUCCESS;
33141
}

src/memory_pool_default.c

Lines changed: 0 additions & 81 deletions
This file was deleted.

src/memory_pool_internal.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,12 @@ extern "C" {
2626
typedef struct umf_memory_pool_t {
2727
void *pool_priv;
2828
umf_memory_pool_ops_t ops;
29+
umf_pool_create_flags_t flags;
2930

3031
// Memory provider used by the pool.
3132
umf_memory_provider_handle_t provider;
32-
// Tells whether memory provider is owned by the pool.
33-
bool own_provider;
3433
} umf_memory_pool_t;
3534

36-
umf_result_t umfPoolCreateInternal(const umf_memory_pool_ops_t *ops,
37-
umf_memory_provider_handle_t provider,
38-
void *params,
39-
umf_memory_pool_handle_t *hPool);
40-
4135
#ifdef __cplusplus
4236
}
4337
#endif

src/memory_pool_tracking.c

Lines changed: 0 additions & 97 deletions
This file was deleted.

src/proxy_lib/proxy_lib.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,9 @@ void proxy_lib_create_common(void) {
107107
exit(-1);
108108
}
109109

110-
umf_result = umfPoolCreate(umfPoolManagerOps(), OS_memory_provider, NULL, 0,
111-
&Proxy_pool);
110+
umf_result =
111+
umfPoolCreate(umfPoolManagerOps(), OS_memory_provider, NULL,
112+
UMF_POOL_CREATE_FLAG_DISABLE_TRACKING, &Proxy_pool);
112113
if (umf_result != UMF_RESULT_SUCCESS) {
113114
fprintf(stderr, "error: creating UMF pool manager failed\n");
114115
exit(-1);

0 commit comments

Comments
 (0)