2323
2424// global base allocator used by all providers and pools
2525static UTIL_ONCE_FLAG ba_is_initialized = UTIL_ONCE_FLAG_INIT ;
26+ static bool ba_is_destroyed = false;
2627
2728#define ALLOC_METADATA_SIZE (sizeof(size_t))
2829
2930// allocation classes need to be consecutive powers of 2
30- #define ALLOCATION_CLASSES \
31- { 16, 32, 64, 128, 256 }
31+ #define ALLOCATION_CLASSES {16, 32, 64, 128, 256}
3232#define NUM_ALLOCATION_CLASSES 5
3333
3434struct base_alloc_t {
@@ -40,6 +40,8 @@ struct base_alloc_t {
4040static struct base_alloc_t BASE_ALLOC = {.ac_sizes = ALLOCATION_CLASSES };
4141
4242void umf_ba_destroy_global (void ) {
43+ ba_is_destroyed = true;
44+
4345 for (int i = 0 ; i < NUM_ALLOCATION_CLASSES ; i ++ ) {
4446 if (BASE_ALLOC .ac [i ]) {
4547 umf_ba_destroy (BASE_ALLOC .ac [i ]);
@@ -48,10 +50,12 @@ void umf_ba_destroy_global(void) {
4850 }
4951
5052 // portable version of "ba_is_initialized = UTIL_ONCE_FLAG_INIT;"
51- static UTIL_ONCE_FLAG is_initialized = UTIL_ONCE_FLAG_INIT ;
52- memcpy (& ba_is_initialized , & is_initialized , sizeof (ba_is_initialized ));
53+ static UTIL_ONCE_FLAG set_once = UTIL_ONCE_FLAG_INIT ;
54+ memcpy (& ba_is_initialized , & set_once , sizeof (ba_is_initialized ));
5355}
5456
57+ bool umf_ba_global_is_destroyed (void ) { return ba_is_destroyed ; }
58+
5559static void umf_ba_create_global (void ) {
5660 for (int i = 0 ; i < NUM_ALLOCATION_CLASSES ; i ++ ) {
5761 // allocation classes need to be powers of 2
@@ -202,6 +206,11 @@ void umf_ba_global_free(void *ptr) {
202206 return ;
203207 }
204208
209+ if (ba_is_destroyed ) {
210+ LOG_WARN ("base_alloc: calling free after the base alloc is destroyed" );
211+ return ;
212+ }
213+
205214 size_t total_size ;
206215 ptr = get_original_alloc (ptr , & total_size , NULL );
207216
0 commit comments