From f7e1073af548cca689695a43a5bf6b8f2c293ccd Mon Sep 17 00:00:00 2001
From: Automerge script <automerge@asterisk.org>
Date: Thu, 10 Jan 2013 02:20:50 +0000
Subject: [PATCH] Merged revisions 378874 via svnmerge from
 file:///srv/subversion/repos/asterisk/trunk

........
  r378874 | rmudgett | 2013-01-09 19:43:27 -0600 (Wed, 09 Jan 2013) | 4 lines

  * Removed some noop code and restructured an else-if ladder in ast_generic_bridge().

  * Trivial changes in ast_channel_bridge().
........


git-svn-id: https://origsvn.digium.com/svn/asterisk/team/mmichelson/threadpool@378883 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 main/channel.c | 49 +++++++++++++++++++++----------------------------
 1 file changed, 21 insertions(+), 28 deletions(-)

diff --git a/main/channel.c b/main/channel.c
index 463ee672f5..49ee80cfc8 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -7559,16 +7559,18 @@ static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct
 			res = AST_BRIDGE_RETRY;
 			break;
 		}
-		if (config->nexteventts.tv_sec) {
+		if (!ast_tvzero(config->nexteventts)) {
 			to = ast_tvdiff_ms(config->nexteventts, ast_tvnow());
 			if (to <= 0) {
-				if (config->timelimit && !config->feature_timer && !ast_test_flag(config, AST_FEATURE_WARNING_ACTIVE)) {
+				if (config->feature_timer) {
+					/* feature timer expired - make sure we do not play warning */
+					ast_clear_flag(config, AST_FEATURE_WARNING_ACTIVE);
+					/* Indicate a feature timeout. */
 					res = AST_BRIDGE_RETRY;
+				} else if (config->timelimit
+					&& !ast_test_flag(config, AST_FEATURE_WARNING_ACTIVE)) {
 					/* generic bridge ending to play warning */
 					ast_set_flag(config, AST_FEATURE_WARNING_ACTIVE);
-				} else if (config->feature_timer) {
-					/* feature timer expired - make sure we do not play warning */
-					ast_clear_flag(config, AST_FEATURE_WARNING_ACTIVE);
 					res = AST_BRIDGE_RETRY;
 				} else {
 					res = AST_BRIDGE_COMPLETE;
@@ -7576,17 +7578,6 @@ static enum ast_bridge_result ast_generic_bridge(struct ast_channel *c0, struct
 				break;
 			}
 		} else {
-			/* If a feature has been started and the bridge is configured to
-			 * to not break, leave the channel bridge when the feature timer
-			 * time has elapsed so the DTMF will be sent to the other side.
-			 */
-			if (!ast_tvzero(config->nexteventts)) {
-				int diff = ast_tvdiff_ms(config->nexteventts, ast_tvnow());
-				if (diff <= 0) {
-					res = AST_BRIDGE_RETRY;
-					break;
-				}
-			}
 			to = -1;
 		}
 		/* Calculate the appropriate max sleep interval - in general, this is the time,
@@ -7838,7 +7829,7 @@ static void bridge_play_sounds(struct ast_channel *c0, struct ast_channel *c1)
 enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_channel *c1,
 					  struct ast_bridge_config *config, struct ast_frame **fo, struct ast_channel **rc)
 {
-	enum ast_bridge_result res = AST_BRIDGE_COMPLETE;
+	enum ast_bridge_result res;
 	struct ast_format_cap *o0nativeformats;
 	struct ast_format_cap *o1nativeformats;
 	long time_left_ms=0;
@@ -7850,18 +7841,18 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha
 	if (ast_channel_internal_bridged_channel(c0)) {
 		ast_log(LOG_WARNING, "%s is already in a bridge with %s\n",
 			ast_channel_name(c0), ast_channel_name(ast_channel_internal_bridged_channel(c0)));
-		return -1;
+		return AST_BRIDGE_FAILED;
 	}
 	if (ast_channel_internal_bridged_channel(c1)) {
 		ast_log(LOG_WARNING, "%s is already in a bridge with %s\n",
 			ast_channel_name(c1), ast_channel_name(ast_channel_internal_bridged_channel(c1)));
-		return -1;
+		return AST_BRIDGE_FAILED;
 	}
 
 	/* Stop if we're a zombie or need a soft hangup */
 	if (ast_test_flag(ast_channel_flags(c0), AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c0) ||
 	    ast_test_flag(ast_channel_flags(c1), AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c1))
-		return -1;
+		return AST_BRIDGE_FAILED;
 
 	o0nativeformats = ast_format_cap_dup(ast_channel_nativeformats(c0));
 	o1nativeformats = ast_format_cap_dup(ast_channel_nativeformats(c1));
@@ -7869,7 +7860,7 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha
 		ast_format_cap_destroy(o0nativeformats);
 		ast_format_cap_destroy(o1nativeformats);
 		ast_log(LOG_WARNING, "failed to copy native formats\n");
-		return -1;
+		return AST_BRIDGE_FAILED;
 	}
 
 	caller_warning = ast_test_flag(&config->features_caller, AST_FEATURE_PLAY_WARNING);
@@ -7910,8 +7901,7 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha
 			config->nexteventts = ast_tvsub(config->nexteventts, ast_samp2tv(next_warn, 1000));
 		}
 	} else {
-		config->nexteventts.tv_sec = 0;
-		config->nexteventts.tv_usec = 0;
+		config->nexteventts = ast_tv(0, 0);
 	}
 
 	if (!ast_channel_tech(c0)->send_digit_begin)
@@ -7928,8 +7918,6 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha
 		struct timeval now = { 0, };
 		int to;
 
-		to = -1;
-
 		if (!ast_tvzero(config->nexteventts)) {
 			now = ast_tvnow();
 			to = ast_tvdiff_ms(config->nexteventts, now);
@@ -7940,6 +7928,8 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha
 				}
 				to = 0;
 			}
+		} else {
+			to = -1;
 		}
 
 		if (config->timelimit) {
@@ -7953,8 +7943,11 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha
 				if (callee_warning && config->end_sound)
 					bridge_playfile(c1, c0, config->end_sound, 0);
 				*fo = NULL;
-				res = 0;
-				ast_test_suite_event_notify("BRIDGE_TIMELIMIT", "Channel1: %s\r\nChannel2: %s", ast_channel_name(c0), ast_channel_name(c1));
+				res = AST_BRIDGE_COMPLETE;
+				ast_test_suite_event_notify("BRIDGE_TIMELIMIT",
+					"Channel1: %s\r\n"
+					"Channel2: %s",
+					ast_channel_name(c0), ast_channel_name(c1));
 				break;
 			}
 
@@ -7993,7 +7986,7 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha
 		if (ast_test_flag(ast_channel_flags(c0), AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c0) ||
 		    ast_test_flag(ast_channel_flags(c1), AST_FLAG_ZOMBIE) || ast_check_hangup_locked(c1)) {
 			*fo = NULL;
-			res = 0;
+			res = AST_BRIDGE_COMPLETE;
 			ast_debug(1, "Bridge stops because we're zombie or need a soft hangup: c0=%s, c1=%s, flags: %s,%s,%s,%s\n",
 				ast_channel_name(c0), ast_channel_name(c1),
 				ast_test_flag(ast_channel_flags(c0), AST_FLAG_ZOMBIE) ? "Yes" : "No",
-- 
GitLab