X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fmeshlink_queue.h;h=cacda0ed4f15e5713dfed43e68b14fa19cae6c42;hb=a5df8a6eac570fc0f3b10cfcdeb9ccccc8dd1ac1;hp=996231807096dc878036492450b24b38c5ecf7ac;hpb=a1b6ee1e25c9b0cbd2265d86a2d4020eddba735b;p=meshlink diff --git a/src/meshlink_queue.h b/src/meshlink_queue.h index 99623180..cacda0ed 100644 --- a/src/meshlink_queue.h +++ b/src/meshlink_queue.h @@ -40,12 +40,16 @@ static inline void meshlink_queue_init(meshlink_queue_t *queue) { queue->head = NULL; queue->tail = NULL; pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_DEFAULT); - pthread_mutex_init(&queue->mutex, &attr); + assert(pthread_mutexattr_init(&attr) == 0); + assert(pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_DEFAULT) == 0); + assert(pthread_mutex_init(&queue->mutex, &attr) == 0); } -static inline bool meshlink_queue_push(meshlink_queue_t *queue, void *data) { +static inline void meshlink_queue_exit(meshlink_queue_t *queue) { + assert(pthread_mutex_destroy(&queue->mutex) == 0); +} + +static inline __attribute__((__warn_unused_result__)) bool meshlink_queue_push(meshlink_queue_t *queue, void *data) { meshlink_queue_item_t *item = malloc(sizeof(*item)); if(!item) { @@ -54,7 +58,7 @@ static inline bool meshlink_queue_push(meshlink_queue_t *queue, void *data) { item->data = data; item->next = NULL; - pthread_mutex_lock(&queue->mutex); + assert(pthread_mutex_lock(&queue->mutex) == 0); if(!queue->tail) { queue->head = queue->tail = item; @@ -62,14 +66,14 @@ static inline bool meshlink_queue_push(meshlink_queue_t *queue, void *data) { queue->tail = queue->tail->next = item; } - pthread_mutex_unlock(&queue->mutex); + assert(pthread_mutex_unlock(&queue->mutex) == 0); return true; } -static inline void *meshlink_queue_pop(meshlink_queue_t *queue) { +static inline __attribute__((__warn_unused_result__)) void *meshlink_queue_pop(meshlink_queue_t *queue) { meshlink_queue_item_t *item; - void *data; - pthread_mutex_lock(&queue->mutex); + + assert(pthread_mutex_lock(&queue->mutex) == 0); if((item = queue->head)) { queue->head = item->next; @@ -79,8 +83,32 @@ static inline void *meshlink_queue_pop(meshlink_queue_t *queue) { } } - pthread_mutex_unlock(&queue->mutex); - data = item ? item->data : NULL; + assert(pthread_mutex_unlock(&queue->mutex) == 0); + + void *data = item ? item->data : NULL; + free(item); + return data; +} + +static inline __attribute__((__warn_unused_result__)) void *meshlink_queue_pop_cond(meshlink_queue_t *queue, pthread_cond_t *cond) { + meshlink_queue_item_t *item; + + assert(pthread_mutex_lock(&queue->mutex) == 0); + + while(!queue->head) { + assert(pthread_cond_wait(cond, &queue->mutex) == 0); + } + + item = queue->head; + queue->head = item->next; + + if(!queue->head) { + queue->tail = NULL; + } + + assert(pthread_mutex_unlock(&queue->mutex) == 0); + + void *data = item->data; free(item); return data; }