From: Tilghman Lesher Date: Fri, 11 Sep 2009 05:59:17 +0000 (+0000) Subject: Merged revisions 217990 via svnmerge from X-Git-Tag: 1.6.1.7-rc1~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6d32c10c14cb5955e37de4cc862b58c96642ba8e;p=thirdparty%2Fasterisk.git Merged revisions 217990 via svnmerge from https://origsvn.digium.com/svn/asterisk/trunk ................ r217990 | tilghman | 2009-09-10 18:54:51 -0500 (Thu, 10 Sep 2009) | 10 lines Merged revisions 217989 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r217989 | tilghman | 2009-09-10 18:52:22 -0500 (Thu, 10 Sep 2009) | 3 lines Don't ring another channel, if there's not enough time for a queue member to answer. (Fixes AST-228) ........ ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@218053 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/apps/app_queue.c b/apps/app_queue.c index 71526a9cf1..85102a930c 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -2300,6 +2300,7 @@ static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies /* Inherit specially named variables from parent channel */ ast_channel_inherit_variables(qe->chan, tmp->chan); + ast_channel_datastore_inherit(qe->chan, tmp->chan); /* Presense of ADSI CPE on outgoing channel follows ours */ tmp->chan->adsicpe = qe->chan->adsicpe; @@ -2655,7 +2656,11 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte *to = 0; return NULL; } + + /* Poll for events from both the incoming channel as well as any outgoing channels */ winner = ast_waitfor_n(watchers, pos, to); + + /* Service all of the outgoing channels */ for (o = start; o; o = o->call_next) { if (o->stillgoing && (o->chan) && (o->chan->_state == AST_STATE_UP)) { if (!peer) { @@ -2749,7 +2754,11 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte if (qe->parent->strategy != QUEUE_STRATEGY_RINGALL) { if (qe->parent->timeoutrestart) *to = orig; - ring_one(qe, outgoing, &numbusies); + /* Have enough time for a queue member to answer? */ + if (*to > 500) { + ring_one(qe, outgoing, &numbusies); + starttime = (long) time(NULL); + } } numbusies++; break; @@ -2764,7 +2773,10 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte if (qe->parent->strategy != QUEUE_STRATEGY_RINGALL) { if (qe->parent->timeoutrestart) *to = orig; - ring_one(qe, outgoing, &numbusies); + if (*to > 500) { + ring_one(qe, outgoing, &numbusies); + starttime = (long) time(NULL); + } } numbusies++; break; @@ -2779,18 +2791,23 @@ static struct callattempt *wait_for_answer(struct queue_ent *qe, struct callatte } } ast_frfree(f); - } else { + } else { /* ast_read() returned NULL */ endtime = (long) time(NULL) - starttime; rna(endtime * 1000, qe, on, membername, 1); do_hang(o); if (qe->parent->strategy != QUEUE_STRATEGY_RINGALL) { if (qe->parent->timeoutrestart) *to = orig; - ring_one(qe, outgoing, &numbusies); + if (*to > 500) { + ring_one(qe, outgoing, &numbusies); + starttime = (long) time(NULL); + } } } } } + + /* If we received an event from the caller, deal with it. */ if (winner == in) { f = ast_read(in); if (!f || ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP))) {