From 2c5734ab22983e3b3abacc491ed84951a7cc86bb Mon Sep 17 00:00:00 2001 From: YuQing <384681@qq.com> Date: Mon, 8 May 2023 17:48:28 +0800 Subject: [PATCH] add function uniq_skiplist_clear --- HISTORY | 3 ++- src/tests/test_uniq_skiplist.c | 17 ++++++++++++++--- src/uniq_skiplist.h | 13 +++++++++++++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/HISTORY b/HISTORY index fc6fc35..fc85850 100644 --- a/HISTORY +++ b/HISTORY @@ -1,8 +1,9 @@ -Version 1.66 2023-05-04 +Version 1.66 2023-05-08 * struct fast_task_info add field: notify_next for nio notify queue * lc_pair in struct fc_queue change to lcp * sorted queue use double link chain for quick push + * add function uniq_skiplist_clear Version 1.65 2023-01-09 * locked_list.h: add functions locked_list_move and locked_list_move_tail diff --git a/src/tests/test_uniq_skiplist.c b/src/tests/test_uniq_skiplist.c index beed169..09b0e6a 100644 --- a/src/tests/test_uniq_skiplist.c +++ b/src/tests/test_uniq_skiplist.c @@ -149,6 +149,19 @@ static void test_delete() assert(i==0); } +static void test_clear() +{ + int64_t start_time; + int64_t end_time; + + start_time = get_current_time_ms(); + uniq_skiplist_clear(sl); + assert(uniq_skiplist_empty(sl)); + assert(instance_count == 0); + end_time = get_current_time_ms(); + printf("clear time used: %"PRId64" ms\n", end_time - start_time); +} + static void test_find_range() { int n_start; @@ -302,10 +315,8 @@ int main(int argc, char *argv[]) test_insert(); printf("\n"); - /* - test_delete(); + test_clear(); printf("\n"); - */ printf("skiplist level_count: %d\n", sl->top_level_index + 1); diff --git a/src/uniq_skiplist.h b/src/uniq_skiplist.h index 2bcbcd3..5eabf15 100644 --- a/src/uniq_skiplist.h +++ b/src/uniq_skiplist.h @@ -253,6 +253,19 @@ static inline bool uniq_skiplist_empty(UniqSkiplist *sl) return sl->top->links[0] == sl->factory->tail; } +static inline void uniq_skiplist_clear(UniqSkiplist *sl) +{ + volatile UniqSkiplistNode *current; + volatile UniqSkiplistNode *deleted; + + current = sl->top->links[0]; + while (current != sl->factory->tail) { + deleted = current; + current = current->links[0]; + uniq_skiplist_delete(sl, deleted->data); + } +} + #define LEVEL0_DOUBLE_CHAIN_NEXT_LINK(node) node->links[0] #define LEVEL0_DOUBLE_CHAIN_PREV_LINK(node) node->links[node->level_index + 1] #define LEVEL0_DOUBLE_CHAIN_TAIL(sl) LEVEL0_DOUBLE_CHAIN_PREV_LINK(sl->top)