--- src/util/u_queue.c.orig 2017-11-03 19:47:07.681178000 +0300 +++ src/util/u_queue.c 2017-11-03 19:48:33.241932000 +0300 @@ -36,12 +36,17 @@ * are using the static variables. */ -static once_flag atexit_once_flag = ONCE_FLAG_INIT; static struct list_head queue_list; static mtx_t exit_mutex = _MTX_INITIALIZER_NP; -static void -atexit_handler(void) +__attribute__((constructor)) +static void initfn(void) +{ + LIST_INITHEAD(&queue_list); +} + +__attribute__((destructor)) +static void destructfn(void) { struct util_queue *iter; @@ -54,17 +59,8 @@ } static void -global_init(void) -{ - LIST_INITHEAD(&queue_list); - 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);