Skip to content

Commit 02c6895

Browse files
committed
Call umfMemoryProviderFree() with size from tracking provider
umfMemoryProviderFree() should not be called with size == 0, so use the size saved in the tracking provider in this case. Signed-off-by: Lukasz Dorau <[email protected]>
1 parent 6fc3e56 commit 02c6895

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

src/provider/provider_tracking.c

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,20 +60,24 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
6060
}
6161

6262
static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
63-
const void *ptr) {
63+
const void *ptr, size_t *size) {
6464
assert(ptr);
6565

6666
// TODO: there is no support for removing partial ranges (or multiple entries
6767
// in a single remove call) yet.
6868
// Every umfMemoryTrackerAdd(..., ptr, ...) should have a corresponding
6969
// umfMemoryTrackerRemove call with the same ptr value.
7070

71-
void *value = critnib_remove(hTracker->map, (uintptr_t)ptr);
71+
tracker_value_t *value = critnib_remove(hTracker->map, (uintptr_t)ptr);
7272
if (!value) {
7373
LOG_ERR("umfMemoryTrackerRemove: pointer %p not found in the map", ptr);
7474
return UMF_RESULT_ERROR_UNKNOWN;
7575
}
7676

77+
if (size) {
78+
*size = value->size;
79+
}
80+
7781
umf_ba_free(hTracker->tracker_allocator, value);
7882

7983
return UMF_RESULT_SUCCESS;
@@ -318,13 +322,14 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
318322
umf_result_t ret;
319323
umf_tracking_memory_provider_t *p =
320324
(umf_tracking_memory_provider_t *)hProvider;
325+
size_t saved_size = 0;
321326

322327
// umfMemoryTrackerRemove should be called before umfMemoryProviderFree
323328
// to avoid a race condition. If the order would be different, other thread
324329
// could allocate the memory at address `ptr` before a call to umfMemoryTrackerRemove
325330
// resulting in inconsistent state.
326331
if (ptr) {
327-
ret = umfMemoryTrackerRemove(p->hTracker, ptr);
332+
ret = umfMemoryTrackerRemove(p->hTracker, ptr, &saved_size);
328333
if (ret != UMF_RESULT_SUCCESS) {
329334
// DO NOT return an error here, because the tracking provider
330335
// cannot change behaviour of the upstream provider.
@@ -343,6 +348,15 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
343348
umf_ba_global_free(value);
344349
}
345350

351+
// umfMemoryProviderFree() should not be called with size == 0,
352+
// so use the size saved in the tracking provider.
353+
if (size == 0) {
354+
size = saved_size;
355+
}
356+
if (saved_size) {
357+
assert(size == saved_size);
358+
}
359+
346360
ret = umfMemoryProviderFree(p->hUpstream, ptr, size);
347361
if (ret != UMF_RESULT_SUCCESS) {
348362
LOG_ERR("tracking free: umfMemoryProviderFree failed");
@@ -608,7 +622,7 @@ static umf_result_t trackingCloseIpcHandle(void *provider, void *ptr,
608622
// could allocate the memory at address `ptr` before a call to umfMemoryTrackerRemove
609623
// resulting in inconsistent state.
610624
if (ptr) {
611-
umf_result_t ret = umfMemoryTrackerRemove(p->hTracker, ptr);
625+
umf_result_t ret = umfMemoryTrackerRemove(p->hTracker, ptr, NULL);
612626
if (ret != UMF_RESULT_SUCCESS) {
613627
// DO NOT return an error here, because the tracking provider
614628
// cannot change behaviour of the upstream provider.

0 commit comments

Comments
 (0)