summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Vossel <dvossel@digium.com>2010-01-05 19:29:47 +0000
committerDavid Vossel <dvossel@digium.com>2010-01-05 19:29:47 +0000
commitbebe42f3a718269e92aacbcc5e9899d675f92b4d (patch)
tree3bb92cf084c313711110d93ea67fe06e0de64a34
parentc5cfc2a867dbc393d7b8bc2f7af564372412e621 (diff)
fixes subscriptions being lost after 'module reload'
During a module reload if multiple extension configs are present, such as both extensions.conf and extensions.ael, watchers for one config's hints will be lost during the merging of the other config. This happens because hint watchers are only preserved for the current config being merged. The old context list is destroyed after the merging takes place, meaning any watchers that were not perserved will be removed. Now all hints are preserved during merging regardless of what config file is being merged. These hints are only restored if they are present within the new context list. (closes issue #16093) Reported by: jlaroff git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@237839 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--main/pbx.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/main/pbx.c b/main/pbx.c
index 45e46df63..ed14a65f0 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -6968,12 +6968,13 @@ void ast_merge_contexts_and_delete(struct ast_context **extcontexts, struct ast_
AST_RWLIST_WRLOCK(&hints);
writelocktime = ast_tvnow();
- /* preserve all watchers for hints associated with this registrar */
+ /* preserve all watchers for hints */
AST_RWLIST_TRAVERSE(&hints, hint, list) {
- if (!AST_LIST_EMPTY(&hint->callbacks) && !strcmp(registrar, hint->exten->parent->registrar)) {
+ if (!AST_LIST_EMPTY(&hint->callbacks)) {
length = strlen(hint->exten->exten) + strlen(hint->exten->parent->name) + 2 + sizeof(*this);
if (!(this = ast_calloc(1, length)))
continue;
+ /* this removes all the callbacks from the hint into this. */
AST_LIST_APPEND_LIST(&this->callbacks, &hint->callbacks, entry);
this->laststate = hint->laststate;
this->context = this->data;
@@ -7004,7 +7005,7 @@ void ast_merge_contexts_and_delete(struct ast_context **extcontexts, struct ast_
*/
if (exten && exten->exten[0] == '_') {
ast_add_extension_nolock(exten->parent->name, 0, this->exten, PRIORITY_HINT, NULL,
- 0, exten->app, ast_strdup(exten->data), ast_free_ptr, registrar);
+ 0, exten->app, ast_strdup(exten->data), ast_free_ptr, exten->registrar);
/* rwlocks are not recursive locks */
exten = ast_hint_extension_nolock(NULL, this->context, this->exten);
}