From: Paul Cadach Date: Mon, 2 Oct 2006 18:57:49 +0000 (+0000) Subject: Merged revisions 44166 via svnmerge from X-Git-Tag: 1.6.0-beta1~3^2~4549 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b018f5930754136b6bdfb1bd7f548dbc9bf909e0;p=thirdparty%2Fasterisk.git Merged revisions 44166 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ 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 --- 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);