summaryrefslogtreecommitdiff
path: root/lib/lists.c
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2022-07-18 10:19:59 +0200
committerMaria Matejka <mq@ucw.cz>2022-07-18 10:19:59 +0200
commit636ab95f44efee774343f711ec46e69c6bea4e81 (patch)
tree6267dac5e8c14779f69d125c2a7ca7ee4907409c /lib/lists.c
parent05673b16a87792baf8734dfcbf12ac2fd867f80b (diff)
parenta845651bc50b75b2be41b4427e04857ce3c106a6 (diff)
Merge commit 'a845651b' into thread-next
Diffstat (limited to 'lib/lists.c')
-rw-r--r--lib/lists.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/lib/lists.c b/lib/lists.c
index 200576cf..1aa58085 100644
--- a/lib/lists.c
+++ b/lib/lists.c
@@ -35,11 +35,12 @@ check_list(list *l, node *n)
if (!l)
{
ASSERT_DIE(n);
- ASSERT_DIE(n->prev);
- do { n = n->prev; } while (n->prev);
+ node *nn = n;
+ while (nn->prev)
+ nn = nn->prev;
- l = SKIP_BACK(list, head_node, n);
+ l = SKIP_BACK(list, head_node, nn);
}
int seen = 0;
@@ -60,7 +61,7 @@ check_list(list *l, node *n)
}
ASSERT_DIE(cur == &(l->tail_node));
- ASSERT_DIE(!n || (seen == 1));
+ ASSERT_DIE(!n || (seen == 1) || (n == &l->head_node) || (n == &l->tail_node));
return 1;
}
@@ -120,7 +121,7 @@ add_head(list *l, node *n)
LIST_INLINE void
insert_node(node *n, node *after)
{
- EXPENSIVE_CHECK(check_list(l, after));
+ EXPENSIVE_CHECK(check_list(NULL, after));
ASSUME(n->prev == NULL);
ASSUME(n->next == NULL);
@@ -141,7 +142,7 @@ insert_node(node *n, node *after)
LIST_INLINE void
rem_node(node *n)
{
- EXPENSIVE_CHECK(check_list(NULL, n));
+ EXPENSIVE_CHECK((n == n->prev) && (n == n->next) || check_list(NULL, n));
node *z = n->prev;
node *x = n->next;