mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 04:11:08 +00:00
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/trunk@217990 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -2710,6 +2710,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;
|
||||
@@ -3082,7 +3083,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) {
|
||||
/* We go with a static buffer here instead of using ast_strdupa. Using
|
||||
* ast_strdupa in a loop like this one can cause a stack overflow
|
||||
@@ -3231,7 +3236,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;
|
||||
@@ -3246,7 +3255,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;
|
||||
@@ -3286,18 +3298,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))) {
|
||||
|
Reference in New Issue
Block a user