23
23
24
24
// global base allocator used by all providers and pools
25
25
static UTIL_ONCE_FLAG ba_is_initialized = UTIL_ONCE_FLAG_INIT ;
26
+ static bool ba_is_destroyed = false;
26
27
27
28
#define ALLOC_METADATA_SIZE (sizeof(size_t))
28
29
@@ -40,6 +41,8 @@ struct base_alloc_t {
40
41
static struct base_alloc_t BASE_ALLOC = {.ac_sizes = ALLOCATION_CLASSES };
41
42
42
43
void umf_ba_destroy_global (void ) {
44
+ ba_is_destroyed = true;
45
+
43
46
for (int i = 0 ; i < NUM_ALLOCATION_CLASSES ; i ++ ) {
44
47
if (BASE_ALLOC .ac [i ]) {
45
48
umf_ba_destroy (BASE_ALLOC .ac [i ]);
@@ -48,10 +51,12 @@ void umf_ba_destroy_global(void) {
48
51
}
49
52
50
53
// 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 ));
54
+ static UTIL_ONCE_FLAG set_once = UTIL_ONCE_FLAG_INIT ;
55
+ memcpy (& ba_is_initialized , & set_once , sizeof (ba_is_initialized ));
53
56
}
54
57
58
+ bool umf_ba_global_is_destroyed () { return ba_is_destroyed ; }
59
+
55
60
static void umf_ba_create_global (void ) {
56
61
for (int i = 0 ; i < NUM_ALLOCATION_CLASSES ; i ++ ) {
57
62
// allocation classes need to be powers of 2
@@ -202,6 +207,11 @@ void umf_ba_global_free(void *ptr) {
202
207
return ;
203
208
}
204
209
210
+ if (ba_is_destroyed ) {
211
+ LOG_WARN ("base_alloc: calling free after the base alloc is destroyed" );
212
+ return ;
213
+ }
214
+
205
215
size_t total_size ;
206
216
ptr = get_original_alloc (ptr , & total_size , NULL );
207
217
0 commit comments