add function sorted_queue_pop_to_queue_ex
parent
f5fa33611f
commit
7614f789c8
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue