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)
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:
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;
}
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)
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;
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;
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;
}