Skip to content

Commit 0dc5f35

Browse files
authored
Merge pull request #153 from ldorau/Assert_if_tracking_provider_is_not_empty
Assert if tracking provider is not empty
2 parents a87fa0d + 273e05a commit 0dc5f35

File tree

4 files changed

+59
-5
lines changed

4 files changed

+59
-5
lines changed

src/provider/provider_tracking.c

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,50 @@ static umf_result_t trackingInitialize(void *params, void **ret) {
322322
return UMF_RESULT_SUCCESS;
323323
}
324324

325-
static void trackingFinalize(void *provider) { free(provider); }
325+
#ifndef NDEBUG
326+
static void check_if_tracker_is_empty(umf_memory_tracker_handle_t hTracker,
327+
umf_memory_pool_handle_t pool) {
328+
uintptr_t rkey;
329+
void *rvalue;
330+
size_t n_items = 0;
331+
uintptr_t last_key = 0;
332+
333+
while (1 == critnib_find((critnib *)hTracker->map, last_key, FIND_G, &rkey,
334+
&rvalue)) {
335+
tracker_value_t *value = (tracker_value_t *)rvalue;
336+
if (value->pool == pool || pool == NULL) {
337+
n_items++;
338+
}
339+
340+
last_key = rkey;
341+
}
342+
343+
if (n_items) {
344+
if (pool) {
345+
fprintf(stderr,
346+
"ASSERT: tracking provider of pool %p is not empty! (%zu "
347+
"items left)\n",
348+
(void *)pool, n_items);
349+
} else {
350+
fprintf(
351+
stderr,
352+
"ASSERT: tracking provider is not empty! (%zu items left)\n",
353+
n_items);
354+
}
355+
assert(n_items == 0);
356+
}
357+
}
358+
#endif /* NDEBUG */
359+
360+
static void trackingFinalize(void *provider) {
361+
#ifndef NDEBUG
362+
umf_tracking_memory_provider_t *p =
363+
(umf_tracking_memory_provider_t *)provider;
364+
check_if_tracker_is_empty(p->hTracker, p->pool);
365+
#endif /* NDEBUG */
366+
367+
free(provider);
368+
}
326369

327370
static void trackingGetLastError(void *provider, const char **msg,
328371
int32_t *pError) {
@@ -404,3 +447,12 @@ void umfTrackingMemoryProviderGetUpstreamProvider(
404447
(umf_tracking_memory_provider_t *)hTrackingProvider;
405448
*hUpstream = p->hUpstream;
406449
}
450+
451+
void umfTrackingMemoryProviderFini(void *tracker) {
452+
umf_memory_tracker_handle_t hTracker = (umf_memory_tracker_handle_t)tracker;
453+
#ifndef NDEBUG
454+
check_if_tracker_is_empty(hTracker, NULL);
455+
#endif /* NDEBUG */
456+
457+
umfMemoryTrackerDestroy(hTracker);
458+
}

src/provider/provider_tracking.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ umf_result_t umfTrackingMemoryProviderCreate(
7878
// Initialize critnib for a UMF static library build on Windows
7979
void umfTrackingMemoryProviderInit(void);
8080

81+
void umfTrackingMemoryProviderFini(void *tracker);
82+
8183
void umfTrackingMemoryProviderGetUpstreamProvider(
8284
umf_memory_provider_handle_t hTrackingProvider,
8385
umf_memory_provider_handle_t *hUpstream);

src/provider/provider_tracking_linux.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ void __attribute__((constructor)) createLibTracker(void) {
1717
TRACKER = umfMemoryTrackerCreate();
1818
}
1919
void __attribute__((destructor)) deleteLibTracker(void) {
20-
umfMemoryTrackerDestroy(TRACKER);
20+
umfTrackingMemoryProviderFini(TRACKER);
2121
}
2222

2323
void umfTrackingMemoryProviderInit(void) {

src/provider/provider_tracking_windows.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414

1515
static umf_memory_tracker_handle_t TRACKER = NULL;
1616

17+
static void providerFini(void) { umfTrackingMemoryProviderFini(TRACKER); }
18+
1719
#if defined(UMF_SHARED_LIBRARY)
1820
BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
1921
if (fdwReason == DLL_PROCESS_DETACH) {
20-
umfMemoryTrackerDestroy(TRACKER);
22+
providerFini();
2123
} else if (fdwReason == DLL_PROCESS_ATTACH) {
2224
TRACKER = umfMemoryTrackerCreate();
2325
}
@@ -30,8 +32,6 @@ void umfTrackingMemoryProviderInit(void) {
3032
#else
3133
INIT_ONCE init_once_flag = INIT_ONCE_STATIC_INIT;
3234

33-
static void providerFini(void) { umfMemoryTrackerDestroy(TRACKER); }
34-
3535
BOOL CALLBACK providerInit(PINIT_ONCE InitOnce, PVOID Parameter,
3636
PVOID *lpContext) {
3737
TRACKER = umfMemoryTrackerCreate();

0 commit comments

Comments
 (0)