diff --git a/src/fast_mblock.h b/src/fast_mblock.h index fac9720..c18796b 100644 --- a/src/fast_mblock.h +++ b/src/fast_mblock.h @@ -263,6 +263,23 @@ return 0 for success, return none zero if fail int fast_mblock_batch_free(struct fast_mblock_man *mblock, struct fast_mblock_chain *chain); +/** +batch free objects +parameters: + mblock: the mblock pointer + head: the head object + tail: the tail object +return 0 for success, return none zero if fail +*/ +static inline int fast_mblock_batch_free_objs(struct fast_mblock_man + *mblock, void *head, void *tail) +{ + struct fast_mblock_chain chain; + chain.head = fast_mblock_to_node_ptr(head); + chain.tail = fast_mblock_to_node_ptr(tail); + return fast_mblock_batch_free(mblock, &chain); +} + /** delay free a node (put a node to the mblock) parameters: diff --git a/src/sorted_queue.c b/src/sorted_queue.c index 58e8cdc..6e0bf03 100644 --- a/src/sorted_queue.c +++ b/src/sorted_queue.c @@ -102,16 +102,15 @@ void *sorted_queue_pop_ex(struct sorted_queue *sq, return data; } -void *sorted_queue_pop_all_ex(struct sorted_queue *sq, - void *less_equal, const bool blocked) +void sorted_queue_pop_to_queue_ex(struct sorted_queue *sq, + void *less_equal, struct fc_queue_info *qinfo, + const bool blocked) { - struct fc_queue_info chain; - PTHREAD_MUTEX_LOCK(&sq->queue.lc_pair.lock); do { if (sq->queue.head == NULL) { if (!blocked) { - chain.head = NULL; + qinfo->head = qinfo->tail = NULL; break; } @@ -120,27 +119,30 @@ void *sorted_queue_pop_all_ex(struct sorted_queue *sq, } if (sq->queue.head == NULL) { - chain.head = NULL; + qinfo->head = qinfo->tail = NULL; } else { if (sq->compare_func(sq->queue.head, less_equal) <= 0) { - chain.head = chain.tail = sq->queue.head; - sq->queue.head = FC_QUEUE_NEXT_PTR(&sq->queue, sq->queue.head); - while (sq->compare_func(sq->queue.head, less_equal) <= 0) { - chain.tail = sq->queue.head; - sq->queue.head = FC_QUEUE_NEXT_PTR(&sq->queue, sq->queue.head); + qinfo->head = qinfo->tail = sq->queue.head; + sq->queue.head = FC_QUEUE_NEXT_PTR(&sq->queue, + sq->queue.head); + while (sq->queue.head != NULL && sq->compare_func( + sq->queue.head, less_equal) <= 0) + { + qinfo->tail = sq->queue.head; + sq->queue.head = FC_QUEUE_NEXT_PTR( + &sq->queue, sq->queue.head); } if (sq->queue.head == NULL) { sq->queue.tail = NULL; } else { - FC_QUEUE_NEXT_PTR(&sq->queue, chain.tail) = NULL; + FC_QUEUE_NEXT_PTR(&sq->queue, qinfo->tail) = NULL; } } else { - chain.head = NULL; + qinfo->head = qinfo->tail = NULL; } } } while (0); PTHREAD_MUTEX_UNLOCK(&sq->queue.lc_pair.lock); - return chain.head; } diff --git a/src/sorted_queue.h b/src/sorted_queue.h index f9e1e88..0004226 100644 --- a/src/sorted_queue.h +++ b/src/sorted_queue.h @@ -75,8 +75,25 @@ void *sorted_queue_pop_ex(struct sorted_queue *sq, #define sorted_queue_try_pop(sq, less_equal) \ sorted_queue_pop_ex(sq, less_equal, false) -void *sorted_queue_pop_all_ex(struct sorted_queue *sq, - void *less_equal, const bool blocked); + +void sorted_queue_pop_to_queue_ex(struct sorted_queue *sq, + void *less_equal, struct fc_queue_info *qinfo, + const bool blocked); + +#define sorted_queue_pop_to_queue(sq, less_equal, qinfo) \ + sorted_queue_pop_to_queue_ex(sq, less_equal, qinfo, true) + +#define sorted_queue_try_pop_to_queue(sq, less_equal, qinfo) \ + sorted_queue_pop_to_queue_ex(sq, less_equal, qinfo, false) + + +static inline void *sorted_queue_pop_all_ex(struct sorted_queue *sq, + void *less_equal, const bool blocked) +{ + struct fc_queue_info chain; + sorted_queue_pop_to_queue_ex(sq, less_equal, &chain, blocked); + return chain.head; +} #define sorted_queue_pop_all(sq, less_equal) \ sorted_queue_pop_all_ex(sq, less_equal, true)