Index: apps/app_queue.c =================================================================== --- apps/app_queue.c (revision 137818) +++ apps/app_queue.c (working copy) @@ -2314,6 +2314,14 @@ 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 @@ } } - 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); Index: configs/queues.conf.sample =================================================================== --- configs/queues.conf.sample (revision 137818) +++ configs/queues.conf.sample (working copy) @@ -148,12 +148,20 @@ ; 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. ;