From 2fafa215fd5e54cc517f22ae4f676f5bc2b022d0 Mon Sep 17 00:00:00 2001 From: YuQing <384681@qq.com> Date: Wed, 11 Aug 2021 11:32:23 +0800 Subject: [PATCH] add function fc_queue_timedpeek --- HISTORY | 3 ++- src/fc_queue.c | 38 ++++++++++++++++++++++++++------------ src/fc_queue.h | 12 ++++++++++++ 3 files changed, 40 insertions(+), 13 deletions(-) diff --git a/HISTORY b/HISTORY index 5b6eefe..d8ab971 100644 --- a/HISTORY +++ b/HISTORY @@ -1,7 +1,8 @@ -Version 1.54 2021-08-08 +Version 1.54 2021-08-11 * fast_allocator.[hc]: correct reclaim_interval logic * shared_func.[hc]: add functions getFileContentEx1 and getFileContent1 + * fc_queue.[hc]: add function fc_queue_timedpeek Version 1.53 2021-06-30 * process_action support action status diff --git a/src/fc_queue.c b/src/fc_queue.c index 784f6ab..2da4fca 100644 --- a/src/fc_queue.c +++ b/src/fc_queue.c @@ -181,21 +181,35 @@ void *fc_queue_timedpop(struct fc_queue *queue, void *data; PTHREAD_MUTEX_LOCK(&queue->lc_pair.lock); - do { + data = queue->head; + if (data == NULL) { + fc_cond_timedwait(&queue->lc_pair, timeout, time_unit); data = queue->head; - if (data == NULL) { - fc_cond_timedwait(&queue->lc_pair, timeout, time_unit); - data = queue->head; - } + } - if (data != NULL) { - queue->head = FC_QUEUE_NEXT_PTR(queue, data); - if (queue->head == NULL) { - queue->tail = NULL; - } + if (data != NULL) { + queue->head = FC_QUEUE_NEXT_PTR(queue, data); + if (queue->head == NULL) { + queue->tail = NULL; } - } while (0); - + } PTHREAD_MUTEX_UNLOCK(&queue->lc_pair.lock); + return data; } + +void *fc_queue_timedpeek(struct fc_queue *queue, + const int timeout, const int time_unit) +{ + void *data; + + PTHREAD_MUTEX_LOCK(&queue->lc_pair.lock); + data = queue->head; + if (data == NULL) { + fc_cond_timedwait(&queue->lc_pair, timeout, time_unit); + data = queue->head; + } + PTHREAD_MUTEX_UNLOCK(&queue->lc_pair.lock); + + return data; +} diff --git a/src/fc_queue.h b/src/fc_queue.h index 0df3675..17ea458 100644 --- a/src/fc_queue.h +++ b/src/fc_queue.h @@ -160,6 +160,18 @@ void *fc_queue_timedpop(struct fc_queue *queue, #define fc_queue_timedpop_us(queue, timeout_us) \ fc_queue_timedpop(queue, timeout_us, FC_TIME_UNIT_USECOND) +void *fc_queue_timedpeek(struct fc_queue *queue, + const int timeout, const int time_unit); + +#define fc_queue_timedpeek_sec(queue, timeout) \ + fc_queue_timedpeek(queue, timeout, FC_TIME_UNIT_SECOND) + +#define fc_queue_timedpeek_ms(queue, timeout_ms) \ + fc_queue_timedpeek(queue, timeout_ms, FC_TIME_UNIT_MSECOND) + +#define fc_queue_timedpeek_us(queue, timeout_us) \ + fc_queue_timedpeek(queue, timeout_us, FC_TIME_UNIT_USECOND) + #ifdef __cplusplus } #endif