]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
automerge commit
authorAutomerge Script <automerge@asterisk.org>
Tue, 10 Jul 2007 20:30:13 +0000 (20:30 +0000)
committerAutomerge Script <automerge@asterisk.org>
Tue, 10 Jul 2007 20:30:13 +0000 (20:30 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2-netsec@74473 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_queue.c

index cedf9983e3e99c87e627bc7cd47b031c24293eeb..4b790b7f82a216faf631f6f153543233a27a6f97 100644 (file)
@@ -1331,21 +1331,17 @@ static int say_position(struct queue_ent *qe)
        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);
 }
 
@@ -2082,7 +2078,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;
 
@@ -2099,6 +2095,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;
 }
@@ -2179,6 +2177,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
        time_t now = time(NULL);
        struct ast_bridge_config bridge_config;
        char nondataquality = 1;
+       int callcompletedinsl;
 
        memset(&bridge_config, 0, sizeof(bridge_config));
        time(&now);
@@ -2309,7 +2308,11 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
                if (!strcmp(peer->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;
@@ -2454,7 +2457,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: