@ -1170,12 +1170,6 @@ struct call_queue {
int autofill ; /*!< Ignore the head call status and ring an available agent */
struct ao2_container * members ; /*!< Head of the list of members */
/*!
* \ brief Number of members _logged in_
* \ note There will be members in the members container that are not logged
* in , so this can not simply be replaced with ao2_container_count ( ) .
*/
int membercount ;
struct queue_ent * head ; /*!< Head of the list of callers */
AST_LIST_ENTRY ( call_queue ) list ; /*!< Next call queue */
AST_LIST_HEAD_NOLOCK ( , penalty_rule ) rules ; /*!< The list of penalty rules to invoke */
@ -2136,7 +2130,6 @@ static void rt_handle_member_record(struct call_queue *q, char *interface, const
ao2_link ( q - > members , m ) ;
ao2_ref ( m , - 1 ) ;
m = NULL ;
q - > membercount + + ;
}
}
}
@ -2151,7 +2144,6 @@ static void free_members(struct call_queue *q, int all)
while ( ( cur = ao2_iterator_next ( & mem_iter ) ) ) {
if ( all | | ! cur - > dynamic ) {
ao2_unlink ( q - > members , cur ) ;
q - > membercount - - ;
}
ao2_ref ( cur , - 1 ) ;
}
@ -2254,7 +2246,6 @@ static struct call_queue *find_queue_by_name_rt(const char *queuename, struct as
ao2_lock ( q ) ;
clear_queue ( q ) ;
q - > realtime = 1 ;
q - > membercount = 0 ;
/*Before we initialize the queue, we need to set the strategy, so that linear strategy
* will allocate the members properly
*/
@ -2294,11 +2285,9 @@ static struct call_queue *find_queue_by_name_rt(const char *queuename, struct as
queue_set_param ( q , tmp_name , v - > value , - 1 , 0 ) ;
}
/* Temporarily set realtime members dead so we can detect deleted ones.
* Also set the membercount correctly for realtime */
/* Temporarily set realtime members dead so we can detect deleted ones. */
mem_iter = ao2_iterator_init ( q - > members , 0 ) ;
while ( ( m = ao2_iterator_next ( & mem_iter ) ) ) {
q - > membercount + + ;
if ( m - > realtime )
m - > dead = 1 ;
ao2_ref ( m , - 1 ) ;
@ -2320,7 +2309,6 @@ static struct call_queue *find_queue_by_name_rt(const char *queuename, struct as
if ( m - > dead ) {
ast_queue_log ( q - > name , " REALTIME " , m - > interface , " REMOVEMEMBER " , " %s " , " " ) ;
ao2_unlink ( q - > members , m ) ;
q - > membercount - - ;
}
ao2_ref ( m , - 1 ) ;
}
@ -2441,7 +2429,6 @@ static void update_realtime_members(struct call_queue *q)
if ( m - > dead ) {
ast_queue_log ( q - > name , " REALTIME " , m - > interface , " REMOVEMEMBER " , " %s " , " " ) ;
ao2_unlink ( q - > members , m ) ;
q - > membercount - - ;
}
ao2_ref ( m , - 1 ) ;
}
@ -4054,7 +4041,8 @@ static int update_queue(struct call_queue *q, struct member *member, int callcom
static int calc_metric ( struct call_queue * q , struct member * mem , int pos , struct queue_ent * qe , struct callattempt * tmp )
{
/* disregarding penalty on too few members? */
unsigned char usepenalty = ( q - > membercount < = q - > penaltymemberslimit ) ? 0 : 1 ;
size_t membercount = ao2_container_count ( q - > members ) ;
unsigned char usepenalty = ( membercount < = q - > penaltymemberslimit ) ? 0 : 1 ;
if ( usepenalty ) {
if ( ( qe - > max_penalty & & ( mem - > penalty > qe - > max_penalty ) ) | |
@ -4063,7 +4051,7 @@ static int calc_metric(struct call_queue *q, struct member *mem, int pos, struct
}
} else {
ast_debug ( 1 , " Disregarding penalty, %d members and %d in penaltymemberslimit. \n " ,
q- > membercount, q - > penaltymemberslimit ) ;
membercount, q - > penaltymemberslimit ) ;
}
switch ( q - > strategy ) {
@ -4406,7 +4394,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
if ( qe - > parent - > strategy = = QUEUE_STRATEGY_RRMEMORY | | qe - > parent - > strategy = = QUEUE_STRATEGY_LINEAR | | qe - > parent - > strategy = = QUEUE_STRATEGY_RRORDERED )
( * tries ) + + ;
else
* tries = qe - > parent - > member count ;
* tries = ao2_container_count ( qe - > parent - > member s) ;
* noption = 1 ;
break ;
case ' i ' :
@ -5200,7 +5188,6 @@ static int remove_from_queue(const char *queuename, const char *interface)
queue_t_unref ( q , " Interface wasn't dynamic, expiring temporary reference " ) ;
return RES_NOT_DYNAMIC ;
}
q - > membercount - - ;
manager_event ( EVENT_FLAG_AGENT , " QueueMemberRemoved " ,
" Queue: %s \r \n "
" Location: %s \r \n "
@ -5246,7 +5233,6 @@ static int add_to_queue(const char *queuename, const char *interface, const char
if ( ( new_member = create_queue_member ( interface , membername , penalty , paused , state_interface ) ) ) {
new_member - > dynamic = 1 ;
ao2_link ( q - > members , new_member ) ;
q - > membercount + + ;
manager_event ( EVENT_FLAG_AGENT , " QueueMemberAdded " ,
" Queue: %s \r \n "
" Location: %s \r \n "
@ -6009,7 +5995,7 @@ check_turns:
}
/* exit after 'timeout' cycle if 'n' option enabled */
if ( noption & & tries > = qe . parent - > member count ) {
if ( noption & & tries > = ao2_container_count ( qe . parent - > member s) ) {
ast_verb ( 3 , " Exiting on time-out cycle \n " ) ;
ast_queue_log ( args . queuename , chan - > uniqueid , " NONE " , " EXITWITHTIMEOUT " , " %d " , qe . pos ) ;
record_abandoned ( & qe ) ;
@ -6220,7 +6206,7 @@ static int queue_function_qac(struct ast_channel *chan, const char *cmd, char *d
}
ao2_iterator_destroy ( & mem_iter ) ;
} else /* must be "count" */
count = q - > membercount ;
count = ao2_container_count ( q - > members ) ;
ao2_unlock ( q ) ;
queue_t_unref ( q , " Done with temporary reference in QUEUE_MEMBER() " ) ;
} else
@ -6611,11 +6597,6 @@ static void reload_single_member(const char *memberdata, struct call_queue *q)
if ( cur ) {
ao2_ref ( cur , - 1 ) ;
}
/* Since this function is only called in a loop parsing all members after setting
* q - > membercount = 0 if we are reloading , we must increment the membercount whether
* we add or reload , otherwise q - > membercount stays 0 after a reload */
q - > membercount + + ;
}
static int mark_member_dead ( void * obj , void * arg , int flags )
@ -6630,19 +6611,11 @@ static int mark_member_dead(void *obj, void *arg, int flags)
static int kill_dead_members ( void * obj , void * arg , int flags )
{
struct member * member = obj ;
struct call_queue * q = arg ;
if ( ! member - > delme ) {
if ( member - > dynamic ) {
/* dynamic members were not counted toward the member count
* when reloading members from queues . conf , so we do that here
*/
q - > membercount + + ;
}
member - > status = get_queue_member_status ( member ) ;
return 0 ;
} else {
q - > membercount - - ;
return CMP_MATCH ;
}
}
@ -6721,7 +6694,6 @@ static void reload_single_queue(struct ast_config *cfg, struct ast_flags *mask,
init_queue ( q ) ;
}
if ( member_reload ) {
q - > membercount = 0 ;
ao2_callback ( q - > members , OBJ_NODATA , mark_member_dead , NULL ) ;
}
for ( var = ast_variable_browse ( cfg , queuename ) ; var ; var = var - > next ) {
@ -8071,8 +8043,7 @@ static struct ast_cli_entry cli_queue[] = {
MEMBER ( call_queue , rrpos , AST_DATA_INTEGER ) \
MEMBER ( call_queue , memberdelay , AST_DATA_INTEGER ) \
MEMBER ( call_queue , autofill , AST_DATA_INTEGER ) \
MEMBER ( call_queue , members , AST_DATA_CONTAINER ) \
MEMBER ( call_queue , membercount , AST_DATA_INTEGER )
MEMBER ( call_queue , members , AST_DATA_CONTAINER )
AST_DATA_STRUCTURE ( call_queue , DATA_EXPORT_CALL_QUEUE ) ;
@ -8140,6 +8111,7 @@ static void queues_data_provider_get_helper(const struct ast_data_search *search
ast_data_add_structure ( call_queue , data_queue , queue ) ;
ast_data_add_str ( data_queue , " strategy " , int2strat ( queue - > strategy ) ) ;
ast_data_add_int ( data_queue , " membercount " , ao2_container_count ( queue - > members ) ) ;
/* announce position */
enum_node = ast_data_add_node ( data_queue , " announceposition " ) ;