}
__attribute__((visibility("protected")))
-int rcuja_shadow_set(struct cds_lfht *ht,
+struct cds_ja_shadow_node *rcuja_shadow_set(struct cds_lfht *ht,
struct cds_ja_inode *new_node,
struct cds_ja_shadow_node *inherit_from)
{
shadow_node = calloc(sizeof(*shadow_node), 1);
if (!shadow_node)
- return -ENOMEM;
+ return NULL;
shadow_node->node = new_node;
/*
shadow_node->lock = calloc(sizeof(*shadow_node->lock), 1);
if (!shadow_node->lock) {
free(shadow_node);
- return -ENOMEM;
+ return NULL;
}
pthread_mutex_init(shadow_node->lock, NULL);
}
if (ret_node != &shadow_node->ht_node) {
free(shadow_node);
- return -EEXIST;
+ return NULL;
}
- return 0;
+ return shadow_node;
}
static
{
struct cds_ja_shadow_node *shadow_node =
caa_container_of(head, struct cds_ja_shadow_node, head);
+ assert(!shadow_node->is_root);
free(shadow_node->node);
free(shadow_node->lock);
free(shadow_node);
*/
ret = cds_lfht_del(ht, lookup_node);
if (!ret) {
- if (flags & RCUJA_SHADOW_CLEAR_FREE_NODE) {
+ if ((flags & RCUJA_SHADOW_CLEAR_FREE_NODE)
+ && !shadow_node->is_root) {
if (flags & RCUJA_SHADOW_CLEAR_FREE_LOCK) {
flavor->update_call_rcu(&shadow_node->head,
free_shadow_node_and_node_and_lock);
ret = cds_lfht_del(ht, &shadow_node->ht_node);
if (!ret) {
- assert((flags & RCUJA_SHADOW_CLEAR_FREE_NODE)
- && (flags & RCUJA_SHADOW_CLEAR_FREE_LOCK));
- flavor->update_call_rcu(&shadow_node->head,
- free_shadow_node_and_node_and_lock);
+ if ((flags & RCUJA_SHADOW_CLEAR_FREE_NODE)
+ && !shadow_node->is_root) {
+ if (flags & RCUJA_SHADOW_CLEAR_FREE_LOCK) {
+ flavor->update_call_rcu(&shadow_node->head,
+ free_shadow_node_and_node_and_lock);
+ } else {
+ flavor->update_call_rcu(&shadow_node->head,
+ free_shadow_node_and_node);
+ }
+ } else {
+ if (flags & RCUJA_SHADOW_CLEAR_FREE_LOCK) {
+ flavor->update_call_rcu(&shadow_node->head,
+ free_shadow_node_and_lock);
+ } else {
+ flavor->update_call_rcu(&shadow_node->head,
+ free_shadow_node);
+ }
+ }
}
lockret = pthread_mutex_unlock(shadow_node->lock);
assert(!lockret);