[svn-commits] russell: trunk r166258 - /trunk/res/res_agi.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Mon Dec 22 08:16:55 CST 2008


Author: russell
Date: Mon Dec 22 08:16:54 2008
New Revision: 166258

URL: http://svn.digium.com/view/asterisk?view=rev&rev=166258
Log:
Remove AST_PBX_KEEPALIVE usage from res_agi.

This patch removes the usage of AST_PBX_KEEPALIVE from res_agi.  The only usage
was for the AGI command, "asyncagi break".  This patch removes this feature.
Normally, a feature would not be removed like this.  However, this code is
broken and usage of it will result in a memory leak.

Usage of this feature will make the AGI code return a result of 
AST_PBX_KEEPALIVE.  The PBX handler assumes that another thread has assumed
ownership of the channel.  The channel thread will exit without destroying the
channel.  Unfortunately, _no_ thread has ownership of the channel at this
point.  There are a couple of serious problems here:

1) The only way to recover the caller is to issue a channel redirect.  This
   will work, but this will be done with a masquerade, and the old ast_channel
   structure will be lost.

2) Until the channel redirect happens, there is no code servicing the channel.
   That means nothing is reading audio or handling events coming from the
   channel.  This is very bad.

The recommended way to get this same "break" functionality is to issue the
redirect while the channel is still being handled by the AGI code.  That way,
there will be no memory leak, and there will be no period of time that the
channel is not being serviced.

Modified:
    trunk/res/res_agi.c

Modified: trunk/res/res_agi.c
URL: http://svn.digium.com/view/asterisk/trunk/res/res_agi.c?view=diff&rev=166258&r1=166257&r2=166258
==============================================================================
--- trunk/res/res_agi.c (original)
+++ trunk/res/res_agi.c Mon Dec 22 08:16:54 2008
@@ -687,7 +687,7 @@
 			/* OK, we have a command, let's call the
 			   command handler. */
 			res = agi_handle_command(chan, &async_agi, cmd->cmd_buffer, 0);
-			if ((res < 0) || (res == AST_PBX_KEEPALIVE)) {
+			if (res < 0) {
 				free_agi_cmd(cmd);
 				break;
 			}
@@ -2229,12 +2229,6 @@
 	return RESULT_SUCCESS;
 }
 
-static int handle_asyncagi_break(struct ast_channel *chan, AGI *agi, int argc, char *argv[])
-{
-	ast_agi_send(agi->fd, chan, "200 result=0\n");
-	return AST_PBX_KEEPALIVE;
-}
-
 static char usage_verbose[] =
 " Usage: VERBOSE <message> <level>\n"
 "	Sends <message> to the console via verbose message system.\n"
@@ -2394,10 +2388,6 @@
 "	Cause the channel to automatically hangup at <time> seconds in the\n"
 " future.  Of course it can be hungup before then as well. Setting to 0 will\n"
 " cause the autohangup feature to be disabled on this channel.\n";
-
-static char usage_break_aagi[] =
-" Usage: ASYNCAGI BREAK\n"
-"	Break the Async AGI loop.\n";
 
 static char usage_speechcreate[] =
 " Usage: SPEECH CREATE <engine>\n"
@@ -2480,7 +2470,6 @@
 	{ { "speech", "activate", "grammar", NULL }, handle_speechactivategrammar, "Activates a grammar", usage_speechactivategrammar, 0 },
 	{ { "speech", "deactivate", "grammar", NULL }, handle_speechdeactivategrammar, "Deactivates a grammar", usage_speechdeactivategrammar, 0 },
 	{ { "speech", "recognize", NULL }, handle_speechrecognize, "Recognizes speech", usage_speechrecognize, 0 },
-	{ { "asyncagi", "break", NULL }, handle_asyncagi_break, "Break AsyncAGI loop", usage_break_aagi, 0 },
 };
 
 static AST_RWLIST_HEAD_STATIC(agi_commands, agi_command);
@@ -2751,7 +2740,6 @@
 			ast_module_unref(c->mod);
 		switch (res) {
 		case RESULT_SHOWUSAGE: ami_res = "Usage"; resultcode = 520; break;
-		case AST_PBX_KEEPALIVE: ami_res = "KeepAlive"; resultcode = 210; break;
 		case RESULT_FAILURE: ami_res = "Failure"; resultcode = -1; break;
 		case RESULT_SUCCESS: ami_res = "Success"; resultcode = 200; break;
 		}
@@ -2767,10 +2755,6 @@
 			ast_agi_send(agi->fd, chan, "520-Invalid command syntax.  Proper usage follows:\n");
 			ast_agi_send(agi->fd, chan, "%s", c->usage);
 			ast_agi_send(agi->fd, chan, "520 End of proper usage.\n");
-			break;
-		case AST_PBX_KEEPALIVE:
-			/* We've been asked to keep alive, so do so */
-			return AST_PBX_KEEPALIVE;
 			break;
 		case RESULT_FAILURE:
 			/* They've already given the failure.  We've been hung up on so handle this
@@ -2876,8 +2860,9 @@
 
 			if (!buf[0]) {
 				/* Program terminated */
-				if (returnstatus && returnstatus != AST_PBX_KEEPALIVE)
+				if (returnstatus) {
 					returnstatus = -1;
+				}
 				ast_verb(3, "<%s>AGI Script %s completed, returning %d\n", chan->name, request, returnstatus);
 				if (pid > 0)
 					waitpid(pid, status, 0);
@@ -2899,7 +2884,7 @@
 				ast_verbose("<%s>AGI Rx << %s\n", chan->name, buf);
 			returnstatus |= agi_handle_command(chan, agi, buf, dead);
 			/* If the handle_command returns -1, we need to stop */
-			if ((returnstatus < 0) || (returnstatus == AST_PBX_KEEPALIVE)) {
+			if (returnstatus < 0) {
 				needhup = 1;
 				continue;
 			}




More information about the svn-commits mailing list