diff options
-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. |