diff options
author | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-08-18 20:24:29 +0000 |
---|---|---|
committer | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-08-18 20:24:29 +0000 |
commit | e454529ee3e7c45fcb53cab0aee945f789bb8679 (patch) | |
tree | 6c0d7f51fb54f449326a7c1a3111fa9ceeda09b6 | |
parent | 3e7536ef4d52dc5db7123e7ff549bc608391a764 (diff) |
Merged revisions 138694 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
........
r138694 | mmichelson | 2008-08-18 15:23:11 -0500 (Mon, 18 Aug 2008) | 10 lines
Change the queue timeout priority logic into less ugly
and confusing code pieces. Clarify the logic within
queues.conf.sample.
(closes issue #12690)
Reported by: atis
Patches:
queue_timeoutpriority.patch uploaded by atis (license 242)
........
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.1@138698 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | apps/app_queue.c | 28 | ||||
-rw-r--r-- | configs/queues.conf.sample | 18 |
2 files changed, 37 insertions, 9 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c index 405443737..8f94ef11b 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -2314,6 +2314,14 @@ static int ring_one(struct queue_ent *qe, struct callattempt *outgoing, int *bus ast_debug(1, "Trying '%s' with metric %d\n", best->interface, best->metric); ret = ring_entry(qe, best, busies); } + + /* If we have timed out, break out */ + if (qe->expire && (time(NULL) >= qe->expire)) { + if (option_debug) + ast_log(LOG_DEBUG, "Queue timed out while ringing members.\n"); + ret = 0; + break; + } } return ret; @@ -3407,10 +3415,22 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce } } - if (qe->expire && (!qe->parent->timeout || (qe->parent->timeoutpriority == TIMEOUT_PRIORITY_APP && (qe->expire - now) <= qe->parent->timeout))) - to = (qe->expire - now) * 1000; - else - to = (qe->parent->timeout) ? qe->parent->timeout * 1000 : -1; + if (qe->parent->timeoutpriority == TIMEOUT_PRIORITY_APP) { + /* Application arguments have higher timeout priority (behaviour for <=1.6) */ + if (qe->expire && (!qe->parent->timeout || (qe->expire - now) <= qe->parent->timeout)) + to = (qe->expire - now) * 1000; + else + to = (qe->parent->timeout) ? qe->parent->timeout * 1000 : -1; + } else { + /* Config timeout is higher priority thatn application timeout */ + if (qe->expire && qe->expire<=now) { + to = 0; + } else if (qe->parent->timeout) { + to = qe->parent->timeout * 1000; + } else { + to = -1; + } + } orig = to; ++qe->pending; ao2_unlock(qe->parent); diff --git a/configs/queues.conf.sample b/configs/queues.conf.sample index e4f6dd3bd..8e3b96d2b 100644 --- a/configs/queues.conf.sample +++ b/configs/queues.conf.sample @@ -148,11 +148,19 @@ shared_lastcall=no ; Queue application is more important. In the scenario above, timeoutpriority=app ; would result in the second member's phone ringing for 1 second. ; -; There are a few exceptions to the priority rules. For instance, if the configuration -; file timeout is set to 0, but the application argument timeout is non-zero, then the -; timeoutpriority is ignored and the application argument is used as the timeout. Furthermore, -; if no application argument timeout is specified, then the timeoutpriority option is -; ignored and the configuration file timeout is always used when calling queue members. +; There are a few exceptions to the priority rules. For instance, if timeoutpriority=appp +; and the configuration file timeout is set to 0, but the application argument timeout is +; non-zero, then the timeoutpriority is ignored and the application argument is used as +; the timeout. Furthermore, if no application argument timeout is specified, then the +; timeoutpriority option is ignored and the configuration file timeout is always used +; when calling queue members. +; +; In timeoutpriority=conf mode however timeout specified in config file will take higher +; priority than timeout in application arguments, so if config file has timeout 0, each +; queue member will be called indefineately and application timeout will be checked only +; after this call attempt. This is useful for having queue members with custom timeouts +; specified within Dial application of Local channel, and allows handling NO ANSWER which +; would otherwise be interrupted by queue destroying child channel on timeout. ; ; The default value for timeoutpriority is "app" since this was how previous versions of ; Asterisk behaved. |