add function sorted_queue_pop_to_queue_ex

pull/37/merge
YuQing 2021-09-11 11:47:05 +08:00
parent f5fa33611f
commit 7614f789c8
3 changed files with 52 additions and 16 deletions

View File

@ -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:

View File

@ -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;
}

View File

@ -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)