From e8509b016f8bf0bf1ddafecdb98db9ce94813e04 Mon Sep 17 00:00:00 2001 From: mmichelson Date: Tue, 11 Dec 2007 17:44:42 +0000 Subject: Merged revisions 92323 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r92323 | mmichelson | 2007-12-11 11:42:25 -0600 (Tue, 11 Dec 2007) | 10 lines 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/trunk@92324 f38db490-d61c-443f-a65b-d21fe96a405b --- apps/app_queue.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'apps') diff --git a/apps/app_queue.c b/apps/app_queue.c index 1fa81dc7c..7da41e16b 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -324,6 +324,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 */ int linpos; /*!< If using linear strategy, what position are we at? */ int linwrapped; /*!< Is the linpos wrapped? */ @@ -2480,7 +2481,7 @@ static int is_our_turn(struct queue_ent *qe) ast_debug(1, "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; } @@ -2907,6 +2908,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce else to = (qe->parent->timeout) ? qe->parent->timeout * 1000 : -1; orig = to; + ++qe->pending; ring_one(qe, outgoing, &numbusies); ao2_unlock(qe->parent); if (use_weight) @@ -2926,6 +2928,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce ao2_unlock(qe->parent); peer = lpeer ? lpeer->chan : NULL; if (!peer) { + qe->pending = 0; if (to) { /* Must gotten hung up */ res = -1; -- cgit v1.2.3