diff --git a/apps/app_queue.c b/apps/app_queue.c index 8e0192ce3e..78959a80d1 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -1376,21 +1376,17 @@ playout: return res; } -static void recalc_holdtime(struct queue_ent *qe) +static void recalc_holdtime(struct queue_ent *qe, int newholdtime) { - int oldvalue, newvalue; + int oldvalue; /* Calculate holdtime using a recursive boxcar filter */ /* Thanks to SRT for this contribution */ /* 2^2 (4) is the filter coefficient; a higher exponent would give old entries more weight */ - newvalue = time(NULL) - qe->start; - ast_mutex_lock(&qe->parent->lock); - if (newvalue <= qe->parent->servicelevel) - qe->parent->callscompletedinsl++; oldvalue = qe->parent->holdtime; - qe->parent->holdtime = (((oldvalue << 2) - oldvalue) + newvalue) >> 2; + qe->parent->holdtime = (((oldvalue << 2) - oldvalue) + newholdtime) >> 2; ast_mutex_unlock(&qe->parent->lock); } @@ -2219,7 +2215,7 @@ static int wait_our_turn(struct queue_ent *qe, int ringing, enum queue_result *r return res; } -static int update_queue(struct call_queue *q, struct member *member) +static int update_queue(struct call_queue *q, struct member *member, int callcompletedinsl) { struct member *cur; @@ -2236,6 +2232,8 @@ static int update_queue(struct call_queue *q, struct member *member) cur = cur->next; } q->callscompleted++; + if (callcompletedinsl) + q->callscompletedinsl++; ast_mutex_unlock(&q->lock); return 0; } @@ -2329,6 +2327,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce char *p; char vars[2048]; int forwardsallowed = 1; + int callcompletedinsl; memset(&bridge_config, 0, sizeof(bridge_config)); time(&now); @@ -2441,7 +2440,11 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce if (!strcmp(peer->tech->type, "Zap")) ast_channel_setoption(peer, AST_OPTION_TONE_VERIFY, &nondataquality, sizeof(nondataquality), 0); /* Update parameters for the queue */ - recalc_holdtime(qe); + time(&now); + recalc_holdtime(qe, (now - qe->start)); + ast_mutex_lock(&qe->parent->lock); + callcompletedinsl = ((now - qe->start) <= qe->parent->servicelevel); + ast_mutex_unlock(&qe->parent->lock); member = lpeer->member; hangupcalls(outgoing, peer); outgoing = NULL; @@ -2688,7 +2691,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce if (bridge != AST_PBX_NO_HANGUP_PEER) ast_hangup(peer); - update_queue(qe->parent, member); + update_queue(qe->parent, member, callcompletedinsl); res = bridge ? bridge : 1; } out: