From d0729c2540645c6cc7adb8f1e5fdd42a43f32cce Mon Sep 17 00:00:00 2001 From: yuqing Date: Mon, 16 Jul 2018 15:08:59 +0800 Subject: [PATCH] common_blocked_queue.h: add function common_blocked_queue_try_pop --- HISTORY | 3 ++- src/common_blocked_queue.c | 54 ++++++++++++++++++++++---------------- src/common_blocked_queue.h | 13 ++++++++- 3 files changed, 46 insertions(+), 24 deletions(-) diff --git a/HISTORY b/HISTORY index 414dc2f..660923f 100644 --- a/HISTORY +++ b/HISTORY @@ -1,8 +1,9 @@ -Version 1.39 2018-07-10 +Version 1.39 2018-07-16 * add #@function REPLACE_VARS * #@set value can embed %{VARIABLE} * shared_func.h: add function starts_with and ends_with + * common_blocked_queue.h: add function common_blocked_queue_try_pop Version 1.38 2018-06-26 * connection_pool.c: set err_no to 0 when success diff --git a/src/common_blocked_queue.c b/src/common_blocked_queue.c index 75cbe72..551cdae 100644 --- a/src/common_blocked_queue.c +++ b/src/common_blocked_queue.c @@ -103,7 +103,8 @@ int common_blocked_queue_push(struct common_blocked_queue *queue, void *data) return 0; } -void *common_blocked_queue_pop(struct common_blocked_queue *queue) +void *common_blocked_queue_pop_ex(struct common_blocked_queue *queue, + const bool blocked) { struct common_blocked_node *node; void *data; @@ -118,28 +119,36 @@ void *common_blocked_queue_pop(struct common_blocked_queue *queue) return NULL; } - node = queue->head; - if (node == NULL) - { - pthread_cond_wait(&(queue->cond), &(queue->lock)); + do { node = queue->head; - } - - if (node != NULL) - { - queue->head = node->next; - if (queue->head == NULL) - { - queue->tail = NULL; - } - - data = node->data; - fast_mblock_free_object(&queue->mblock, node); - } - else - { - data = NULL; - } + if (node == NULL) + { + if (!blocked) + { + data = NULL; + break; + } + + pthread_cond_wait(&(queue->cond), &(queue->lock)); + node = queue->head; + } + + if (node != NULL) + { + queue->head = node->next; + if (queue->head == NULL) + { + queue->tail = NULL; + } + + data = node->data; + fast_mblock_free_object(&queue->mblock, node); + } + else + { + data = NULL; + } + } while (0); if ((result=pthread_mutex_unlock(&(queue->lock))) != 0) { @@ -151,3 +160,4 @@ void *common_blocked_queue_pop(struct common_blocked_queue *queue) return data; } + diff --git a/src/common_blocked_queue.h b/src/common_blocked_queue.h index 684d9f8..f3d32bd 100644 --- a/src/common_blocked_queue.h +++ b/src/common_blocked_queue.h @@ -62,7 +62,18 @@ static inline void common_blocked_queue_terminate_all( int common_blocked_queue_push(struct common_blocked_queue *queue, void *data); -void *common_blocked_queue_pop(struct common_blocked_queue *queue); +void *common_blocked_queue_pop_ex(struct common_blocked_queue *queue, + const bool blocked); + +static inline void *common_blocked_queue_pop(struct common_blocked_queue *queue) +{ + return common_blocked_queue_pop_ex(queue, true); +} + +static inline void *common_blocked_queue_try_pop(struct common_blocked_queue *queue) +{ + return common_blocked_queue_pop_ex(queue, false); +} #ifdef __cplusplus } -- GitLab