Skip to content

Commit adce85f

Browse files
bratpiorkaldorau
authored andcommitted
Use atomics in critnib find_*
It fixes ThreadSanitizer data race in find_predecessor() vs critnib_insert() and critnib_remove(). Signed-off-by: Lukasz Dorau <[email protected]>
1 parent 23cbc0c commit adce85f

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

src/critnib/critnib.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,9 @@ find_predecessor(struct critnib_node *__restrict n) {
525525
while (1) {
526526
int nib;
527527
for (nib = NIB; nib >= 0; nib--) {
528-
if (n->child[nib]) {
528+
struct critnib_node *m;
529+
utils_atomic_load_acquire_ptr((void **)&n->child[nib], (void **)&m);
530+
if (m) {
529531
break;
530532
}
531533
}
@@ -534,7 +536,7 @@ find_predecessor(struct critnib_node *__restrict n) {
534536
return NULL;
535537
}
536538

537-
n = n->child[nib];
539+
utils_atomic_load_acquire_ptr((void **)&n->child[nib], (void **)&n);
538540
if (is_leaf(n)) {
539541
return to_leaf(n);
540542
}

0 commit comments

Comments
 (0)