Merged revisions 78575 via svnmerge from
authorMark Michelson <mmichelson@digium.com>
Wed, 8 Aug 2007 14:34:10 +0000 (14:34 +0000)
committerMark Michelson <mmichelson@digium.com>
Wed, 8 Aug 2007 14:34:10 +0000 (14:34 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r78575 | mmichelson | 2007-08-08 09:26:36 -0500 (Wed, 08 Aug 2007) | 4 lines

Changing a bit of logic so that someone will NEVER exit the queue on timeout unless they have enabled the 'n' option.
This commit relates to issue #10320. Thanks to jfitzgibbon for detailing the idea behind this code change.

........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@78590 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_queue.c

index 79dd301..724f66c 100644 (file)
@@ -2456,7 +2456,7 @@ static void send_agent_complete(const struct queue_ent *qe, const char *queuenam
                qe->parent->eventwhencalled == QUEUE_EVENT_VARIABLES ? vars2manager(qe->chan, vars, vars_len) : "");
 }
 
-static int try_calling(struct queue_ent *qe, const char *options, char *announceoverride, const char *url, int *go_on, const char *agi, const char *macro, const char *gosub, int ringing)
+static int try_calling(struct queue_ent *qe, const char *options, char *announceoverride, const char *url, int *tries, int *noption, const char *agi, const char *macro, const char *gosub, int ringing)
 {
        struct member *cur;
        struct callattempt *outgoing = NULL; /* the list of calls we are building */
@@ -2494,7 +2494,6 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
        char vars[2048];
        int forwardsallowed = 1;
        int callcompletedinsl;
-       int noption = 0;
 
        memset(&bridge_config, 0, sizeof(bridge_config));
        time(&now);
@@ -2524,19 +2523,16 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
                        break;
                case 'n':
                        if (qe->parent->strategy == QUEUE_STRATEGY_RRMEMORY)
-                               (*go_on)++;
+                               (*tries)++;
                        else
-                               *go_on = qe->parent->membercount;
-                       noption = 1;
+                               *tries = qe->parent->membercount;
+                       *noption = 1;
                        break;
                case 'i':
                        forwardsallowed = 0;
                        break;
                }
 
-       if(!noption)
-               *go_on = -1;
-
        /* Hold the lock while we setup the outgoing calls */
        if (use_weight)
                AST_LIST_LOCK(&queues);
@@ -3505,7 +3501,8 @@ static int queue_exec(struct ast_channel *chan, void *data)
        int max_penalty;
        enum queue_result reason = QUEUE_UNKNOWN;
        /* whether to exit Queue application after the timeout hits */
-       int go_on = 0;
+       int tries = 0;
+       int noption = 0;
        char *parse;
        int makeannouncement = 0;
        AST_DECLARE_APP_ARGS(args,
@@ -3633,14 +3630,14 @@ check_turns:
                                        goto stop;
 
                        /* Try calling all queue members for 'timeout' seconds */
-                       res = try_calling(&qe, args.options, args.announceoverride, args.url, &go_on, args.agi, args.macro, args.gosub, ringing);
+                       res = try_calling(&qe, args.options, args.announceoverride, args.url, &tries, &noption, args.agi, args.macro, args.gosub, ringing);
                        if (res)
                                goto stop;
 
                        stat = get_member_status(qe.parent, qe.max_penalty);
 
                        /* exit after 'timeout' cycle if 'n' option enabled */
-                       if (go_on >= qe.parent->membercount) {
+                       if (noption && tries >= qe.parent->membercount) {
                                ast_verb(3, "Exiting on time-out cycle\n");
                                ast_queue_log(args.queuename, chan->uniqueid, "NONE", "EXITWITHTIMEOUT", "%d", qe.pos);
                                record_abandoned(&qe);