sorted_queue.[hc]: sorted_queue_pop and sorted_queue_pop_all

fstore_storage_engine
YuQing 2023-05-04 20:05:32 +08:00
parent 6dbc8b8937
commit 428d13a07b
3 changed files with 80 additions and 18 deletions

View File

@ -70,17 +70,48 @@ void sorted_queue_push_ex(struct sorted_queue *sq, void *data, bool *notify)
} }
fc_list_add_after(dlink, current); fc_list_add_after(dlink, current);
*notify = false; *notify = false;
if (count >= 10) {
logInfo("================== compare count: %d ==========", count);
}
} }
} }
PTHREAD_MUTEX_UNLOCK(&sq->lcp.lock); PTHREAD_MUTEX_UNLOCK(&sq->lcp.lock);
} }
void sorted_queue_pop_ex(struct sorted_queue *sq, void *less_equal, void *sorted_queue_pop_ex(struct sorted_queue *sq,
void *less_equal, const bool blocked)
{
void *data;
struct fc_list_head *current;
PTHREAD_MUTEX_LOCK(&sq->lcp.lock);
do {
if (fc_list_empty(&sq->head)) {
if (!blocked) {
data = NULL;
break;
}
pthread_cond_wait(&sq->lcp.cond,
&sq->lcp.lock);
if (fc_list_empty(&sq->head)) {
data = NULL;
break;
}
}
current = sq->head.next;
data = FC_SORTED_QUEUE_DATA_PTR(sq, current);
if (sq->compare_func(data, less_equal) <= 0) {
fc_list_del_init(current);
} else {
data = NULL;
}
} while (0);
PTHREAD_MUTEX_UNLOCK(&sq->lcp.lock);
return data;
}
void sorted_queue_pop_all_ex(struct sorted_queue *sq, void *less_equal,
struct fc_list_head *head, const bool blocked) struct fc_list_head *head, const bool blocked)
{ {
struct fc_list_head *current; struct fc_list_head *current;

View File

@ -78,14 +78,23 @@ static inline void sorted_queue_push_silence(
sorted_queue_push_ex(sq, data, &notify); sorted_queue_push_ex(sq, data, &notify);
} }
void sorted_queue_pop_ex(struct sorted_queue *sq, void *less_equal, void *sorted_queue_pop_ex(struct sorted_queue *sq,
void *less_equal, const bool blocked);
#define sorted_queue_pop(sq, less_equal) \
sorted_queue_pop_ex(sq, less_equal, true)
#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,
struct fc_list_head *head, const bool blocked); struct fc_list_head *head, const bool blocked);
#define sorted_queue_pop(sq, less_equal, head) \ #define sorted_queue_pop_all(sq, less_equal, head) \
sorted_queue_pop_ex(sq, less_equal, head, true) sorted_queue_pop_all_ex(sq, less_equal, head, true)
#define sorted_queue_try_pop(sq, less_equal, head) \ #define sorted_queue_try_pop_all(sq, less_equal, head) \
sorted_queue_pop_ex(sq, less_equal, head, false) sorted_queue_pop_all_ex(sq, less_equal, head, false)
static inline bool sorted_queue_empty(struct sorted_queue *sq) static inline bool sorted_queue_empty(struct sorted_queue *sq)
{ {

View File

@ -72,13 +72,12 @@ static void test1()
struct fc_list_head head; struct fc_list_head head;
set_rand_numbers(1); set_rand_numbers(1);
for (i=0; i<COUNT; i++) { for (i=0; i<COUNT; i++) {
sorted_queue_push_silence(&sq, numbers + i); sorted_queue_push_silence(&sq, numbers + i);
} }
less_equal.n = COUNT; less_equal.n = COUNT;
sorted_queue_try_pop(&sq, &less_equal, &head); sorted_queue_try_pop_all(&sq, &less_equal, &head);
assert(sorted_queue_empty(&sq)); assert(sorted_queue_empty(&sq));
i = 0; i = 0;
@ -91,7 +90,7 @@ static void test1()
} }
assert(i == COUNT); assert(i == COUNT);
sorted_queue_try_pop(&sq, &less_equal, &head); sorted_queue_try_pop_all(&sq, &less_equal, &head);
assert(fc_list_empty(&head)); assert(fc_list_empty(&head));
} }
@ -105,17 +104,16 @@ static void test2()
struct fc_list_head head; struct fc_list_head head;
set_rand_numbers(MULTIPLE); set_rand_numbers(MULTIPLE);
for (i=0; i<COUNT; i++) { for (i=0; i<COUNT; i++) {
sorted_queue_push_silence(&sq, numbers + i); sorted_queue_push_silence(&sq, numbers + i);
} }
less_equal.n = 0; less_equal.n = 0;
sorted_queue_try_pop(&sq, &less_equal, &head); sorted_queue_try_pop_all(&sq, &less_equal, &head);
assert(fc_list_empty(&head)); assert(fc_list_empty(&head));
less_equal.n = COUNT; less_equal.n = COUNT;
sorted_queue_try_pop(&sq, &less_equal, &head); sorted_queue_try_pop_all(&sq, &less_equal, &head);
assert(!sorted_queue_empty(&sq)); assert(!sorted_queue_empty(&sq));
i = 0; i = 0;
@ -128,7 +126,7 @@ static void test2()
} }
less_equal.n = 2 * COUNT + 1; less_equal.n = 2 * COUNT + 1;
sorted_queue_try_pop(&sq, &less_equal, &head); sorted_queue_try_pop_all(&sq, &less_equal, &head);
assert(sorted_queue_empty(&sq)); assert(sorted_queue_empty(&sq));
fc_list_for_each_entry (number, &head, dlink) { fc_list_for_each_entry (number, &head, dlink) {
n = i++ * MULTIPLE + 1; n = i++ * MULTIPLE + 1;
@ -140,6 +138,30 @@ static void test2()
assert(i == COUNT); assert(i == COUNT);
} }
static void test3()
{
int i;
DoubleLinkNumber less_equal;
DoubleLinkNumber *number;
set_rand_numbers(1);
for (i=0; i<COUNT; i++) {
sorted_queue_push_silence(&sq, numbers + i);
}
less_equal.n = COUNT;
for (i=1; i<=COUNT; i++) {
number = sorted_queue_try_pop(&sq, &less_equal);
assert(number != NULL);
if (i != number->n) {
fprintf(stderr, "i: %d != value: %d\n", i, number->n);
break;
}
}
assert(sorted_queue_try_pop(&sq, &less_equal) == NULL);
}
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int result; int result;
@ -160,9 +182,9 @@ int main(int argc, char *argv[])
test1(); test1();
test2(); test2();
test3();
end_time = get_current_time_ms(); end_time = get_current_time_ms();
printf("pass OK, time used: %"PRId64" ms\n", end_time - start_time); printf("pass OK, time used: %"PRId64" ms\n", end_time - start_time);
return 0; return 0;
} }