--- src/util/u_queue.c.orig 2023-03-08 11:37:09.000000000 -0700 +++ src/util/u_queue.c 2023-05-04 20:32:53.030545000 -0600 @@ -54,16 +54,21 @@ * are using the static variables. */ -static once_flag atexit_once_flag = ONCE_FLAG_INIT; static struct list_head queue_list = { .next = &queue_list, .prev = &queue_list, }; static mtx_t exit_mutex; -static void -atexit_handler(void) +__attribute__((constructor)) +static void initfn(void) { + mtx_init(&exit_mutex, mtx_plain); +} + +__attribute__((destructor)) +static void destructfn(void) +{ struct util_queue *iter; mtx_lock(&exit_mutex); @@ -75,17 +80,8 @@ } static void -global_init(void) -{ - mtx_init(&exit_mutex, mtx_plain); - atexit(atexit_handler); -} - -static void add_to_atexit_list(struct util_queue *queue) { - call_once(&atexit_once_flag, global_init); - mtx_lock(&exit_mutex); list_add(&queue->head, &queue_list); mtx_unlock(&exit_mutex);