diff --git a/apps/app_queue.c b/apps/app_queue.c index 1fa81dc7c0130576a7badba03d3ea8c07842fc5e..7da41e16ba93028ef8cc30d811a812b3c3f99635 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;