@ -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 ) + new valu e) > > 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 :