aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authormmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2007-12-11 17:42:25 +0000
committermmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2007-12-11 17:42:25 +0000
commite22376d01e99702ae428b9767abb190c9eee6d85 (patch)
tree2d674ab694f5cf820aa57e9744f5b3fad63864c8 /apps
parent7aeccf3b4b927a40ae17e7588befa3310f765699 (diff)
Fixing autofill to be more accurate. Specifically, if calls ahead of the current
caller were ringing members (but not yet bridged) there could be available members and waiting callers who would not get matched up. The member availability checker was correctly determining the number of available members in this scenario, but the queue itself did not parallelly reflect this status on the pending calls. This commit corrects the issue. (closes issue #11459, reported by equissoftware, patched by me) git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@92323 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rw-r--r--apps/app_queue.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c
index d40237f75..e1e3374a8 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -308,6 +308,7 @@ struct queue_ent {
time_t last_pos; /*!< Last time we told the user their position */
int opos; /*!< Where we started in the queue */
int handled; /*!< Whether our call was handled */
+ int pending; /*!< Non-zero if we are attempting to call a member */
int max_penalty; /*!< Limit the members that can take this call to this penalty or lower */
time_t start; /*!< When we started holding */
time_t expire; /*!< When this entry should expire (time out of queue) */
@@ -2320,7 +2321,7 @@ static int is_our_turn(struct queue_ent *qe)
if (option_debug)
ast_log(LOG_DEBUG, "There are %d available members.\n", avl);
- while ((idx < avl) && (ch) && (ch != qe)) {
+ while ((idx < avl) && (ch) && !ch->pending && (ch != qe)) {
idx++;
ch = ch->next;
}
@@ -2658,6 +2659,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
to = (qe->expire - now) * 1000;
else
to = (qe->parent->timeout) ? qe->parent->timeout * 1000 : -1;
+ ++qe->pending;
ring_one(qe, outgoing, &numbusies);
ast_mutex_unlock(&qe->parent->lock);
if (use_weight)
@@ -2674,6 +2676,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
ast_mutex_unlock(&qe->parent->lock);
peer = lpeer ? lpeer->chan : NULL;
if (!peer) {
+ qe->pending = 0;
if (to) {
/* Must gotten hung up */
res = -1;