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,
|
int fast_mblock_batch_free(struct fast_mblock_man *mblock,
|
||||||
struct fast_mblock_chain *chain);
|
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)
|
delay free a node (put a node to the mblock)
|
||||||
parameters:
|
parameters:
|
||||||
|
|
|
||||||
|
|
@ -102,16 +102,15 @@ void *sorted_queue_pop_ex(struct sorted_queue *sq,
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *sorted_queue_pop_all_ex(struct sorted_queue *sq,
|
void sorted_queue_pop_to_queue_ex(struct sorted_queue *sq,
|
||||||
void *less_equal, const bool blocked)
|
void *less_equal, struct fc_queue_info *qinfo,
|
||||||
|
const bool blocked)
|
||||||
{
|
{
|
||||||
struct fc_queue_info chain;
|
|
||||||
|
|
||||||
PTHREAD_MUTEX_LOCK(&sq->queue.lc_pair.lock);
|
PTHREAD_MUTEX_LOCK(&sq->queue.lc_pair.lock);
|
||||||
do {
|
do {
|
||||||
if (sq->queue.head == NULL) {
|
if (sq->queue.head == NULL) {
|
||||||
if (!blocked) {
|
if (!blocked) {
|
||||||
chain.head = NULL;
|
qinfo->head = qinfo->tail = NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -120,27 +119,30 @@ void *sorted_queue_pop_all_ex(struct sorted_queue *sq,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sq->queue.head == NULL) {
|
if (sq->queue.head == NULL) {
|
||||||
chain.head = NULL;
|
qinfo->head = qinfo->tail = NULL;
|
||||||
} else {
|
} else {
|
||||||
if (sq->compare_func(sq->queue.head, less_equal) <= 0) {
|
if (sq->compare_func(sq->queue.head, less_equal) <= 0) {
|
||||||
chain.head = chain.tail = sq->queue.head;
|
qinfo->head = qinfo->tail = sq->queue.head;
|
||||||
sq->queue.head = FC_QUEUE_NEXT_PTR(&sq->queue, sq->queue.head);
|
sq->queue.head = FC_QUEUE_NEXT_PTR(&sq->queue,
|
||||||
while (sq->compare_func(sq->queue.head, less_equal) <= 0) {
|
sq->queue.head);
|
||||||
chain.tail = sq->queue.head;
|
while (sq->queue.head != NULL && sq->compare_func(
|
||||||
sq->queue.head = FC_QUEUE_NEXT_PTR(&sq->queue, sq->queue.head);
|
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) {
|
if (sq->queue.head == NULL) {
|
||||||
sq->queue.tail = NULL;
|
sq->queue.tail = NULL;
|
||||||
} else {
|
} else {
|
||||||
FC_QUEUE_NEXT_PTR(&sq->queue, chain.tail) = NULL;
|
FC_QUEUE_NEXT_PTR(&sq->queue, qinfo->tail) = NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
chain.head = NULL;
|
qinfo->head = qinfo->tail = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while (0);
|
} while (0);
|
||||||
|
|
||||||
PTHREAD_MUTEX_UNLOCK(&sq->queue.lc_pair.lock);
|
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) \
|
#define sorted_queue_try_pop(sq, less_equal) \
|
||||||
sorted_queue_pop_ex(sq, less_equal, false)
|
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) \
|
#define sorted_queue_pop_all(sq, less_equal) \
|
||||||
sorted_queue_pop_all_ex(sq, less_equal, true)
|
sorted_queue_pop_all_ex(sq, less_equal, true)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue