add thread safe hash multi delete function and make callback optional
This commit is contained in:
parent
f37b1f0c54
commit
fbcb862265
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue