From adce85f9c05d0230a1fba5dbac6686546b4bf286 Mon Sep 17 00:00:00 2001 From: Rafal Rudnicki Date: Mon, 3 Mar 2025 22:09:41 +0000 Subject: [PATCH] Use atomics in critnib find_* It fixes ThreadSanitizer data race in find_predecessor() vs critnib_insert() and critnib_remove(). Signed-off-by: Lukasz Dorau --- src/critnib/critnib.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/critnib/critnib.c b/src/critnib/critnib.c index 1adb2dc7e..5c3a65dfd 100644 --- a/src/critnib/critnib.c +++ b/src/critnib/critnib.c @@ -525,7 +525,9 @@ find_predecessor(struct critnib_node *__restrict n) { while (1) { int nib; for (nib = NIB; nib >= 0; nib--) { - if (n->child[nib]) { + struct critnib_node *m; + utils_atomic_load_acquire_ptr((void **)&n->child[nib], (void **)&m); + if (m) { break; } } @@ -534,7 +536,7 @@ find_predecessor(struct critnib_node *__restrict n) { return NULL; } - n = n->child[nib]; + utils_atomic_load_acquire_ptr((void **)&n->child[nib], (void **)&n); if (is_leaf(n)) { return to_leaf(n); }