[asterisk-commits] rmudgett: branch rmudgett/bridge_phase r383059 - /team/rmudgett/bridge_phase/...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Mar 14 11:48:03 CDT 2013


Author: rmudgett
Date: Thu Mar 14 11:47:59 2013
New Revision: 383059

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=383059
Log:
Extract interval timer code from ast_bridge_handle_trip().

Added notes about further interval hook improvements.

Modified:
    team/rmudgett/bridge_phase/main/bridging.c

Modified: team/rmudgett/bridge_phase/main/bridging.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/bridge_phase/main/bridging.c?view=diff&rev=383059&r1=383058&r2=383059
==============================================================================
--- team/rmudgett/bridge_phase/main/bridging.c (original)
+++ team/rmudgett/bridge_phase/main/bridging.c Thu Mar 14 11:47:59 2013
@@ -581,22 +581,6 @@
 static void ast_bridge_handle_trip(struct ast_bridge_channel *bridge_channel)
 {
 	struct ast_frame *frame;
-	struct ast_timer *interval_timer;
-
-	if (bridge_channel->features
-		&& (interval_timer = bridge_channel->features->interval_timer)) {
-		if (ast_wait_for_input(ast_timer_fd(interval_timer), 0) == 1) {
-			ast_timer_ack(interval_timer, 1);
-			if (bridge_channel_interval_ready(bridge_channel)) {
-				struct ast_frame interval_action = {
-					.frametype = AST_FRAME_BRIDGE_ACTION,
-					.subclass.integer = AST_BRIDGE_ACTION_INTERVAL,
-				};
-
-				ast_bridge_channel_queue_frame(bridge_channel, &interval_action);
-			}
-		}
-	}
 
 	if (bridge_channel->features && bridge_channel->features->mute) {
 		frame = ast_read_noaudio(bridge_channel->chan);
@@ -1444,7 +1428,7 @@
  * \brief Handle bridge channel write frame to channel.
  * \since 12.0.0
  *
- * \param bridge_channel Channel to outgoing frame.
+ * \param bridge_channel Channel to write outgoing frame.
  *
  * \return Nothing
  */
@@ -1480,6 +1464,36 @@
 		break;
 	}
 	ast_frfree(fr);
+}
+
+/*!
+ * \internal
+ * \brief Handle bridge channel interval expiration.
+ * \since 12.0.0
+ *
+ * \param bridge_channel Channel to check interval on.
+ *
+ * \return Nothing
+ */
+static void bridge_channel_handle_interval(struct ast_bridge_channel *bridge_channel)
+{
+	struct ast_timer *interval_timer;
+
+	if (bridge_channel->features
+		&& (interval_timer = bridge_channel->features->interval_timer)) {
+		if (ast_wait_for_input(ast_timer_fd(interval_timer), 0) == 1) {
+			ast_timer_ack(interval_timer, 1);
+			if (bridge_channel_interval_ready(bridge_channel)) {
+/* BUGBUG since this is now only run by the channel thread, there is no need to queue the action once this intervals become a first class wait item in bridge_channel_wait(). */
+				struct ast_frame interval_action = {
+					.frametype = AST_FRAME_BRIDGE_ACTION,
+					.subclass.integer = AST_BRIDGE_ACTION_INTERVAL,
+				};
+
+				ast_bridge_channel_queue_frame(bridge_channel, &interval_action);
+			}
+		}
+	}
 }
 
 /*!
@@ -1513,11 +1527,13 @@
 			bridge_channel->bridge);
 		ao2_unlock(bridge_channel);
 		outfd = -1;
+/* BUGBUG need to make the next expiring active interval setup ms timeout rather than holding up the chan reads. */
 		chan = ast_waitfor_nandfds(&bridge_channel->chan, 1,
 			&bridge_channel->alert_pipe[0], 1, NULL, &outfd, &ms);
 		if (!bridge_channel->suspended
 			&& bridge_channel->state == AST_BRIDGE_CHANNEL_STATE_WAIT) {
 			if (chan) {
+				bridge_channel_handle_interval(bridge_channel);
 				ast_bridge_handle_trip(bridge_channel);
 			} else if (-1 < outfd) {
 				bridge_channel_handle_write(bridge_channel);




More information about the asterisk-commits mailing list