diff --git a/HISTORY b/HISTORY index 5017672..b0f2d31 100644 --- a/HISTORY +++ b/HISTORY @@ -1,6 +1,7 @@ Version 1.61 2022-09-21 * get_base_path_from_conf_file_ex support parameter: noent_log_level + * add function common_blocked_queue_push_chain Version 1.60 2022-08-27 * normalize_path for base_path diff --git a/src/common_blocked_queue.c b/src/common_blocked_queue.c index 85718b1..1abaaba 100644 --- a/src/common_blocked_queue.c +++ b/src/common_blocked_queue.c @@ -102,6 +102,29 @@ int common_blocked_queue_push_ex(struct common_blocked_queue *queue, return 0; } +void common_blocked_queue_push_chain_ex(struct common_blocked_queue *queue, + struct common_blocked_chain *chain, bool *notify) +{ + if (chain->head == NULL) + { + return; + } + + pthread_mutex_lock(&(queue->lc_pair.lock)); + if (queue->head == NULL) + { + queue->head = chain->head; + *notify = true; + } + else + { + queue->tail->next = chain->head; + *notify = false; + } + queue->tail = chain->tail; + pthread_mutex_unlock(&(queue->lc_pair.lock)); +} + void common_blocked_queue_return_nodes(struct common_blocked_queue *queue, struct common_blocked_node *node) { diff --git a/src/common_blocked_queue.h b/src/common_blocked_queue.h index 1a0a18b..57fa630 100644 --- a/src/common_blocked_queue.h +++ b/src/common_blocked_queue.h @@ -31,6 +31,12 @@ struct common_blocked_node struct common_blocked_node *next; }; +struct common_blocked_chain +{ + struct common_blocked_node *head; + struct common_blocked_node *tail; +}; + struct common_blocked_queue { struct common_blocked_node *head; @@ -88,6 +94,34 @@ static inline int common_blocked_queue_push(struct common_blocked_queue return result; } +static inline struct common_blocked_node *common_blocked_queue_alloc_node( + struct common_blocked_queue *queue) +{ + return fast_mblock_alloc_object(&queue->mblock); +} + +static inline void common_blocked_queue_free_node( + struct common_blocked_queue *queue, + struct common_blocked_node *node) +{ + fast_mblock_free_object(&queue->mblock, node); +} + +void common_blocked_queue_push_chain_ex(struct common_blocked_queue *queue, + struct common_blocked_chain *chain, bool *notify); + +static inline void common_blocked_queue_push_chain( + struct common_blocked_queue *queue, + struct common_blocked_chain *chain) +{ + bool notify; + + common_blocked_queue_push_chain_ex(queue, chain, ¬ify); + if (notify) + { + pthread_cond_signal(&(queue->lc_pair.cond)); + } +} void common_blocked_queue_return_nodes(struct common_blocked_queue *queue, struct common_blocked_node *node);