diff --git a/HISTORY b/HISTORY index 8f39a6b..30a45f4 100644 --- a/HISTORY +++ b/HISTORY @@ -1,10 +1,11 @@ -Version 1.67 2023-05-19 +Version 1.67 2023-05-23 * lc_pair in struct fc_queue change to lcp * sorted queue use double link chain for quick push * add function uniq_skiplist_clear * fast_mblock_malloc_trunk_notify_func prototype changed * fast_mblock_init_ex2 add parameter prealloc_trunk_count + * sorted_queue.[hc] support pop_compare_func Version 1.66 2023-02-12 * struct fast_task_info add field: notify_next for nio notify queue diff --git a/src/sorted_queue.c b/src/sorted_queue.c index 67389b6..9202950 100644 --- a/src/sorted_queue.c +++ b/src/sorted_queue.c @@ -18,8 +18,9 @@ #include "pthread_func.h" #include "sorted_queue.h" -int sorted_queue_init(struct sorted_queue *sq, const int dlink_offset, - int (*compare_func)(const void *, const void *)) +int sorted_queue_init_ex(struct sorted_queue *sq, const int dlink_offset, + int (*push_compare_func)(const void *data1, const void *data2), + int (*pop_compare_func)(const void *data, const void *less_equal)) { int result; @@ -29,7 +30,8 @@ int sorted_queue_init(struct sorted_queue *sq, const int dlink_offset, FC_INIT_LIST_HEAD(&sq->head); sq->dlink_offset = dlink_offset; - sq->compare_func = compare_func; + sq->push_compare_func = push_compare_func; + sq->pop_compare_func = pop_compare_func; return 0; } @@ -50,19 +52,19 @@ void sorted_queue_push_ex(struct sorted_queue *sq, void *data, bool *notify) fc_list_add(dlink, &sq->head); *notify = true; } else { - if (sq->compare_func(data, FC_SORTED_QUEUE_DATA_PTR( + if (sq->push_compare_func(data, FC_SORTED_QUEUE_DATA_PTR( sq, sq->head.prev)) >= 0) { fc_list_add_tail(dlink, &sq->head); *notify = false; - } else if (sq->compare_func(data, FC_SORTED_QUEUE_DATA_PTR( + } else if (sq->push_compare_func(data, FC_SORTED_QUEUE_DATA_PTR( sq, sq->head.next)) < 0) { fc_list_add(dlink, &sq->head); *notify = true; } else { current = sq->head.prev->prev; - while (sq->compare_func(data, FC_SORTED_QUEUE_DATA_PTR( + while (sq->push_compare_func(data, FC_SORTED_QUEUE_DATA_PTR( sq, current)) < 0) { current = current->prev; @@ -100,7 +102,7 @@ void *sorted_queue_pop_ex(struct sorted_queue *sq, current = sq->head.next; data = FC_SORTED_QUEUE_DATA_PTR(sq, current); - if (sq->compare_func(data, less_equal) <= 0) { + if (sq->pop_compare_func(data, less_equal) <= 0) { fc_list_del_init(current); } else { data = NULL; @@ -133,13 +135,13 @@ void sorted_queue_pop_to_chain_ex(struct sorted_queue *sq, FC_INIT_LIST_HEAD(head); } else { current = sq->head.next; - if (sq->compare_func(FC_SORTED_QUEUE_DATA_PTR( + if (sq->pop_compare_func(FC_SORTED_QUEUE_DATA_PTR( sq, current), less_equal) <= 0) { head->next = current; current->prev = head; current = current->next; - while (current != &sq->head && sq->compare_func( + while (current != &sq->head && sq->pop_compare_func( FC_SORTED_QUEUE_DATA_PTR(sq, current), less_equal) <= 0) { diff --git a/src/sorted_queue.h b/src/sorted_queue.h index 9fb0cf8..70e521f 100644 --- a/src/sorted_queue.h +++ b/src/sorted_queue.h @@ -26,7 +26,8 @@ struct sorted_queue struct fc_list_head head; pthread_lock_cond_pair_t lcp; int dlink_offset; - int (*compare_func)(const void *, const void *); + int (*push_compare_func)(const void *data1, const void *data2); + int (*pop_compare_func)(const void *data, const void *less_equal); }; #define FC_SORTED_QUEUE_DLINK_PTR(sq, data) \ @@ -39,8 +40,17 @@ struct sorted_queue extern "C" { #endif -int sorted_queue_init(struct sorted_queue *sq, const int dlink_offset, - int (*compare_func)(const void *, const void *)); +int sorted_queue_init_ex(struct sorted_queue *sq, const int dlink_offset, + int (*push_compare_func)(const void *data1, const void *data2), + int (*pop_compare_func)(const void *data, const void *less_equal)); + +static inline int sorted_queue_init(struct sorted_queue *sq, + const int dlink_offset, int (*compare_func) + (const void *data1, const void *data2)) +{ + return sorted_queue_init_ex(sq, dlink_offset, + compare_func, compare_func); +} void sorted_queue_destroy(struct sorted_queue *sq);