Skip to content

Commit 34197ef

Browse files
committed
Call check_if_tracker_is_empty() conditionally
Call check_if_tracker_is_empty() inside trackingFinalize() only if the provider supports the free() operation. Signed-off-by: Lukasz Dorau <[email protected]>
1 parent 9beff47 commit 34197ef

File tree

5 files changed

+23
-8
lines changed

5 files changed

+23
-8
lines changed

src/memory_pool.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,12 @@ static umf_result_t umfPoolCreateInternal(const umf_memory_pool_ops_t *ops,
4141
assert(ops->version == UMF_VERSION_CURRENT);
4242

4343
if (!(flags & UMF_POOL_CREATE_FLAG_DISABLE_TRACKING)) {
44-
// wrap provider with memory tracking provider
45-
ret = umfTrackingMemoryProviderCreate(provider, pool, &pool->provider);
44+
// Wrap provider with memory tracking provider.
45+
// Check if the provider supports the free() operation.
46+
bool upstreamFrees = (umfMemoryProviderFree(provider, NULL, 0) !=
47+
UMF_RESULT_ERROR_NOT_SUPPORTED);
48+
ret = umfTrackingMemoryProviderCreate(provider, pool, &pool->provider,
49+
upstreamFrees);
4650
if (ret != UMF_RESULT_SUCCESS) {
4751
goto err_provider_create;
4852
}

src/provider/provider_tracking.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ typedef struct umf_tracking_memory_provider_t {
141141
umf_memory_tracker_handle_t hTracker;
142142
umf_memory_pool_handle_t pool;
143143
critnib *ipcCache;
144+
// the upstream provider supports the free() operation
145+
bool upstreamFrees;
144146
} umf_tracking_memory_provider_t;
145147

146148
typedef struct umf_tracking_memory_provider_t umf_tracking_memory_provider_t;
@@ -434,7 +436,9 @@ static void trackingFinalize(void *provider) {
434436
(umf_tracking_memory_provider_t *)provider;
435437
critnib_delete(p->ipcCache);
436438
#ifndef NDEBUG
437-
check_if_tracker_is_empty(p->hTracker, p->pool);
439+
if (p->upstreamFrees) {
440+
check_if_tracker_is_empty(p->hTracker, p->pool);
441+
}
438442
#endif /* NDEBUG */
439443

440444
umf_ba_global_free(provider);
@@ -661,10 +665,11 @@ umf_memory_provider_ops_t UMF_TRACKING_MEMORY_PROVIDER_OPS = {
661665

662666
umf_result_t umfTrackingMemoryProviderCreate(
663667
umf_memory_provider_handle_t hUpstream, umf_memory_pool_handle_t hPool,
664-
umf_memory_provider_handle_t *hTrackingProvider) {
668+
umf_memory_provider_handle_t *hTrackingProvider, bool upstreamFrees) {
665669

666670
umf_tracking_memory_provider_t params;
667671
params.hUpstream = hUpstream;
672+
params.upstreamFrees = upstreamFrees;
668673
params.hTracker = TRACKER;
669674
if (!params.hTracker) {
670675
LOG_ERR("failed, TRACKER is NULL");

src/provider/provider_tracking.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#define UMF_MEMORY_TRACKER_INTERNAL_H 1
1212

1313
#include <assert.h>
14+
#include <stdbool.h>
1415
#include <stdlib.h>
1516

1617
#include <umf/base.h>
@@ -53,7 +54,7 @@ umf_result_t umfMemoryTrackerGetAllocInfo(const void *ptr,
5354
// forwards all requests to hUpstream memory Provider. hUpstream lifetime should be managed by the user of this function.
5455
umf_result_t umfTrackingMemoryProviderCreate(
5556
umf_memory_provider_handle_t hUpstream, umf_memory_pool_handle_t hPool,
56-
umf_memory_provider_handle_t *hTrackingProvider);
57+
umf_memory_provider_handle_t *hTrackingProvider, bool upstreamFrees);
5758

5859
void umfTrackingMemoryProviderGetUpstreamProvider(
5960
umf_memory_provider_handle_t hTrackingProvider,

test/memoryPoolAPI.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,8 @@ TEST_P(umfPoolWithCreateFlagsTest, memoryPoolWithCustomProvider) {
139139
}
140140

141141
TEST_F(test, retrieveMemoryProvider) {
142-
umf_memory_provider_handle_t provider = (umf_memory_provider_handle_t)0x1;
142+
auto nullProvider = umf_test::wrapProviderUnique(nullProviderCreate());
143+
umf_memory_provider_handle_t provider = nullProvider.get();
143144

144145
auto pool =
145146
wrapPoolUnique(createPoolChecked(umfProxyPoolOps(), provider, nullptr));
@@ -258,7 +259,8 @@ TEST_P(poolInitializeTest, errorPropagation) {
258259
}
259260

260261
TEST_F(test, retrieveMemoryProvidersError) {
261-
umf_memory_provider_handle_t provider = (umf_memory_provider_handle_t)0x1;
262+
auto nullProvider = umf_test::wrapProviderUnique(nullProviderCreate());
263+
umf_memory_provider_handle_t provider = nullProvider.get();
262264

263265
auto pool =
264266
wrapPoolUnique(createPoolChecked(umfProxyPoolOps(), provider, nullptr));

test/pools/disjoint_pool.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,10 @@ TEST_F(test, sharedLimits) {
8282
}
8383
umf_result_t free(void *ptr, [[maybe_unused]] size_t size) noexcept {
8484
::free(ptr);
85-
numFrees++;
85+
// umfMemoryProviderFree(provider, NULL, 0) is called inside umfPoolCreateInternal()
86+
if (ptr != NULL && size != 0) {
87+
numFrees++;
88+
}
8689
return UMF_RESULT_SUCCESS;
8790
}
8891
};

0 commit comments

Comments
 (0)