X-Git-Url: http://git.meshlink.io/?p=meshlink;a=blobdiff_plain;f=src%2Fmeshlink_queue.h;h=d075f1c8497b887ea17cc0e171c39a6c4fcda7f0;hp=05b58d9a05e7474633dc7290461eba81af1a166c;hb=963c5055505f2fc117cd5efa06eaa02c9b2bf85d;hpb=3f6d9a24c1d4c78548bc9dab0e66e2a240a72df7 diff --git a/src/meshlink_queue.h b/src/meshlink_queue.h index 05b58d9a..d075f1c8 100644 --- a/src/meshlink_queue.h +++ b/src/meshlink_queue.h @@ -1,6 +1,9 @@ +#ifndef MESHLINK_QUEUE_H +#define MESHLINK_QUEUE_H + /* queue.h -- Thread-safe queue - Copyright (C) 2014 Guus Sliepen + Copyright (C) 2014, 2017 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,17 +20,14 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef MESHLINK_QUEUE_H -#define MESHLINK_QUEUE_H - #include #include #include #include typedef struct meshlink_queue { - struct meshlink_queue_item *head; - struct meshlink_queue_item *tail; + struct meshlink_queue_item *head; + struct meshlink_queue_item *tail; pthread_mutex_t mutex; } meshlink_queue_t; @@ -36,30 +36,53 @@ typedef struct meshlink_queue_item { struct meshlink_queue_item *next; } meshlink_queue_item_t; -static inline bool meshlink_queue_push(meshlink_queue_t *queue, void *data) { - meshlink_queue_item_t *item = malloc(sizeof *item); - if(!item) +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); +} + +static inline void meshlink_queue_exit(meshlink_queue_t *queue) { + pthread_mutex_destroy(&queue->mutex); +} + +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) { return false; + } + item->data = data; item->next = NULL; pthread_mutex_lock(&queue->mutex); - if(!queue->tail) + + if(!queue->tail) { queue->head = queue->tail = item; - else + } else { queue->tail = queue->tail->next = item; + } + pthread_mutex_unlock(&queue->mutex); 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); + if((item = queue->head)) { queue->head = item->next; - if(!queue->head) + + if(!queue->head) { queue->tail = NULL; + } } + pthread_mutex_unlock(&queue->mutex); data = item ? item->data : NULL; free(item);