diff options
author | pcadach <pcadach@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-10-02 17:15:11 +0000 |
---|---|---|
committer | pcadach <pcadach@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-10-02 17:15:11 +0000 |
commit | 23ec5459f8b00aeca18aa9abeea144964e5490cc (patch) | |
tree | 09c34daa97b938279a3dab10f1e1f0db64d667ac /channels/chan_h323.c | |
parent | 8adbde05e29df76961e1ee6d929536ca58b5e2aa (diff) |
Optimization of oh323_indicate(): less locks - less problems, plus single exit point
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@44166 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_h323.c')
-rw-r--r-- | channels/chan_h323.c | 53 |
1 files changed, 17 insertions, 36 deletions
diff --git a/channels/chan_h323.c b/channels/chan_h323.c index cf646b574..3ef75063b 100644 --- a/channels/chan_h323.c +++ b/channels/chan_h323.c @@ -870,6 +870,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) @@ -880,69 +882,48 @@ 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: ast_moh_start(c, data, NULL); - if (token) - free(token); - return 0; + res = 0; + break; case AST_CONTROL_UNHOLD: 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); |