[asterisk-commits] twilson: branch 1.6.2 r291580 - in /branches/1.6.2: ./ main/channel.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Oct 13 17:58:48 CDT 2010


Author: twilson
Date: Wed Oct 13 17:58:43 2010
New Revision: 291580

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=291580
Log:
Merged revisions 291577 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
  r291577 | twilson | 2010-10-13 15:45:15 -0700 (Wed, 13 Oct 2010) | 21 lines
  
  Don't ignore frames that have been queued when softhangup'd
  
  When an outgoing call is answered and hung up by the far end *very* quickly, we
  may not read any frames and therefor end up with a call that displays the wrong
  disposition/DIALSTATUS. The reason is because ast_queue_hangup() immediately
  sets the _softhangup flag on the channel and then queues the HANGUP control
  frame, but __ast_read refuses to read any frames if ast_check_hangup() indicates
  that a hangup request has been made (which it will if _softhangup is set). So,
  we end up losing control frames.
  
  This change makes __ast_read continue to read frames even if a soft hangup has
  been requested. It queues a hangup frame to make sure that __ast_read() will
  still eventually return NULL.
  
  Much thanks to David Vossel for all of the reviews, discussion, and help!
  
  (closes issue #16946)
  Reported by: davidw
  
  Review: https://reviewboard.asterisk.org/r/740/
........

Modified:
    branches/1.6.2/   (props changed)
    branches/1.6.2/main/channel.c

Propchange: branches/1.6.2/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.

Modified: branches/1.6.2/main/channel.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.6.2/main/channel.c?view=diff&rev=291580&r1=291579&r2=291580
==============================================================================
--- branches/1.6.2/main/channel.c (original)
+++ branches/1.6.2/main/channel.c Wed Oct 13 17:58:43 2010
@@ -2731,7 +2731,18 @@
 	if (ast_test_flag(chan, AST_FLAG_ZOMBIE) || ast_check_hangup(chan)) {
 		if (chan->generator)
 			ast_deactivate_generator(chan);
-		goto done;
+
+		/* It is possible for chan->_softhangup to be set, yet there still be control
+		 * frames that still need to be read. Instead of just going to 'done' in the
+		 * case of ast_check_hangup(), we instead need to send the HANGUP frame so that
+		 * it can mark the end of the read queue. If there are frames to be read, 
+		 * ast_queue_control will be called repeatedly, but will only queue one hangup
+		 * frame. */
+		if (ast_check_hangup(chan)) {
+			ast_queue_control(chan, AST_CONTROL_HANGUP);
+		} else {
+			goto done;
+		}
 	}
 
 #ifdef AST_DEVMODE




More information about the asterisk-commits mailing list