Skip to content

Commit 887bb1f

Browse files
committed
Assert if tracking provider is not empty
Signed-off-by: Lukasz Dorau <[email protected]>
1 parent e23fbd4 commit 887bb1f

File tree

4 files changed

+62
-5
lines changed

4 files changed

+62
-5
lines changed

src/provider/provider_tracking.c

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include <assert.h>
1818
#include <errno.h>
19+
#include <stdio.h>
1920
#include <stdlib.h>
2021

2122
typedef struct tracker_value_t {
@@ -162,7 +163,37 @@ static umf_result_t trackingInitialize(void *params, void **ret) {
162163
return UMF_RESULT_SUCCESS;
163164
}
164165

165-
static void trackingFinalize(void *provider) { free(provider); }
166+
static void trackingFinalize(void *provider) {
167+
#ifndef NDEBUG
168+
umf_tracking_memory_provider_t *p =
169+
(umf_tracking_memory_provider_t *)provider;
170+
171+
uintptr_t rkey;
172+
void *rvalue;
173+
size_t n_items = 0;
174+
uintptr_t last_key = 0;
175+
176+
while (1 == critnib_find((critnib *)p->hTracker, last_key, FIND_G, &rkey,
177+
&rvalue)) {
178+
tracker_value_t *value = (tracker_value_t *)rvalue;
179+
if (value->pool == p->pool) {
180+
n_items++;
181+
}
182+
183+
last_key = rkey;
184+
}
185+
186+
if (n_items) {
187+
fprintf(stderr,
188+
"ASSERT: tracking provider of pool %p is not empty! (%zu items "
189+
"left)\n",
190+
(void *)p->pool, n_items);
191+
assert(n_items == 0);
192+
}
193+
#endif /* NDEBUG */
194+
195+
free(provider);
196+
}
166197

167198
static void trackingGetLastError(void *provider, const char **msg,
168199
int32_t *pError) {
@@ -243,3 +274,27 @@ void umfTrackingMemoryProviderGetUpstreamProvider(
243274
(umf_tracking_memory_provider_t *)hTrackingProvider;
244275
*hUpstream = p->hUpstream;
245276
}
277+
278+
void umfTrackingMemoryProviderFini(void *tracker) {
279+
#ifndef NDEBUG
280+
uintptr_t rkey;
281+
void *rvalue;
282+
size_t n_items = 0;
283+
uintptr_t last_key = 0;
284+
285+
while (1 ==
286+
critnib_find((critnib *)tracker, last_key, FIND_G, &rkey, &rvalue)) {
287+
n_items++;
288+
last_key = rkey;
289+
}
290+
291+
if (n_items) {
292+
fprintf(stderr,
293+
"ASSERT: tracking provider is not empty! (%zu items left)\n",
294+
n_items);
295+
assert(n_items == 0);
296+
}
297+
#endif /* NDEBUG */
298+
299+
critnib_delete((critnib *)tracker);
300+
}

src/provider/provider_tracking.h

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

38+
void umfTrackingMemoryProviderFini(void *tracker);
39+
3840
void umfTrackingMemoryProviderGetUpstreamProvider(
3941
umf_memory_provider_handle_t hTrackingProvider,
4042
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
@@ -18,7 +18,7 @@ void __attribute__((constructor)) createLibTracker(void) {
1818
TRACKER = critnib_new();
1919
}
2020
void __attribute__((destructor)) deleteLibTracker(void) {
21-
critnib_delete(TRACKER);
21+
umfTrackingMemoryProviderFini(TRACKER);
2222
}
2323

2424
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 critnib *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-
critnib_delete(TRACKER);
22+
providerFini();
2123
} else if (fdwReason == DLL_PROCESS_ATTACH) {
2224
TRACKER = critnib_new();
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) { critnib_delete(TRACKER); }
34-
3535
BOOL CALLBACK providerInit(PINIT_ONCE InitOnce, PVOID Parameter,
3636
PVOID *lpContext) {
3737
TRACKER = critnib_new();

0 commit comments

Comments
 (0)