X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=urcu%2Frculfhash.h;h=004c20817b8585e1cecc21f37068b8725b8a5d43;hb=9be0828e85625ab403b83962622a7241665c49ea;hp=de34fae0b424b20a0b7d7538932376209a603969;hpb=13f656f996861f47172f34a1ef28e338616ff5e2;p=urcu.git diff --git a/urcu/rculfhash.h b/urcu/rculfhash.h index de34fae..004c208 100644 --- a/urcu/rculfhash.h +++ b/urcu/rculfhash.h @@ -182,7 +182,6 @@ int cds_lfht_destroy(struct cds_lfht *ht, pthread_attr_t **attr); * @ht: the hash table. * @split_count_before: Sample the node count split-counter before traversal. * @count: Traverse the hash table, count the number of nodes observed. - * @removed: Number of logically removed nodes observed during traversal. * @split_count_after: Sample the node count split-counter after traversal. * * Call with rcu_read_lock held. @@ -191,7 +190,6 @@ int cds_lfht_destroy(struct cds_lfht *ht, pthread_attr_t **attr); void cds_lfht_count_nodes(struct cds_lfht *ht, long *split_count_before, unsigned long *count, - unsigned long *removed, long *split_count_after); /* @@ -216,7 +214,8 @@ void cds_lfht_lookup(struct cds_lfht *ht, unsigned long hash, * @key: the current node key. * @iter: Node, if found (output). *iter->node set to NULL if not found. * - * Uses an iterator initialized by a lookup. + * Uses an iterator initialized by a lookup. Important: the iterator + * _needs_ to be initialized before calling cds_lfht_next_duplicate. * Sets *iter-node to the following node with same key. * Sets *iter->node to NULL if no following node exists with same key. * RCU read-side lock must be held across cds_lfht_lookup and @@ -324,14 +323,19 @@ struct cds_lfht_node *cds_lfht_add_replace(struct cds_lfht *ht, struct cds_lfht_node *node); /* - * cds_lfht_replace - replace a node pointer to by iter within hash table. + * cds_lfht_replace - replace a node pointed to by iter within hash table. * @ht: the hash table. * @old_iter: the iterator position of the node to replace. - * @now_node: the new node to try using for replacement. + * @hash: the node's hash. + * @match: the key match function. + * @key: the node's key. + * @new_node: the new node to use as replacement. * * Return 0 if replacement is successful, negative value otherwise. - * Replacing a NULL old node or an already removed node will fail with a - * negative value. + * Replacing a NULL old node or an already removed node will fail with + * -ENOENT. + * If the hash or value of the node to replace and the new node differ, + * this function returns -EINVAL without proceeding to the replacement. * Old node can be looked up with cds_lfht_lookup and cds_lfht_next. * RCU read-side lock must be held between lookup and replacement. * Call with rcu_read_lock held. @@ -350,20 +354,24 @@ struct cds_lfht_node *cds_lfht_add_replace(struct cds_lfht *ht, * guarantee that a combination of add_replace and add_unique updates * will never generate duplicated keys. */ -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); /* * cds_lfht_del - remove node pointed to by iterator from hash table. * @ht: the hash table. - * @iter: the iterator position of the node to delete. + * @node: the node to delete. * * Return 0 if the node is successfully removed, negative value * otherwise. - * Replacing a NULL node or an already removed node will fail with a + * Deleting a NULL node or an already removed node will fail with a * negative value. - * Node can be looked up with cds_lfht_lookup and cds_lfht_next. - * cds_lfht_iter_get_node. + * Node can be looked up with cds_lfht_lookup and cds_lfht_next, + * followed by use of cds_lfht_iter_get_node. * RCU read-side lock must be held between lookup and removal. * Call with rcu_read_lock held. * Threads calling this API need to be registered RCU read-side threads. @@ -371,7 +379,21 @@ int cds_lfht_replace(struct cds_lfht *ht, struct cds_lfht_iter *old_iter, * freeing the memory reserved for old node (which can be accessed with * cds_lfht_iter_get_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); + +/* + * cds_lfht_is_node_deleted - query if a node is removed from hash table. + * + * Return non-zero if the node is deleted from the hash table, 0 + * otherwise. + * Node can be looked up with cds_lfht_lookup and cds_lfht_next, + * followed by use of cds_lfht_iter_get_node. + * RCU read-side lock must be held between lookup and call to this + * function. + * Call with rcu_read_lock held. + * Threads calling this API need to be registered RCU read-side threads. + */ +int cds_lfht_is_node_deleted(struct cds_lfht_node *node); /* * cds_lfht_resize - Force a hash table resize