add thread safe hash multi delete function and make callback optional

This commit is contained in:
Tamas Cseke 2012-05-24 09:35:23 +02:00
parent f37b1f0c54
commit fbcb862265
2 changed files with 57 additions and 3 deletions

View File

@ -1277,7 +1277,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_hash_delete_locked(_In_ switch_hash_
\brief Delete data from a hash based on desired key \brief Delete data from a hash based on desired key
\param hash the hash to delete from \param hash the hash to delete from
\param key the key from which to delete the data \param key the key from which to delete the data
\param mutex optional rwlock to wrlock \param rwlock optional rwlock to wrlock
\return SWITCH_STATUS_SUCCESS if the data is deleted \return SWITCH_STATUS_SUCCESS if the data is deleted
*/ */
SWITCH_DECLARE(switch_status_t) switch_core_hash_delete_wrlock(_In_ switch_hash_t *hash, _In_z_ const char *key, _In_opt_ switch_thread_rwlock_t *rwlock); SWITCH_DECLARE(switch_status_t) switch_core_hash_delete_wrlock(_In_ switch_hash_t *hash, _In_z_ const char *key, _In_opt_ switch_thread_rwlock_t *rwlock);
@ -1290,6 +1290,26 @@ SWITCH_DECLARE(switch_status_t) switch_core_hash_delete_wrlock(_In_ switch_hash_
*/ */
SWITCH_DECLARE(switch_status_t) switch_core_hash_delete_multi(_In_ switch_hash_t *hash, _In_ switch_hash_delete_callback_t callback, _In_opt_ void *pData); SWITCH_DECLARE(switch_status_t) switch_core_hash_delete_multi(_In_ switch_hash_t *hash, _In_ switch_hash_delete_callback_t callback, _In_opt_ void *pData);
/*!
\brief Delete data from a hash based on callback function
\param hash the hash to delete from
\param callback the function to call which returns SWITCH_TRUE to delete, SWITCH_FALSE to preserve
\param rwlock optional rwlock to wrlock
\return SWITCH_STATUS_SUCCESS if any data is deleted
*/
SWITCH_DECLARE(switch_status_t) switch_core_hash_delete_multi_wrlock(_In_ switch_hash_t *hash, _In_ switch_hash_delete_callback_t callback, _In_opt_ void *pData, _In_ switch_thread_rwlock_t *rwlock);
/*!
\brief Delete data from a hash based on callback function
\param hash the hash to delete from
\param callback the function to call which returns SWITCH_TRUE to delete, SWITCH_FALSE to preserve
\param mutex optional mutex to lock
\return SWITCH_STATUS_SUCCESS if any data is deleted
*/
SWITCH_DECLARE(switch_status_t) switch_core_hash_delete_multi_locked(_In_ switch_hash_t *hash, _In_ switch_hash_delete_callback_t callback, _In_opt_ void *pData, _In_ switch_mutex_t *mutex);
/*! /*!
\brief Retrieve data from a given hash \brief Retrieve data from a given hash
\param hash the hash to retrieve from \param hash the hash to retrieve from

View File

@ -157,7 +157,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_hash_delete_multi(switch_hash_t *has
switch_event_create_subclass(&event, SWITCH_EVENT_CLONE, NULL); switch_event_create_subclass(&event, SWITCH_EVENT_CLONE, NULL);
switch_assert(event); switch_assert(event);
/* iterate through the hash, call callback, if callback returns true, put the key on the list (event) /* iterate through the hash, call callback, if callback is NULL or returns true, put the key on the list (event)
When done, iterate through the list deleting hash entries When done, iterate through the list deleting hash entries
*/ */
@ -165,7 +165,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_hash_delete_multi(switch_hash_t *has
const void *key; const void *key;
void *val; void *val;
switch_hash_this(hi, &key, NULL, &val); switch_hash_this(hi, &key, NULL, &val);
if (callback(key, val, pData)) { if (!callback || callback(key, val, pData)) {
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "delete", (const char *) key); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "delete", (const char *) key);
} }
} }
@ -182,6 +182,40 @@ SWITCH_DECLARE(switch_status_t) switch_core_hash_delete_multi(switch_hash_t *has
return status; return status;
} }
SWITCH_DECLARE(switch_status_t) switch_core_hash_delete_multi_wrlock(switch_hash_t *hash, switch_hash_delete_callback_t callback, void *pData, switch_thread_rwlock_t *rwlock)
{
switch_status_t status = SWITCH_STATUS_SUCCESS;
if (rwlock) {
switch_thread_rwlock_wrlock(rwlock);
}
status = switch_core_hash_delete_multi(hash, callback, pData);
if (rwlock) {
switch_thread_rwlock_unlock(rwlock);
}
return status;
}
SWITCH_DECLARE(switch_status_t) switch_core_hash_delete_multi_locked(switch_hash_t *hash, switch_hash_delete_callback_t callback, void *pData, switch_mutex_t *mutex)
{
switch_status_t status = SWITCH_STATUS_SUCCESS;
if (mutex) {
switch_mutex_lock(mutex);
}
status = switch_core_hash_delete_multi(hash, callback, pData);
if (mutex) {
switch_mutex_unlock(mutex);
}
return status;
}
SWITCH_DECLARE(void *) switch_core_hash_find(switch_hash_t *hash, const char *key) SWITCH_DECLARE(void *) switch_core_hash_find(switch_hash_t *hash, const char *key)
{ {