diff --git a/src/base_alloc/base_alloc_global.c b/src/base_alloc/base_alloc_global.c index 2aca5d29c..f709eab9d 100644 --- a/src/base_alloc/base_alloc_global.c +++ b/src/base_alloc/base_alloc_global.c @@ -23,6 +23,7 @@ // global base allocator used by all providers and pools static UTIL_ONCE_FLAG ba_is_initialized = UTIL_ONCE_FLAG_INIT; +static bool ba_is_destroyed = false; #define ALLOC_METADATA_SIZE (sizeof(size_t)) @@ -40,6 +41,8 @@ struct base_alloc_t { static struct base_alloc_t BASE_ALLOC = {.ac_sizes = ALLOCATION_CLASSES}; void umf_ba_destroy_global(void) { + ba_is_destroyed = true; + for (int i = 0; i < NUM_ALLOCATION_CLASSES; i++) { if (BASE_ALLOC.ac[i]) { umf_ba_destroy(BASE_ALLOC.ac[i]); @@ -48,10 +51,12 @@ void umf_ba_destroy_global(void) { } // portable version of "ba_is_initialized = UTIL_ONCE_FLAG_INIT;" - static UTIL_ONCE_FLAG is_initialized = UTIL_ONCE_FLAG_INIT; - memcpy(&ba_is_initialized, &is_initialized, sizeof(ba_is_initialized)); + static UTIL_ONCE_FLAG set_once = UTIL_ONCE_FLAG_INIT; + memcpy(&ba_is_initialized, &set_once, sizeof(ba_is_initialized)); } +bool umf_ba_global_is_destroyed(void) { return ba_is_destroyed; } + static void umf_ba_create_global(void) { for (int i = 0; i < NUM_ALLOCATION_CLASSES; i++) { // allocation classes need to be powers of 2 @@ -202,6 +207,11 @@ void umf_ba_global_free(void *ptr) { return; } + if (ba_is_destroyed) { + LOG_WARN("base_alloc: calling free after the base alloc is destroyed"); + return; + } + size_t total_size; ptr = get_original_alloc(ptr, &total_size, NULL); diff --git a/src/base_alloc/base_alloc_global.h b/src/base_alloc/base_alloc_global.h index ad7f12ce5..bd55d352f 100644 --- a/src/base_alloc/base_alloc_global.h +++ b/src/base_alloc/base_alloc_global.h @@ -8,6 +8,8 @@ #ifndef UMF_BASE_ALLOC_GLOBAL_H #define UMF_BASE_ALLOC_GLOBAL_H 1 +#include + #include "base_alloc.h" #ifdef __cplusplus @@ -17,6 +19,7 @@ extern "C" { void *umf_ba_global_alloc(size_t size); void umf_ba_global_free(void *ptr); void umf_ba_destroy_global(void); +bool umf_ba_global_is_destroyed(void); size_t umf_ba_global_malloc_usable_size(void *ptr); void *umf_ba_global_aligned_alloc(size_t size, size_t alignment);