X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=rculfhash.c;h=a736b868ae7dac21c1d4d60d561cfcfbb1d223e9;hb=194fdbd18a42d2c23f4a53cc692f1fa03d31ec64;hp=d733d6bd53da2cab4b849e343656ce53df4326f7;hpb=960c9e4ff8e6028f5a0d4b1c1d747b20f08c5177;p=urcu.git diff --git a/rculfhash.c b/rculfhash.c index d733d6b..a736b86 100644 --- a/rculfhash.c +++ b/rculfhash.c @@ -724,7 +724,12 @@ struct _cds_lfht_node *lookup_bucket(struct cds_lfht *ht, unsigned long size, assert(size > 0); index = hash & (size - 1); - order = get_count_order_ulong(index + 1); + /* + * equivalent to get_count_order_ulong(index + 1), but optimizes + * away the non-existing 0 special-case for + * get_count_order_ulong. + */ + order = fls_ulong(index); dbg_printf("lookup hash %lu index %lu order %lu aridx %lu\n", hash, index, order, index & (!order ? 0 : ((1UL << (order - 1)) - 1))); @@ -882,11 +887,15 @@ struct cds_lfht_node *_cds_lfht_add(struct cds_lfht *ht, goto insert; if (likely(clear_flag(iter)->p.reverse_hash > node->p.reverse_hash)) goto insert; + /* dummy node is the first node of the identical-hash-value chain */ + if (dummy && clear_flag(iter)->p.reverse_hash == node->p.reverse_hash) + goto insert; next = rcu_dereference(clear_flag(iter)->p.next); if (unlikely(is_removed(next))) goto gc_node; if ((mode == ADD_UNIQUE || mode == ADD_REPLACE) && !is_dummy(next) + && clear_flag(iter)->p.reverse_hash == node->p.reverse_hash && !ht->compare_fct(node->key, node->key_len, clear_flag(iter)->key, clear_flag(iter)->key_len)) { @@ -1336,6 +1345,7 @@ void cds_lfht_lookup(struct cds_lfht *ht, void *key, size_t key_len, next = rcu_dereference(node->p.next); if (likely(!is_removed(next)) && !is_dummy(next) + && clear_flag(node)->p.reverse_hash == reverse_hash && likely(!ht->compare_fct(node->key, node->key_len, key, key_len))) { break; }