projects
/
urcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
cds_lfht_replace: add checks for old/new node hash/value match
[urcu.git]
/
rculfhash.c
diff --git
a/rculfhash.c
b/rculfhash.c
index f214293196a6094958e8274e09aaf73bb627f276..1eda2dd858981477041fcdcee252c78d224127c2 100644
(file)
--- a/
rculfhash.c
+++ b/
rculfhash.c
@@
-1517,25
+1517,36
@@
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;
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);
}
size = rcu_dereference(ht->size);
return _cds_lfht_replace(ht, size, old_iter->node, old_iter->next,
new_node);
}
-int cds_lfht_del(struct cds_lfht *ht, struct cds_lfht_
iter *iter
)
+int cds_lfht_del(struct cds_lfht *ht, struct cds_lfht_
node *node
)
{
unsigned long size, hash;
int ret;
size = rcu_dereference(ht->size);
{
unsigned long size, hash;
int ret;
size = rcu_dereference(ht->size);
- ret = _cds_lfht_del(ht, size,
iter->
node);
+ ret = _cds_lfht_del(ht, size, node);
if (!ret) {
if (!ret) {
- hash = bit_reverse_ulong(
iter->
node->reverse_hash);
+ hash = bit_reverse_ulong(node->reverse_hash);
ht_count_del(ht, size, hash);
}
return ret;
ht_count_del(ht, size, hash);
}
return ret;
This page took
0.022893 seconds
and
4
git commands to generate.