aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormurf <murf@f38db490-d61c-443f-a65b-d21fe96a405b>2008-06-16 21:19:23 +0000
committermurf <murf@f38db490-d61c-443f-a65b-d21fe96a405b>2008-06-16 21:19:23 +0000
commit3342ca21fc6cd57a6c858bee7bc5acb562a22afe (patch)
treec28c16e7244c75587046414ed73f410d8562beec
parent8701e03b92e49b59d371b5b7c91ddb67e43ac4dd (diff)
Merged revisions 123165 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ........ r123165 | murf | 2008-06-16 14:43:46 -0600 (Mon, 16 Jun 2008) | 19 lines (closes issue #12689) Reported by: ys Many thanks to ys for doing the research on this problem. I didn't think it would be best to unlock the contexts and then relock them after the remove_extension2() call, so I added an extra arg to remove_extension2() and set it appropriately in each call. There were not that many. I considered forcing the code to lock the contexts before the call to remove_extension2(), but that would require a slightly greater degree of changes, especially since the find_context_locked is local to pbx.c I did a simple sanity test to make sure the code doesn't mess things up in general. ........ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@123173 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--apps/app_dial.c2
-rw-r--r--apps/app_queue.c2
-rw-r--r--apps/app_stack.c2
-rw-r--r--include/asterisk/pbx.h2
-rw-r--r--main/features.c8
-rw-r--r--main/pbx.c16
6 files changed, 18 insertions, 14 deletions
diff --git a/apps/app_dial.c b/apps/app_dial.c
index 0af35f317..5dd160217 100644
--- a/apps/app_dial.c
+++ b/apps/app_dial.c
@@ -2070,7 +2070,7 @@ static int unload_module(void)
res |= ast_unregister_application(rapp);
if ((con = ast_context_find("app_dial_gosub_virtual_context"))) {
- ast_context_remove_extension2(con, "s", 1, NULL);
+ ast_context_remove_extension2(con, "s", 1, NULL, 0);
ast_context_destroy(con, "app_dial"); /* leave nothing behind */
}
diff --git a/apps/app_queue.c b/apps/app_queue.c
index 6d61e8e52..901043d82 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -6217,7 +6217,7 @@ static int unload_module(void)
ast_event_unsubscribe(device_state_sub);
if ((con = ast_context_find("app_queue_gosub_virtual_context"))) {
- ast_context_remove_extension2(con, "s", 1, NULL);
+ ast_context_remove_extension2(con, "s", 1, NULL, 0);
ast_context_destroy(con, "app_queue"); /* leave no trace */
}
diff --git a/apps/app_stack.c b/apps/app_stack.c
index 9e6c0dadd..3dc06904f 100644
--- a/apps/app_stack.c
+++ b/apps/app_stack.c
@@ -493,7 +493,7 @@ static int unload_module(void)
ast_agi_unregister(ast_module_info->self, &gosub_agi_command);
if ((con = ast_context_find("app_stack_gosub_virtual_context"))) {
- ast_context_remove_extension2(con, "s", 1, NULL);
+ ast_context_remove_extension2(con, "s", 1, NULL, 0);
ast_context_destroy(con, "app_stack"); /* leave nothing behind */
}
}
diff --git a/include/asterisk/pbx.h b/include/asterisk/pbx.h
index ebbe9b6a3..f73ac4454 100644
--- a/include/asterisk/pbx.h
+++ b/include/asterisk/pbx.h
@@ -607,7 +607,7 @@ int ast_context_remove_extension(const char *context, const char *extension, int
const char *registrar);
int ast_context_remove_extension2(struct ast_context *con, const char *extension,
- int priority, const char *registrar);
+ int priority, const char *registrar, int already_locked);
/*!
* \brief Add an ignorepat
diff --git a/main/features.c b/main/features.c
index a5ce06490..ecaf6cc39 100644
--- a/main/features.c
+++ b/main/features.c
@@ -2312,7 +2312,7 @@ static void *do_parking_thread(void *ignore)
AST_LIST_REMOVE_CURRENT(list);
con = ast_context_find(parking_con);
if (con) {
- if (ast_context_remove_extension2(con, pu->parkingexten, 1, NULL))
+ if (ast_context_remove_extension2(con, pu->parkingexten, 1, NULL, 0))
ast_log(LOG_WARNING, "Whoa, failed to remove the extension!\n");
else
notify_metermaids(pu->parkingexten, parking_con, AST_DEVICE_NOT_INUSE);
@@ -2346,7 +2346,7 @@ static void *do_parking_thread(void *ignore)
AST_LIST_REMOVE_CURRENT(list);
con = ast_context_find(parking_con);
if (con) {
- if (ast_context_remove_extension2(con, pu->parkingexten, 1, NULL))
+ if (ast_context_remove_extension2(con, pu->parkingexten, 1, NULL, 0))
ast_log(LOG_WARNING, "Whoa, failed to remove the extension!\n");
else
notify_metermaids(pu->parkingexten, parking_con, AST_DEVICE_NOT_INUSE);
@@ -2465,7 +2465,7 @@ static int park_exec(struct ast_channel *chan, void *data)
peer = pu->chan;
con = ast_context_find(parking_con);
if (con) {
- if (ast_context_remove_extension2(con, pu->parkingexten, 1, NULL))
+ if (ast_context_remove_extension2(con, pu->parkingexten, 1, NULL, 0))
ast_log(LOG_WARNING, "Whoa, failed to remove the extension!\n");
else
notify_metermaids(pu->parkingexten, parking_con, AST_DEVICE_NOT_INUSE);
@@ -2850,7 +2850,7 @@ static int load_config(void)
/* Remove the old parking extension */
if (!ast_strlen_zero(old_parking_con) && (con = ast_context_find(old_parking_con))) {
- if(ast_context_remove_extension2(con, old_parking_ext, 1, registrar))
+ if(ast_context_remove_extension2(con, old_parking_ext, 1, registrar, 0))
notify_metermaids(old_parking_ext, old_parking_con, AST_DEVICE_NOT_INUSE);
ast_debug(1, "Removed old parking extension %s@%s\n", old_parking_ext, old_parking_con);
}
diff --git a/main/pbx.c b/main/pbx.c
index 2733af523..1870b776f 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -3979,7 +3979,7 @@ int ast_context_remove_extension(const char *context, const char *extension, int
struct ast_context *c = find_context_locked(context);
if (c) { /* ... remove extension ... */
- ret = ast_context_remove_extension2(c, extension, priority, registrar);
+ ret = ast_context_remove_extension2(c, extension, priority, registrar, 1);
ast_unlock_contexts();
}
return ret;
@@ -3995,14 +3995,15 @@ int ast_context_remove_extension(const char *context, const char *extension, int
* it.
*
*/
-int ast_context_remove_extension2(struct ast_context *con, const char *extension, int priority, const char *registrar)
+int ast_context_remove_extension2(struct ast_context *con, const char *extension, int priority, const char *registrar, int already_locked)
{
struct ast_exten *exten, *prev_exten = NULL;
struct ast_exten *peer;
struct ast_exten ex, *exten2, *exten3;
char dummy_name[1024];
- ast_wrlock_context(con);
+ if (!already_locked)
+ ast_wrlock_context(con);
/* Handle this is in the new world */
@@ -4085,7 +4086,8 @@ int ast_context_remove_extension2(struct ast_context *con, const char *extension
}
if (!exten) {
/* we can't find right extension */
- ast_unlock_context(con);
+ if (!already_locked)
+ ast_unlock_context(con);
return -1;
}
@@ -4112,7 +4114,8 @@ int ast_context_remove_extension2(struct ast_context *con, const char *extension
break; /* found our priority */
}
if (!peer) { /* not found */
- ast_unlock_context(con);
+ if (!already_locked)
+ ast_unlock_context(con);
return -1;
}
/* we are first priority extension? */
@@ -4145,7 +4148,8 @@ int ast_context_remove_extension2(struct ast_context *con, const char *extension
destroy_exten(peer);
/* XXX should we return -1 ? */
}
- ast_unlock_context(con);
+ if (!already_locked)
+ ast_unlock_context(con);
return 0;
}