From b018f5930754136b6bdfb1bd7f548dbc9bf909e0 Mon Sep 17 00:00:00 2001
From: Paul Cadach <paul@odt.east.telecom.kz>
Date: Mon, 2 Oct 2006 18:57:49 +0000
Subject: [PATCH] Merged revisions 44166 via svnmerge from
 https://origsvn.digium.com/svn/asterisk/branches/1.4
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

........
r44166 | pcadach | 2006-10-02 23:15:11 +0600 (Пнд, 02 Окт 2006) | 1 line

Optimization of oh323_indicate(): less locks - less problems, plus single exit point
........


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@44187 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 channels/chan_h323.c | 53 ++++++++++++++------------------------------
 1 file changed, 17 insertions(+), 36 deletions(-)

diff --git a/channels/chan_h323.c b/channels/chan_h323.c
index abe68d7da8..f5bad9c435 100644
--- a/channels/chan_h323.c
+++ b/channels/chan_h323.c
@@ -873,6 +873,8 @@ static int oh323_indicate(struct ast_channel *c, int condition, const void *data
 	got_progress = pvt->got_progress;
 	if (condition == AST_CONTROL_PROGRESS)
 		pvt->got_progress = 1;
+	else if ((condition == AST_CONTROL_BUSY) || (condition == AST_CONTROL_CONGESTION))
+		pvt->alreadygone = 1;
 	ast_mutex_unlock(&pvt->lock);
 
 	if (h323debug)
@@ -883,72 +885,51 @@ static int oh323_indicate(struct ast_channel *c, int condition, const void *data
 		if (c->_state == AST_STATE_RING || c->_state == AST_STATE_RINGING) {
 			h323_send_alerting(token);
 			res = (got_progress ? 0 : -1);	/* Do not simulate any audio tones if we got PROGRESS message */
-			break;
 		}
-		if (token)
-			free(token);
-		return -1;
+		break;
 	case AST_CONTROL_PROGRESS:
 		if (c->_state != AST_STATE_UP) {
 			/* Do not send PROGRESS message more than once */
 			if (!got_progress)
 				h323_send_progress(token);
-			break;
+			res = 0;
 		}
-		if (token)
-			free(token);
-		return -1;
+		break;
 	case AST_CONTROL_BUSY:
 		if (c->_state != AST_STATE_UP) {
 			h323_answering_call(token, 1);
-			ast_mutex_lock(&pvt->lock);
-			pvt->alreadygone = 1;
-			ast_mutex_unlock(&pvt->lock);
 			ast_softhangup_nolock(c, AST_SOFTHANGUP_DEV);
-			break;
+			res = 0;
 		}
-		if (token)
-			free(token);
-		return -1;
+		break;
 	case AST_CONTROL_CONGESTION:
 		if (c->_state != AST_STATE_UP) {
 			h323_answering_call(token, 1);
-			ast_mutex_lock(&pvt->lock);
-			pvt->alreadygone = 1;
-			ast_mutex_unlock(&pvt->lock);
 			ast_softhangup_nolock(c, AST_SOFTHANGUP_DEV);
-			break;
+			res = 0;
 		}
-		if (token)
-			free(token);
-		return -1;
+		break;
 	case AST_CONTROL_HOLD:
 		h323_hold_call(token, 1);
 		/* We should start MOH only if remote party isn't provide audio for us */
 		ast_moh_start(c, data, NULL);
-		if (token)
-			free(token);
-		return 0;
+		res = 0;
+		break;
 	case AST_CONTROL_UNHOLD:
 		h323_hold_call(token, 0);
 		ast_moh_stop(c);
-		if (token)
-			free(token);
-		return 0;
+		res = 0;
+		break;
 	case AST_CONTROL_PROCEEDING:
 	case -1:
-		if (token)
-			free(token);
-		return -1;
+		break;
 	default:
-		ast_log(LOG_WARNING, "Don't know how to indicate condition %d on %s\n", condition, token);
-		if (token)
-			free(token);
-		return -1;
+		ast_log(LOG_WARNING, "OH323: Don't know how to indicate condition %d on %s\n", condition, token);
+		break;
 	}
 
 	if (h323debug)
-		ast_log(LOG_DEBUG, "OH323: Indicated %d on %s\n", condition, token);
+		ast_log(LOG_DEBUG, "OH323: Indicated %d on %s, res=%d\n", condition, token, res);
 	if (token)
 		free(token);
 	oh323_update_info(c);
-- 
GitLab