X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=rculfhash.c;h=1eda2dd858981477041fcdcee252c78d224127c2;hp=75e5ece96c9edb3e462b861fe61e682561d7a1c4;hb=2e79c44597547799d9501940b660f676a559b738;hpb=bc8c3c74b84e838b195faa8871344f5b672ae1cd diff --git a/rculfhash.c b/rculfhash.c index 75e5ece..1eda2dd 100644 --- a/rculfhash.c +++ b/rculfhash.c @@ -1517,11 +1517,22 @@ struct cds_lfht_node *cds_lfht_add_replace(struct cds_lfht *ht, } } -int cds_lfht_replace(struct cds_lfht *ht, struct cds_lfht_iter *old_iter, +int cds_lfht_replace(struct cds_lfht *ht, + struct cds_lfht_iter *old_iter, + unsigned long hash, + cds_lfht_match_fct match, + const void *key, struct cds_lfht_node *new_node) { unsigned long size; + new_node->reverse_hash = bit_reverse_ulong((unsigned long) hash); + if (!old_iter->node) + return -ENOENT; + if (caa_unlikely(old_iter->node->reverse_hash != new_node->reverse_hash)) + return -EINVAL; + if (caa_unlikely(!match(old_iter->node, key))) + return -EINVAL; size = rcu_dereference(ht->size); return _cds_lfht_replace(ht, size, old_iter->node, old_iter->next, new_node);