X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;ds=inline;f=rcuja%2Frcuja.c;h=84c1fb73c26afdc3bc09b0bd037edf6a728d4027;hb=75d573aa7d4609a0845220527665aba86d9c32dc;hp=e5145ea36a3b22dbec54cd4a45eeefe7334e343a;hpb=48cbe00177cd135553ee34d2f443c351b53b6d25;p=urcu.git diff --git a/rcuja/rcuja.c b/rcuja/rcuja.c index e5145ea..84c1fb7 100644 --- a/rcuja/rcuja.c +++ b/rcuja/rcuja.c @@ -1793,8 +1793,10 @@ end: return ret; } -int cds_ja_add(struct cds_ja *ja, uint64_t key, - struct cds_ja_node *new_node) +static +int _cds_ja_add(struct cds_ja *ja, uint64_t key, + struct cds_ja_node *new_node, + struct cds_ja_node **unique_node_ret) { unsigned int tree_depth, i; struct cds_ja_inode_flag *attach_node_flag, @@ -1847,6 +1849,7 @@ retry: if (!ja_node_ptr(node_flag)) { dbg_printf("cds_ja_add NULL parent2_node_flag %p parent_node_flag %p node_flag_ptr %p node_flag %p\n", parent2_node_flag, parent_node_flag, node_flag_ptr, node_flag); + attach_node_flag = parent_node_flag; attach_node_flag_ptr = parent_node_flag_ptr; parent_attach_node_flag = parent2_node_flag; @@ -1858,8 +1861,14 @@ retry: node_flag, key, i, new_node); } else { + if (unique_node_ret) { + *unique_node_ret = (struct cds_ja_node *) ja_node_ptr(node_flag); + return -EEXIST; + } + dbg_printf("cds_ja_add duplicate parent2_node_flag %p parent_node_flag %p node_flag_ptr %p node_flag %p\n", parent2_node_flag, parent_node_flag, node_flag_ptr, node_flag); + attach_node_flag = node_flag; attach_node_flag_ptr = node_flag_ptr; parent_attach_node_flag = parent_node_flag; @@ -1876,6 +1885,25 @@ retry: return ret; } +int cds_ja_add(struct cds_ja *ja, uint64_t key, + struct cds_ja_node *new_node) +{ + return _cds_ja_add(ja, key, new_node, NULL); +} + +struct cds_ja_node *cds_ja_add_unique(struct cds_ja *ja, uint64_t key, + struct cds_ja_node *new_node) +{ + int ret; + struct cds_ja_node *ret_node; + + ret = _cds_ja_add(ja, key, new_node, &ret_node); + if (ret == -EEXIST) + return ret_node; + else + return new_node; +} + /* * Note: there is no need to lookup the pointer address associated with * each node's nth item after taking the lock: it's already been done by @@ -2312,7 +2340,7 @@ void rcuja_free_all_children(struct cds_ja_shadow_node *shadow_node, struct cds_hlist_node *pos, *tmp; uint8_t v; - ja_linear_node_get_ith_pos(type, node, j, &v, &iter); + ja_linear_node_get_ith_pos(type, pool, j, &v, &iter); if (!iter) continue; head.next = (struct cds_hlist_node *) iter;