aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2009-09-10 23:52:22 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2009-09-10 23:52:22 +0000
commit5a82dd8a9322bf8790b38d0dca0a64db6fffb65b (patch)
tree72f9f41eeb3af708d7b8c9c96de8d62a2300f2d6 /apps
parent8b31f49c4e6b53e1eeff2ba651412bb5879f4748 (diff)
Don't ring another channel, if there's not enough time for a queue member to answer.
(Fixes AST-228) git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@217989 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rw-r--r--apps/app_queue.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c
index d254eb251..cfcc9fb05 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -1948,6 +1948,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;
@@ -2243,7 +2244,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) {
@@ -2342,7 +2347,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;
@@ -2358,7 +2367,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;
@@ -2374,18 +2386,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))) {