[asterisk-commits] qwell: trunk r74429 - in /trunk: ./ apps/app_queue.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Jul 10 15:02:05 CDT 2007


Author: qwell
Date: Tue Jul 10 15:02:05 2007
New Revision: 74429

URL: http://svn.digium.com/view/asterisk?view=rev&rev=74429
Log:
Merged revisions 74428 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.4

(closes issue #10158)
................
r74428 | qwell | 2007-07-10 14:58:53 -0500 (Tue, 10 Jul 2007) | 14 lines

Merged revisions 74427 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.2

........
r74427 | qwell | 2007-07-10 14:57:20 -0500 (Tue, 10 Jul 2007) | 6 lines

Fix an issue where it was possible to have a service level of over 100%
Between the time recalc_holdtime and update_queue was called, it was possible that the call could have been hungup.
Move both additions to the same place, so this won't happen.

Issue 10158, initial patch by makoto, modified by me.

........

................

Modified:
    trunk/   (props changed)
    trunk/apps/app_queue.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.

Modified: trunk/apps/app_queue.c
URL: http://svn.digium.com/view/asterisk/trunk/apps/app_queue.c?view=diff&rev=74429&r1=74428&r2=74429
==============================================================================
--- trunk/apps/app_queue.c (original)
+++ trunk/apps/app_queue.c Tue Jul 10 15:02:05 2007
@@ -1468,21 +1468,17 @@
 	return res;
 }
 
-static void recalc_holdtime(struct queue_ent *qe)
-{
-	int oldvalue, newvalue;
+static void recalc_holdtime(struct queue_ent *qe, int newholdtime)
+{
+	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);
 }
 
@@ -2307,7 +2303,7 @@
 	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;
 
@@ -2324,6 +2320,8 @@
 		cur = cur->next;
 	}
 	q->callscompleted++;
+	if (callcompletedinsl)
+		q->callscompletedinsl++;
 	ast_mutex_unlock(&q->lock);
 	return 0;
 }
@@ -2450,6 +2448,8 @@
 	char *p;
 	char vars[2048];
 	int forwardsallowed = 1;
+	int callcompletedinsl;
+
 	memset(&bridge_config, 0, sizeof(bridge_config));
 	time(&now);
 		
@@ -2559,7 +2559,11 @@
 		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;
@@ -2893,7 +2897,7 @@
 
 		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:




More information about the asterisk-commits mailing list