|
8 | 8 | */
|
9 | 9 |
|
10 | 10 | #include "provider_tracking.h"
|
| 11 | +#include "base_alloc_global.h" |
11 | 12 | #include "critnib.h"
|
12 | 13 | #include "utils_concurrency.h"
|
13 | 14 |
|
@@ -106,6 +107,8 @@ typedef struct umf_tracking_memory_provider_t {
|
106 | 107 | umf_memory_provider_handle_t hUpstream;
|
107 | 108 | umf_memory_tracker_handle_t hTracker;
|
108 | 109 | umf_memory_pool_handle_t pool;
|
| 110 | + // saved pointer to the global base allocator |
| 111 | + umf_ba_pool_t *base_allocator; |
109 | 112 | } umf_tracking_memory_provider_t;
|
110 | 113 |
|
111 | 114 | typedef struct umf_tracking_memory_provider_t umf_tracking_memory_provider_t;
|
@@ -325,17 +328,23 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
|
325 | 328 | }
|
326 | 329 |
|
327 | 330 | static umf_result_t trackingInitialize(void *params, void **ret) {
|
328 |
| - umf_tracking_memory_provider_t *p = |
329 |
| - (umf_tracking_memory_provider_t *)params; |
| 331 | + umf_ba_pool_t *base_allocator = |
| 332 | + umf_ba_get_pool(sizeof(umf_tracking_memory_provider_t)); |
| 333 | + if (!base_allocator) { |
| 334 | + return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY; |
| 335 | + } |
| 336 | + |
330 | 337 | umf_tracking_memory_provider_t *provider =
|
331 |
| - (umf_tracking_memory_provider_t *)umf_ba_linear_alloc( |
332 |
| - p->hTracker->pool_linear, sizeof(umf_tracking_memory_provider_t)); |
| 338 | + (umf_tracking_memory_provider_t *)umf_ba_alloc(base_allocator); |
333 | 339 | if (!provider) {
|
334 | 340 | return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
|
335 | 341 | }
|
336 | 342 |
|
337 | 343 | *provider = *((umf_tracking_memory_provider_t *)params);
|
| 344 | + provider->base_allocator = base_allocator; |
| 345 | + |
338 | 346 | *ret = provider;
|
| 347 | + |
339 | 348 | return UMF_RESULT_SUCCESS;
|
340 | 349 | }
|
341 | 350 |
|
@@ -375,16 +384,14 @@ static void check_if_tracker_is_empty(umf_memory_tracker_handle_t hTracker,
|
375 | 384 | #endif /* NDEBUG */
|
376 | 385 |
|
377 | 386 | static void trackingFinalize(void *provider) {
|
378 |
| -#ifndef NDEBUG |
379 | 387 | umf_tracking_memory_provider_t *p =
|
380 | 388 | (umf_tracking_memory_provider_t *)provider;
|
| 389 | + |
| 390 | +#ifndef NDEBUG |
381 | 391 | check_if_tracker_is_empty(p->hTracker, p->pool);
|
382 | 392 | #endif /* NDEBUG */
|
383 | 393 |
|
384 |
| - (void)provider; // unused in Release build |
385 |
| - // provider was allocated from the linear allocator, |
386 |
| - // so it will be freed, when the linear allocator is destroyed |
387 |
| - // in umfMemoryTrackerDestroy() |
| 394 | + umf_ba_free(p->base_allocator, provider); |
388 | 395 | }
|
389 | 396 |
|
390 | 397 | static void trackingGetLastError(void *provider, const char **msg,
|
|
0 commit comments