diff options
author | Mark Spencer <markster@digium.com> | 2003-08-13 18:29:58 +0000 |
---|---|---|
committer | Mark Spencer <markster@digium.com> | 2003-08-13 18:29:58 +0000 |
commit | 66252c0f4b2afa5fbd4d680c5cd389c2de61307b (patch) | |
tree | 1ac413cd10cfa9aa21e237f3ae6a9287593dff0c | |
parent | d91f72fd5f050db6c06497089e158b2d1dbf9586 (diff) |
Lock on indication, fix agent buglet
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1313 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rwxr-xr-x | channel.c | 7 | ||||
-rwxr-xr-x | channels/chan_agent.c | 2 |
2 files changed, 7 insertions, 2 deletions
@@ -1150,6 +1150,7 @@ int ast_indicate(struct ast_channel *chan, int condition) /* Stop if we're a zombie or need a soft hangup */ if (chan->zombie || ast_check_hangup(chan)) return -1; + ast_mutex_lock(&chan->lock); if (chan->pvt->indicate) res = chan->pvt->indicate(chan, condition); if (!chan->pvt->indicate || res) { @@ -1173,17 +1174,19 @@ int ast_indicate(struct ast_channel *chan, int condition) if (ts && ts->data[0]) { ast_log(LOG_DEBUG, "Driver for channel '%s' does not support indication %d, emulating it\n", chan->name, condition); ast_playtones_start(chan,0,ts->data, 1); + res = 0; } else if (condition == AST_CONTROL_PROGRESS) { /* ast_playtones_stop(chan); */ } else { /* not handled */ ast_log(LOG_WARNING, "Unable to handle indication %d for '%s'\n", condition, chan->name); - return -1; + res = -1; } } else ast_playtones_stop(chan); } - return 0; + ast_mutex_unlock(&chan->lock); + return res; } int ast_recvchar(struct ast_channel *chan, int timeout) diff --git a/channels/chan_agent.c b/channels/chan_agent.c index 307564329..3a67573e5 100755 --- a/channels/chan_agent.c +++ b/channels/chan_agent.c @@ -246,6 +246,8 @@ static struct ast_frame *agent_read(struct ast_channel *ast) ast_mutex_lock(&p->lock); CHECK_FORMATS(ast, p); if (p->chan) { + p->chan->exception = ast->exception; + p->chan->fdno = ast->fdno; f = ast_read(p->chan); } else f = &null_frame; |