summaryrefslogtreecommitdiff
path: root/deps/jemalloc/test/unit/ql.c
diff options
context:
space:
mode:
authorOran Agra <oran@redislabs.com>2023-05-07 17:41:17 +0300
committerGitHub <noreply@github.com>2023-05-07 17:41:17 +0300
commit07d54dc5baa1b2e7adb5ce8e7bee398d376fe13b (patch)
treebd5b11001e44bac9cc2100dfae0af96c31bc4e99 /deps/jemalloc/test/unit/ql.c
parent42dd98ec191fd71528785bd7d31bd18112078f66 (diff)
parent0897c8afedc210db5f827bed9d225f24011245eb (diff)
downloadredis-07d54dc5baa1b2e7adb5ce8e7bee398d376fe13b.tar.gz
Merge pull request #12115 from oranagra/update_jemalloc_5_3_0
Upgrade to jemalloc 5.3.0 hoping to resolve a potential for deadlock in a fork child see https://github.com/jemalloc/jemalloc/issues/2402 steps: * Upgrade subtree according to the instructions in deps/README * update iget_defrag_hint by following changes to arena_dalloc_no_tcache
Diffstat (limited to 'deps/jemalloc/test/unit/ql.c')
-rw-r--r--deps/jemalloc/test/unit/ql.c139
1 files changed, 126 insertions, 13 deletions
diff --git a/deps/jemalloc/test/unit/ql.c b/deps/jemalloc/test/unit/ql.c
index b76c24c41..f9130582f 100644
--- a/deps/jemalloc/test/unit/ql.c
+++ b/deps/jemalloc/test/unit/ql.c
@@ -18,21 +18,22 @@ test_empty_list(list_head_t *head) {
list_t *t;
unsigned i;
- assert_ptr_null(ql_first(head), "Unexpected element for empty list");
- assert_ptr_null(ql_last(head, link),
+ expect_true(ql_empty(head), "Unexpected element for empty list");
+ expect_ptr_null(ql_first(head), "Unexpected element for empty list");
+ expect_ptr_null(ql_last(head, link),
"Unexpected element for empty list");
i = 0;
ql_foreach(t, head, link) {
i++;
}
- assert_u_eq(i, 0, "Unexpected element for empty list");
+ expect_u_eq(i, 0, "Unexpected element for empty list");
i = 0;
ql_reverse_foreach(t, head, link) {
i++;
}
- assert_u_eq(i, 0, "Unexpected element for empty list");
+ expect_u_eq(i, 0, "Unexpected element for empty list");
}
TEST_BEGIN(test_ql_empty) {
@@ -58,34 +59,35 @@ test_entries_list(list_head_t *head, list_t *entries, unsigned nentries) {
list_t *t;
unsigned i;
- assert_c_eq(ql_first(head)->id, entries[0].id, "Element id mismatch");
- assert_c_eq(ql_last(head, link)->id, entries[nentries-1].id,
+ expect_false(ql_empty(head), "List should not be empty");
+ expect_c_eq(ql_first(head)->id, entries[0].id, "Element id mismatch");
+ expect_c_eq(ql_last(head, link)->id, entries[nentries-1].id,
"Element id mismatch");
i = 0;
ql_foreach(t, head, link) {
- assert_c_eq(t->id, entries[i].id, "Element id mismatch");
+ expect_c_eq(t->id, entries[i].id, "Element id mismatch");
i++;
}
i = 0;
ql_reverse_foreach(t, head, link) {
- assert_c_eq(t->id, entries[nentries-i-1].id,
+ expect_c_eq(t->id, entries[nentries-i-1].id,
"Element id mismatch");
i++;
}
for (i = 0; i < nentries-1; i++) {
t = ql_next(head, &entries[i], link);
- assert_c_eq(t->id, entries[i+1].id, "Element id mismatch");
+ expect_c_eq(t->id, entries[i+1].id, "Element id mismatch");
}
- assert_ptr_null(ql_next(head, &entries[nentries-1], link),
+ expect_ptr_null(ql_next(head, &entries[nentries-1], link),
"Unexpected element");
- assert_ptr_null(ql_prev(head, &entries[0], link), "Unexpected element");
+ expect_ptr_null(ql_prev(head, &entries[0], link), "Unexpected element");
for (i = 1; i < nentries; i++) {
t = ql_prev(head, &entries[i], link);
- assert_c_eq(t->id, entries[i-1].id, "Element id mismatch");
+ expect_c_eq(t->id, entries[i-1].id, "Element id mismatch");
}
}
@@ -192,6 +194,114 @@ TEST_BEGIN(test_ql_insert) {
}
TEST_END
+static void
+test_concat_split_entries(list_t *entries, unsigned nentries_a,
+ unsigned nentries_b) {
+ init_entries(entries, nentries_a + nentries_b);
+
+ list_head_t head_a;
+ ql_new(&head_a);
+ for (unsigned i = 0; i < nentries_a; i++) {
+ ql_tail_insert(&head_a, &entries[i], link);
+ }
+ if (nentries_a == 0) {
+ test_empty_list(&head_a);
+ } else {
+ test_entries_list(&head_a, entries, nentries_a);
+ }
+
+ list_head_t head_b;
+ ql_new(&head_b);
+ for (unsigned i = 0; i < nentries_b; i++) {
+ ql_tail_insert(&head_b, &entries[nentries_a + i], link);
+ }
+ if (nentries_b == 0) {
+ test_empty_list(&head_b);
+ } else {
+ test_entries_list(&head_b, entries + nentries_a, nentries_b);
+ }
+
+ ql_concat(&head_a, &head_b, link);
+ if (nentries_a + nentries_b == 0) {
+ test_empty_list(&head_a);
+ } else {
+ test_entries_list(&head_a, entries, nentries_a + nentries_b);
+ }
+ test_empty_list(&head_b);
+
+ if (nentries_b == 0) {
+ return;
+ }
+
+ list_head_t head_c;
+ ql_split(&head_a, &entries[nentries_a], &head_c, link);
+ if (nentries_a == 0) {
+ test_empty_list(&head_a);
+ } else {
+ test_entries_list(&head_a, entries, nentries_a);
+ }
+ test_entries_list(&head_c, entries + nentries_a, nentries_b);
+}
+
+TEST_BEGIN(test_ql_concat_split) {
+ list_t entries[NENTRIES];
+
+ test_concat_split_entries(entries, 0, 0);
+
+ test_concat_split_entries(entries, 0, 1);
+ test_concat_split_entries(entries, 1, 0);
+
+ test_concat_split_entries(entries, 0, NENTRIES);
+ test_concat_split_entries(entries, 1, NENTRIES - 1);
+ test_concat_split_entries(entries, NENTRIES / 2,
+ NENTRIES - NENTRIES / 2);
+ test_concat_split_entries(entries, NENTRIES - 1, 1);
+ test_concat_split_entries(entries, NENTRIES, 0);
+}
+TEST_END
+
+TEST_BEGIN(test_ql_rotate) {
+ list_head_t head;
+ list_t entries[NENTRIES];
+ unsigned i;
+
+ ql_new(&head);
+ init_entries(entries, sizeof(entries)/sizeof(list_t));
+ for (i = 0; i < NENTRIES; i++) {
+ ql_tail_insert(&head, &entries[i], link);
+ }
+
+ char head_id = ql_first(&head)->id;
+ for (i = 0; i < NENTRIES; i++) {
+ assert_c_eq(ql_first(&head)->id, head_id, "");
+ ql_rotate(&head, link);
+ assert_c_eq(ql_last(&head, link)->id, head_id, "");
+ head_id++;
+ }
+ test_entries_list(&head, entries, NENTRIES);
+}
+TEST_END
+
+TEST_BEGIN(test_ql_move) {
+ list_head_t head_dest, head_src;
+ list_t entries[NENTRIES];
+ unsigned i;
+
+ ql_new(&head_src);
+ ql_move(&head_dest, &head_src);
+ test_empty_list(&head_src);
+ test_empty_list(&head_dest);
+
+ init_entries(entries, sizeof(entries)/sizeof(list_t));
+ for (i = 0; i < NENTRIES; i++) {
+ ql_tail_insert(&head_src, &entries[i], link);
+ }
+ ql_move(&head_dest, &head_src);
+ test_empty_list(&head_src);
+ test_entries_list(&head_dest, entries, NENTRIES);
+}
+TEST_END
+
int
main(void) {
return test(
@@ -200,5 +310,8 @@ main(void) {
test_ql_tail_remove,
test_ql_head_insert,
test_ql_head_remove,
- test_ql_insert);
+ test_ql_insert,
+ test_ql_concat_split,
+ test_ql_rotate,
+ test_ql_move);
}