Skip to content
Snippets Groups Projects
Commit 94d93e4d authored by Matt Jordan's avatar Matt Jordan Committed by Gerrit Code Review
Browse files

Merge "res_ari.c: Add missing off nominal unlock and remove a RAII_VAR()." into 13

parents 1a5e087e c61547fe
Branches
Tags
No related merge requests found
...@@ -180,8 +180,7 @@ int ast_ari_add_handler(struct stasis_rest_handlers *handler) ...@@ -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) ...@@ -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) ...@@ -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;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment