rcuja: fix iteration and lookup below/above equal
[userspace-rcu.git] / rcuja / rcuja-range.c
index cb5b78b8b8e63365c79a72fae76b2e8f6177f237..00d68befa20d35b552f314bc680a3a3de81a310d 100644 (file)
@@ -209,7 +209,7 @@ void rcu_free_range(struct cds_ja *ja, struct cds_ja_range *range)
                        free_range_cb);
 }
 
-struct cds_ja_range *cds_ja_range_add(struct cds_ja *ja,
+int cds_ja_range_add(struct cds_ja *ja,
                uint64_t start,         /* inclusive */
                uint64_t end,           /* inclusive */
                void *priv)
@@ -230,7 +230,7 @@ retry:
        old_range = caa_container_of(old_node, struct cds_ja_range, ja_node);
        switch (CMM_LOAD_SHARED(old_range->type)) {
        case CDS_JA_RANGE_ALLOCATED:
-               return NULL;
+               return -EEXIST;
        case CDS_JA_RANGE_FREE:
                break;
        case CDS_JA_RANGE_REMOVED:
@@ -245,7 +245,7 @@ retry:
                switch (CMM_LOAD_SHARED(old_range->type)) {
                case CDS_JA_RANGE_ALLOCATED:
                case CDS_JA_RANGE_FREE:         /* fall-through */
-                       return NULL;
+                       return -EEXIST;
                case CDS_JA_RANGE_REMOVED:
                        goto retry;
                }
@@ -315,7 +315,7 @@ retry:
 
        rcu_free_range(ja, old_range);
 
-       return new_range;
+       return 0;
 }
 
 int cds_ja_range_del(struct cds_ja *ja, struct cds_ja_range *range)
@@ -405,7 +405,9 @@ struct cds_ja *_cds_ja_range_new(const struct rcu_flavor_struct *flavor)
        range = range_create(0, UINT64_MAX, NULL, CDS_JA_RANGE_FREE);
        if (!range)
                goto free_ja;
+       cds_lfht_rcu_flavor(ja->ht)->read_lock();
        ret = cds_ja_add(ja, 0, &range->ja_node);
+       cds_lfht_rcu_flavor(ja->ht)->read_unlock();
        if (ret)
                goto free_range;
        return ja;
@@ -425,6 +427,7 @@ int cds_ja_range_destroy(struct cds_ja *ja,
        struct cds_ja_node *ja_node;
        int ret = 0;
 
+       cds_lfht_rcu_flavor(ja->ht)->read_lock();
        cds_ja_for_each_key_rcu(ja, key, ja_node) {
                struct cds_ja_node *tmp_node;
 
@@ -442,8 +445,10 @@ int cds_ja_range_destroy(struct cds_ja *ja,
                        free_range(range);
                }
        }
+       cds_lfht_rcu_flavor(ja->ht)->read_unlock();
        return cds_ja_destroy(ja);
 
 error:
+       cds_lfht_rcu_flavor(ja->ht)->read_unlock();
        return ret;
 }
This page took 0.025776 seconds and 4 git commands to generate.