diff options
author | dvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-01-05 19:31:43 +0000 |
---|---|---|
committer | dvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-01-05 19:31:43 +0000 |
commit | be555402ab376f4dc58e933bc864355e85126a20 (patch) | |
tree | d23c974236673b345f92bab9c64fad67e9e0bd9d /main | |
parent | 7813e3059c7081becf74c9e29de5a16f50b7108d (diff) |
Merged revisions 237839 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
........
r237839 | dvossel | 2010-01-05 13:29:47 -0600 (Tue, 05 Jan 2010) | 19 lines
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: http://svn.digium.com/svn/asterisk/branches/1.6.1@237841 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main')
-rw-r--r-- | main/pbx.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/main/pbx.c b/main/pbx.c index bcaafee79..165c2b735 100644 --- a/main/pbx.c +++ b/main/pbx.c @@ -6113,12 +6113,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; @@ -6149,7 +6150,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); } |