#ifdef EFL_HAVE_POSIX_THREADS_RWLOCK
pthread_rwlock_t lock;
- Eina_Bool stay_locked:1; /* useful for iterator functions which don't want to lose lock */
Eina_Bool threadsafe:1;
#endif
eina_hash_unlock(const Eina_Hash *hash)
{
if (!hash) return EINA_FALSE;
- if ((hash->threadsafe) && (!hash->stay_locked))
+ if (hash->threadsafe)
if (pthread_rwlock_unlock(&((Eina_Hash*) hash)->lock))
return EINA_FALSE;
return EINA_TRUE;
EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE);
EINA_MAGIC_CHECK_HASH(hash);
- if (!eina_hash_wrlock(hash))
- return EINA_FALSE;
error = EINA_ERROR_OUT_OF_MEMORY;
/* Apply eina mask to hash. */
_eina_hash_key_rbtree_cmp_node),
(const void *)hash->key_cmp_cb);
hash->population++;
- eina_hash_unlock(hash);
return EINA_TRUE;
on_error:
eina_error_set(error);
- eina_hash_unlock(hash);
return EINA_FALSE;
}
new->population = 0;
#ifdef EFL_HAVE_POSIX_THREADS_RWLOCK
new->threadsafe = EINA_FALSE;
- new->stay_locked = EINA_FALSE;
#endif
new->size = 1 << buckets_power_size;
const void *key, int key_length, int key_hash,
const void *data)
{
- return eina_hash_add_alloc_by_hash(hash,
+ Eina_Bool ret;
+ if (!eina_hash_wrlock(hash))
+ return EINA_FALSE;
+
+ ret = eina_hash_add_alloc_by_hash(hash,
key,
key_length,
key_length,
key_hash,
data);
+ eina_hash_unlock(hash);
+ return ret;
}
/**
const void *key, int key_length, int key_hash,
const void *data)
{
- return eina_hash_add_alloc_by_hash(hash, key, key_length, 0, key_hash, data);
+ Eina_Bool ret;
+ if (!eina_hash_wrlock(hash))
+ return EINA_FALSE;
+
+ ret = eina_hash_add_alloc_by_hash(hash, key, key_length, 0, key_hash, data);
+ eina_hash_unlock(hash);
+ return ret;
}
/**
{
unsigned int key_length;
int key_hash;
+ Eina_Bool ret;
EINA_MAGIC_CHECK_HASH(hash);
EINA_SAFETY_ON_NULL_RETURN_VAL(hash, EINA_FALSE);
key_length = hash->key_length_cb ? hash->key_length_cb(key) : 0;
key_hash = hash->key_hash_cb(key, key_length);
- return eina_hash_add_by_hash(hash, key, key_length, key_hash, data);
+ ret = eina_hash_add_alloc_by_hash(hash, key, key_length, key_length, key_hash, data);
+ eina_hash_unlock(hash);
+ return ret;
}
/**
{
int key_length;
int key_hash;
+ Eina_Bool ret;
EINA_SAFETY_ON_NULL_RETURN_VAL(hash, EINA_FALSE);
EINA_SAFETY_ON_NULL_RETURN_VAL(hash->key_hash_cb, EINA_FALSE);
key_length = hash->key_length_cb ? hash->key_length_cb(key) : 0;
key_hash = hash->key_hash_cb(key, key_length);
- return eina_hash_direct_add_by_hash(hash, key, key_length, key_hash, data);
+ ret = eina_hash_add_alloc_by_hash(hash, key, key_length, 0, key_hash, data);
+ eina_hash_unlock(hash);
+ return ret;
}
/**
int key_length,
int key_hash)
{
+ Eina_Bool ret;
EINA_SAFETY_ON_NULL_RETURN_VAL(hash, EINA_FALSE);
EINA_SAFETY_ON_NULL_RETURN_VAL(key, EINA_FALSE);
if (!eina_hash_wrlock(hash))
return EINA_FALSE;
- return _eina_hash_del_by_key_hash(hash, key, key_length, key_hash, NULL) && eina_hash_unlock(hash);
+ ret = _eina_hash_del_by_key_hash(hash, key, key_length, key_hash, NULL);
+
+ eina_hash_unlock(hash);
+ return ret;
}
/**
EAPI Eina_Bool
eina_hash_del_by_key(Eina_Hash *hash, const void *key)
{
+ Eina_Bool ret;
EINA_SAFETY_ON_NULL_RETURN_VAL(hash, EINA_FALSE);
EINA_SAFETY_ON_NULL_RETURN_VAL(key, EINA_FALSE);
if (!eina_hash_wrlock(hash))
return EINA_FALSE;
- return _eina_hash_del_by_key(hash, key, NULL) && eina_hash_unlock(hash);
+ ret = _eina_hash_del_by_key(hash, key, NULL);
+ eina_hash_unlock(hash);
+ return ret;
}
/**
EAPI Eina_Bool
eina_hash_del_by_data(Eina_Hash *hash, const void *data)
{
+ Eina_Bool ret = EINA_FALSE;
Eina_Hash_Element *hash_element;
Eina_Hash_Head *hash_head;
int key_hash;
if (hash_element->tuple.data != data)
goto error;
- return _eina_hash_del_by_hash_el(hash, hash_element, hash_head, key_hash) && eina_hash_unlock(hash);
+ ret = _eina_hash_del_by_hash_el(hash, hash_element, hash_head, key_hash);
error:
eina_hash_unlock(hash);
- return EINA_FALSE;
+ return ret;
}
/**
int key_hash,
const void *data)
{
+ Eina_Bool ret;
EINA_SAFETY_ON_NULL_RETURN_VAL(hash, EINA_FALSE);
EINA_MAGIC_CHECK_HASH(hash);
return EINA_FALSE;
if (key)
- return _eina_hash_del_by_key_hash(hash, key, key_length, key_hash, data) && eina_hash_unlock(hash);
+ ret = _eina_hash_del_by_key_hash(hash, key, key_length, key_hash, data);
else
- return eina_hash_del_by_data(hash, data) && eina_hash_unlock(hash);
+ ret = eina_hash_del_by_data(hash, data);
+ eina_hash_unlock(hash);
+ return ret;
}
/**
EAPI Eina_Bool
eina_hash_del(Eina_Hash *hash, const void *key, const void *data)
{
+ Eina_Bool ret;
EINA_SAFETY_ON_NULL_RETURN_VAL(hash, EINA_FALSE);
EINA_MAGIC_CHECK_HASH(hash);
+ if (!key)
+ return eina_hash_del_by_data(hash, data);
+
if (!eina_hash_wrlock(hash))
- return EINA_FALSE;
+ return EINA_FALSE;
- if (key)
- return _eina_hash_del_by_key(hash, key, data) && eina_hash_unlock(hash);
- else
- return eina_hash_del_by_data(hash, data) && eina_hash_unlock(hash);
+ ret = _eina_hash_del_by_key(hash, key, data);
+ eina_hash_unlock(hash);
+ return ret;
}
/**
hash_element->tuple.data = (void *)data;
}
+ eina_hash_unlock(hash);
return old_data;
}
it = eina_hash_iterator_tuple_new(hash);
if (!it)
return;
-
- if (!eina_hash_rdlock((Eina_Hash*)hash))
- return;
-#ifdef EFL_HAVE_POSIX_THREADS_RWLOCK
- ((Eina_Hash*)hash)->stay_locked = EINA_TRUE;
-#endif
-
eina_iterator_foreach(it, EINA_EACH_CB(_eina_foreach_cb), &foreach);
-#ifdef EFL_HAVE_POSIX_THREADS_RWLOCK
- ((Eina_Hash*)hash)->stay_locked = EINA_FALSE;
-#endif
- eina_hash_unlock(((Eina_Hash*)hash));
+
eina_iterator_free(it);
}
if (!(new = eina_hash_new(key_length_cb, key_cmp_cb, key_hash_cb, data_free_cb, buckets_power_size)))
return NULL;
new->threadsafe = EINA_TRUE;
- new->stay_locked = EINA_FALSE;
if (pthread_rwlock_init(&new->lock, NULL))
{
free(new);