mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-20 12:20:12 +00:00
res_ari.c: Add missing off nominal unlock and remove a RAII_VAR().
Change-Id: I0c5e7b34057f26dadb39489c4dac3015c52f5dbf
This commit is contained in:
@@ -180,8 +180,7 @@ int ast_ari_add_handler(struct stasis_rest_handlers *handler)
|
|||||||
|
|
||||||
SCOPED_MUTEX(lock, &root_handler_lock);
|
SCOPED_MUTEX(lock, &root_handler_lock);
|
||||||
|
|
||||||
old_size = sizeof(*new_handler) +
|
old_size = sizeof(*new_handler) + root_handler->num_children * sizeof(handler);
|
||||||
root_handler->num_children * sizeof(handler);
|
|
||||||
new_size = old_size + sizeof(handler);
|
new_size = old_size + sizeof(handler);
|
||||||
|
|
||||||
new_handler = ao2_alloc(new_size, NULL);
|
new_handler = ao2_alloc(new_size, NULL);
|
||||||
@@ -200,21 +199,24 @@ int ast_ari_add_handler(struct stasis_rest_handlers *handler)
|
|||||||
|
|
||||||
int ast_ari_remove_handler(struct stasis_rest_handlers *handler)
|
int ast_ari_remove_handler(struct stasis_rest_handlers *handler)
|
||||||
{
|
{
|
||||||
RAII_VAR(struct stasis_rest_handlers *, new_handler, NULL, ao2_cleanup);
|
struct stasis_rest_handlers *new_handler;
|
||||||
size_t size, i, j;
|
size_t size;
|
||||||
|
size_t i;
|
||||||
|
size_t j;
|
||||||
|
|
||||||
ast_assert(root_handler != NULL);
|
ast_assert(root_handler != NULL);
|
||||||
|
|
||||||
ast_mutex_lock(&root_handler_lock);
|
ast_mutex_lock(&root_handler_lock);
|
||||||
size = sizeof(*new_handler) +
|
size = sizeof(*new_handler) + root_handler->num_children * sizeof(handler);
|
||||||
root_handler->num_children * sizeof(handler);
|
|
||||||
|
|
||||||
new_handler = ao2_alloc(size, NULL);
|
new_handler = ao2_alloc(size, NULL);
|
||||||
if (!new_handler) {
|
if (!new_handler) {
|
||||||
|
ast_mutex_unlock(&root_handler_lock);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
memcpy(new_handler, root_handler, sizeof(*new_handler));
|
|
||||||
|
|
||||||
|
/* Create replacement root_handler less the handler to remove. */
|
||||||
|
memcpy(new_handler, root_handler, sizeof(*new_handler));
|
||||||
for (i = 0, j = 0; i < root_handler->num_children; ++i) {
|
for (i = 0, j = 0; i < root_handler->num_children; ++i) {
|
||||||
if (root_handler->children[i] == handler) {
|
if (root_handler->children[i] == handler) {
|
||||||
ast_module_unref(ast_module_info->self);
|
ast_module_unref(ast_module_info->self);
|
||||||
@@ -224,9 +226,10 @@ int ast_ari_remove_handler(struct stasis_rest_handlers *handler)
|
|||||||
}
|
}
|
||||||
new_handler->num_children = j;
|
new_handler->num_children = j;
|
||||||
|
|
||||||
|
/* Replace the old root_handler with the new. */
|
||||||
ao2_cleanup(root_handler);
|
ao2_cleanup(root_handler);
|
||||||
ao2_ref(new_handler, +1);
|
|
||||||
root_handler = new_handler;
|
root_handler = new_handler;
|
||||||
|
|
||||||
ast_mutex_unlock(&root_handler_lock);
|
ast_mutex_unlock(&root_handler_lock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user