[asterisk-commits] murf: trunk r123165 - in /trunk: apps/ include/asterisk/ main/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon Jun 16 15:43:46 CDT 2008
Author: murf
Date: Mon Jun 16 15:43:46 2008
New Revision: 123165
URL: http://svn.digium.com/view/asterisk?view=rev&rev=123165
Log:
(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.
Modified:
trunk/apps/app_dial.c
trunk/apps/app_queue.c
trunk/apps/app_stack.c
trunk/include/asterisk/pbx.h
trunk/main/features.c
trunk/main/pbx.c
Modified: trunk/apps/app_dial.c
URL: http://svn.digium.com/view/asterisk/trunk/apps/app_dial.c?view=diff&rev=123165&r1=123164&r2=123165
==============================================================================
--- trunk/apps/app_dial.c (original)
+++ trunk/apps/app_dial.c Mon Jun 16 15:43:46 2008
@@ -2098,7 +2098,7 @@
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 */
}
Modified: trunk/apps/app_queue.c
URL: http://svn.digium.com/view/asterisk/trunk/apps/app_queue.c?view=diff&rev=123165&r1=123164&r2=123165
==============================================================================
--- trunk/apps/app_queue.c (original)
+++ trunk/apps/app_queue.c Mon Jun 16 15:43:46 2008
@@ -6366,7 +6366,7 @@
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 */
}
Modified: trunk/apps/app_stack.c
URL: http://svn.digium.com/view/asterisk/trunk/apps/app_stack.c?view=diff&rev=123165&r1=123164&r2=123165
==============================================================================
--- trunk/apps/app_stack.c (original)
+++ trunk/apps/app_stack.c Mon Jun 16 15:43:46 2008
@@ -496,7 +496,7 @@
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 */
}
}
Modified: trunk/include/asterisk/pbx.h
URL: http://svn.digium.com/view/asterisk/trunk/include/asterisk/pbx.h?view=diff&rev=123165&r1=123164&r2=123165
==============================================================================
--- trunk/include/asterisk/pbx.h (original)
+++ trunk/include/asterisk/pbx.h Mon Jun 16 15:43:46 2008
@@ -600,7 +600,7 @@
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
Modified: trunk/main/features.c
URL: http://svn.digium.com/view/asterisk/trunk/main/features.c?view=diff&rev=123165&r1=123164&r2=123165
==============================================================================
--- trunk/main/features.c (original)
+++ trunk/main/features.c Mon Jun 16 15:43:46 2008
@@ -2465,7 +2465,7 @@
/* And take them out of the parking lot */
con = ast_context_find(pu->parkinglot->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 parking extension!\n");
else
notify_metermaids(pu->parkingexten, curlot->parking_con, AST_DEVICE_NOT_INUSE);
@@ -2500,7 +2500,7 @@
/* And take them out of the parking lot */
con = ast_context_find(curlot->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, curlot->parking_con, AST_DEVICE_NOT_INUSE);
@@ -2721,7 +2721,7 @@
peer = pu->chan;
con = ast_context_find(parkinglot->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, parkinglot->parking_con, AST_DEVICE_NOT_INUSE);
@@ -3284,7 +3284,7 @@
/* 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);
}
Modified: trunk/main/pbx.c
URL: http://svn.digium.com/view/asterisk/trunk/main/pbx.c?view=diff&rev=123165&r1=123164&r2=123165
==============================================================================
--- trunk/main/pbx.c (original)
+++ trunk/main/pbx.c Mon Jun 16 15:43:46 2008
@@ -4022,7 +4022,7 @@
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;
@@ -4038,14 +4038,15 @@
* 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 */
@@ -4132,7 +4133,8 @@
}
if (!exten) {
/* we can't find right extension */
- ast_unlock_context(con);
+ if (!already_locked)
+ ast_unlock_context(con);
return -1;
}
@@ -4159,7 +4161,8 @@
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? */
@@ -4192,7 +4195,8 @@
destroy_exten(peer);
/* XXX should we return -1 ? */
}
- ast_unlock_context(con);
+ if (!already_locked)
+ ast_unlock_context(con);
return 0;
}
@@ -7177,7 +7181,7 @@
ast_verb(3, "Remove %s/%s/%d, registrar=%s; con=%s(%p); con->root=%p\n",
tmp->name, prio_item->exten, prio_item->priority, registrar, con? con->name : "<nil>", con, con? con->root_table: NULL);
- ast_context_remove_extension2(tmp, prio_item->exten, prio_item->priority, registrar);
+ ast_context_remove_extension2(tmp, prio_item->exten, prio_item->priority, registrar, 1);
}
ast_hashtab_end_traversal(prio_iter);
}
More information about the asterisk-commits
mailing list