X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=rculfhash.c;h=2565099d2c12b633dce919e927363b10ff63912c;hp=f6c901bb0d4f242ecfa5b8bce0077313bee56f54;hb=bd4db1530ed788ea97c8a9e4c0d04ef757181ad6;hpb=21263e2119a45df1dfa25e71e7a4dd15af73f791 diff --git a/rculfhash.c b/rculfhash.c index f6c901b..2565099 100644 --- a/rculfhash.c +++ b/rculfhash.c @@ -672,6 +672,13 @@ void _cds_lfht_gc_bucket(struct cds_lfht_node *dummy, struct cds_lfht_node *node /* We can always skip the dummy node initially */ iter = rcu_dereference(iter_prev->p.next); assert(iter_prev->p.reverse_hash <= node->p.reverse_hash); + /* + * We should never be called with dummy (start of chain) + * and logically removed node (end of path compression + * marker) being the actual same node. This would be a + * bug in the algorithm implementation. + */ + assert(dummy != node); for (;;) { if (unlikely(!clear_flag(iter))) return; @@ -895,7 +902,7 @@ void fini_table(struct cds_lfht *ht, struct rcu_table *t, * removal so gc lookups use non-logically-removed dummy * nodes. */ - t->size = 1UL << (i - 2); + t->size = (i == 1) ? 0 : 1UL << (i - 2); /* Unlink */ for (j = 0; j < len; j++) { struct cds_lfht_node *fini_node =