X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=rculfhash.c;h=f1e6674bd7f1cc63f6eb09a0946904fc1dfc4f10;hb=dd4505e03a99bb149c71ebabfa5d5e372a61d737;hp=497a9eacdebd764771d1e6e2e88a95c019f83724;hpb=732ad076c182b3ad706cd62f8a6694f921e1bb7c;p=urcu.git diff --git a/rculfhash.c b/rculfhash.c index 497a9ea..f1e6674 100644 --- a/rculfhash.c +++ b/rculfhash.c @@ -46,7 +46,8 @@ #define dbg_printf(args...) #endif -#define BUCKET_SIZE_RESIZE_THRESHOLD 4 +#define CHAIN_LEN_TARGET 4 +#define CHAIN_LEN_RESIZE_THRESHOLD 16 #ifndef max #define max(a, b) ((a) > (b) ? (a) : (b)) @@ -165,8 +166,9 @@ static void check_resize(struct rcu_ht *ht, struct rcu_table *t, uint32_t chain_len) { - if (chain_len >= BUCKET_SIZE_RESIZE_THRESHOLD) - ht_resize_lazy(ht, t, log2_u32(chain_len)); + if (chain_len >= CHAIN_LEN_RESIZE_THRESHOLD) + ht_resize_lazy(ht, t, + log2_u32(chain_len - CHAIN_LEN_TARGET)); } static @@ -218,7 +220,7 @@ void _ht_add(struct rcu_ht *ht, struct rcu_table *t, struct rcu_ht_node *node) iter = clear_flag(rcu_dereference(iter_prev->next)); if (unlikely(!iter)) break; - if (iter->reverse_hash < node->reverse_hash) + if (iter->reverse_hash > node->reverse_hash) break; iter_prev = iter; check_resize(ht, t, ++chain_len); @@ -253,7 +255,7 @@ retry: iter = clear_flag(rcu_dereference(iter_prev->next)); if (unlikely(!iter)) break; - if (iter->reverse_hash < node->reverse_hash) + if (unlikely(iter->reverse_hash > node->reverse_hash)) break; if (iter == node) { found = 1; @@ -353,12 +355,12 @@ struct rcu_ht_node *ht_lookup(struct rcu_ht *ht, void *key, size_t key_len) for (;;) { if (unlikely(!node)) break; - if (node->reverse_hash > reverse_hash) { + if (unlikely(node->reverse_hash > reverse_hash)) { node = NULL; break; } if (!ht->compare_fct(node->key, node->key_len, key, key_len)) { - if (is_removed(rcu_dereference(node->next))) + if (unlikely(is_removed(rcu_dereference(node->next)))) node = NULL; break; }