From 1d685bd28ca64f6093ae86d0fe2974612c05f1cd Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Thu, 3 Jan 2013 19:42:54 +0000 Subject: chan_agent: Fix wrapup time wait response. * Made agent_cont_sleep() and agent_ack_sleep() stop waiting if the wrapup time expires. agent_cont_sleep() had tried but returned the wrong value to stop waiting. * Made agent_ack_sleep() take a struct agent_pvt pointer instead of a void pointer for better type safety. ........ Merged revisions 378486 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 378487 from http://svn.asterisk.org/svn/asterisk/branches/11 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@378488 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_agent.c | 48 ++++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) (limited to 'channels') diff --git a/channels/chan_agent.c b/channels/chan_agent.c index dc93c4ffd..1ed296845 100644 --- a/channels/chan_agent.c +++ b/channels/chan_agent.c @@ -1022,42 +1022,38 @@ static int agent_hangup(struct ast_channel *ast) return 0; } -static int agent_cont_sleep( void *data ) +static int agent_cont_sleep(void *data) { struct agent_pvt *p; int res; - p = (struct agent_pvt *)data; + p = (struct agent_pvt *) data; ast_mutex_lock(&p->lock); res = p->app_sleep_cond; - if (p->lastdisc.tv_sec) { - if (ast_tvdiff_ms(ast_tvnow(), p->lastdisc) > 0) - res = 1; + if (res && p->lastdisc.tv_sec) { + if (ast_tvdiff_ms(ast_tvnow(), p->lastdisc) > 0) { + res = 0; + } } ast_mutex_unlock(&p->lock); - if (!res) - ast_debug(5, "agent_cont_sleep() returning %d\n", res ); + if (!res) { + ast_debug(5, "agent_cont_sleep() returning %d\n", res); + } return res; } -static int agent_ack_sleep(void *data) +static int agent_ack_sleep(struct agent_pvt *p) { - struct agent_pvt *p; - int res=0; + int digit; int to = 1000; struct ast_frame *f; struct timeval start = ast_tvnow(); int ms; /* Wait a second and look for something */ - - p = (struct agent_pvt *) data; - if (!p->chan) - return -1; - while ((ms = ast_remaining_ms(start, to))) { ms = ast_waitfor(p->chan, ms); if (ms < 0) { @@ -1067,23 +1063,31 @@ static int agent_ack_sleep(void *data) return 0; } f = ast_read(p->chan); - if (!f) + if (!f) { return -1; - if (f->frametype == AST_FRAME_DTMF) - res = f->subclass.integer; - else - res = 0; + } + if (f->frametype == AST_FRAME_DTMF) { + digit = f->subclass.integer; + } else { + digit = 0; + } ast_frfree(f); ast_mutex_lock(&p->lock); if (!p->app_sleep_cond) { ast_mutex_unlock(&p->lock); return 0; - } else if (res == p->acceptdtmf) { + } + if (digit == p->acceptdtmf) { ast_mutex_unlock(&p->lock); return 1; } + if (p->lastdisc.tv_sec) { + if (ast_tvdiff_ms(ast_tvnow(), p->lastdisc) > 0) { + ast_mutex_unlock(&p->lock); + return 0; + } + } ast_mutex_unlock(&p->lock); - res = 0; } return 0; } -- cgit v1.2.3