#pragma once #include #include #define queue(type) \ struct { \ array(type) a; \ struct nn_mutex mutex; \ } #define camu_queue_lock(q) \ do { \ nn_mutex_lock(&(q).mutex); \ } while (0) #define camu_queue_unlock(q) \ do { \ nn_mutex_unlock(&(q).mutex); \ } while (0) #define camu_queue_init(q) \ do { \ al_array_init((q).a); \ nn_mutex_init(&(q).mutex); \ } while (0) #define camu_queue_push(q, item) \ do { \ al_array_push((q).a, item); \ } while (0) #define camu_queue_try_pop(q, s, r) \ do { \ nn_mutex_lock(&(q).mutex); \ if ((s = (q).a.count) > 0) { \ al_array_pop_at((q).a, 0, r); \ } \ nn_mutex_unlock(&(q).mutex); \ } while (0) #define camu_queue_free(q) \ do { \ nn_mutex_destroy(&(q).mutex); \ al_array_free((q).a); \ } while (0)