X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=rculfhash.c;h=0d8c5d6150ae9fa9eecc05d46b96e2ff4e6ef44c;hp=5baa2d415b34483486ece296cb9c511ae2cf0714;hb=9b35f1e4c8561fd8937ab394e65cc9b230ea854d;hpb=479c8a32f3a1c319e9e1a18692b47992d393ee38 diff --git a/rculfhash.c b/rculfhash.c index 5baa2d4..0d8c5d6 100644 --- a/rculfhash.c +++ b/rculfhash.c @@ -259,7 +259,7 @@ int _ht_add(struct rcu_ht *ht, struct rcu_table *t, struct rcu_ht_node *node, goto insert; next = rcu_dereference(clear_flag(iter)->next); if (is_removed(next)) - goto gc; + goto gc_node; /* Only account for identical reverse hash once */ if (iter_prev->reverse_hash != clear_flag(iter)->reverse_hash) check_resize(ht, t, ++chain_len); @@ -276,10 +276,9 @@ int _ht_add(struct rcu_ht *ht, struct rcu_table *t, struct rcu_ht_node *node, continue; /* retry */ else goto gc_end; - gc: - /* Garbage collect logically removed nodes in the bucket */ - dummy = rcu_dereference(t->tbl[node->hash & (t->size - 1)]); - _ht_gc_bucket(dummy, node); + gc_node: + assert(!is_removed(iter)); + (void) uatomic_cmpxchg(&iter_prev->next, iter, clear_flag(next)); /* retry */ } gc_end: