]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 217990 via svnmerge from
authorTilghman Lesher <tilghman@meg.abyt.es>
Fri, 11 Sep 2009 05:59:17 +0000 (05:59 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Fri, 11 Sep 2009 05:59:17 +0000 (05:59 +0000)
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

apps/app_queue.c

index 71526a9cf1a7fc69a75217e1a446a1199fd0a027..85102a930c26ef1c214dfabcb15779b2a76f758b 100644 (file)
@@ -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))) {