@ -690,11 +690,13 @@ static enum queue_member_status get_member_status(struct call_queue *q, int max_
} else {
ao2_unlock ( q ) ;
ao2_ref ( member , - 1 ) ;
ao2_iterator_destroy ( & mem_iter ) ;
return QUEUE_NORMAL ;
}
break ;
}
}
ao2_iterator_destroy ( & mem_iter ) ;
ao2_unlock ( q ) ;
return result ;
@ -777,7 +779,6 @@ static int handle_statechange(void *datap)
if ( ( slash_pos = strchr ( interface , ' / ' ) ) )
if ( ( slash_pos = strchr ( slash_pos + 1 , ' / ' ) ) )
* slash_pos = ' \0 ' ;
if ( ! strcasecmp ( interface , sc - > dev ) )
break ;
}
@ -993,7 +994,7 @@ static int interface_exists_global(const char *interface, int lock_queue_contain
int ret = 0 ;
ast_copy_string ( tmpmem . interface , interface , sizeof ( tmpmem . interface ) ) ;
queue_iter = ao2_iterator_init ( queues , lock_queue_container ? 0 : F_ AO2I_DONTLOCK) ;
queue_iter = ao2_iterator_init ( queues , lock_queue_container ? 0 : AO2_ ITERATOR _DONTLOCK) ;
while ( ( q = ao2_iterator_next ( & queue_iter ) ) ) {
ao2_lock ( q ) ;
mem_iter = ao2_iterator_init ( q - > members , 0 ) ;
@ -1004,9 +1005,11 @@ static int interface_exists_global(const char *interface, int lock_queue_contain
break ;
}
}
ao2_iterator_destroy ( & mem_iter ) ;
ao2_unlock ( q ) ;
queue_unref ( q ) ;
}
ao2_iterator_destroy ( & queue_iter ) ;
return ret ;
}
@ -1384,6 +1387,7 @@ static void rt_handle_member_record(struct call_queue *q, char *interface, const
}
ao2_ref ( m , - 1 ) ;
}
ao2_iterator_destroy ( & mem_iter ) ;
/* Create a new member */
if ( ! found ) {
@ -1416,6 +1420,7 @@ static void free_members(struct call_queue *q, int all)
}
ao2_ref ( cur , - 1 ) ;
}
ao2_iterator_destroy ( & mem_iter ) ;
}
/*! \brief Free queue's member list then its string fields */
@ -1563,6 +1568,7 @@ static struct call_queue *find_queue_by_name_rt(const char *queuename, struct as
m - > dead = 1 ;
ao2_ref ( m , - 1 ) ;
}
ao2_iterator_destroy ( & mem_iter ) ;
while ( ( interface = ast_category_browse ( member_config , interface ) ) ) {
rt_handle_member_record ( q , interface ,
@ -1584,6 +1590,7 @@ static struct call_queue *find_queue_by_name_rt(const char *queuename, struct as
}
ao2_ref ( m , - 1 ) ;
}
ao2_iterator_destroy ( & mem_iter ) ;
ao2_unlock ( q ) ;
@ -1672,6 +1679,7 @@ static void update_realtime_members(struct call_queue *q)
m - > dead = 1 ;
ao2_ref ( m , - 1 ) ;
}
ao2_iterator_destroy ( & mem_iter ) ;
while ( ( interface = ast_category_browse ( member_config , interface ) ) ) {
rt_handle_member_record ( q , interface ,
@ -1693,6 +1701,7 @@ static void update_realtime_members(struct call_queue *q)
}
ao2_ref ( m , - 1 ) ;
}
ao2_iterator_destroy ( & mem_iter ) ;
ao2_unlock ( q ) ;
ao2_unlock ( queues ) ;
ast_config_destroy ( member_config ) ;
@ -2115,6 +2124,7 @@ static int num_available_members(struct call_queue *q)
break ;
}
}
ao2_iterator_destroy ( & mem_iter ) ;
return avl ;
}
@ -2153,6 +2163,7 @@ static int compare_weight(struct call_queue *rq, struct member *member)
break ;
}
}
ao2_iterator_destroy ( & queue_iter ) ;
return found ;
}
@ -3064,6 +3075,7 @@ static int update_queue(struct call_queue *q, struct member *member, int callcom
ao2_unlock ( qtmp ) ;
ao2_ref ( qtmp , - 1 ) ;
}
ao2_iterator_destroy ( & queue_iter ) ;
} else {
ao2_lock ( q ) ;
time ( & member - > lastcall ) ;
@ -3468,6 +3480,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
if ( ! tmp ) {
ao2_ref ( cur , - 1 ) ;
ao2_unlock ( qe - > parent ) ;
ao2_iterator_destroy ( & memi ) ;
if ( use_weight )
ao2_unlock ( queues ) ;
goto out ;
@ -3476,6 +3489,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
if ( ! ( datastore = ast_datastore_alloc ( & dialed_interface_info , NULL ) ) ) {
ao2_ref ( cur , - 1 ) ;
ao2_unlock ( qe - > parent ) ;
ao2_iterator_destroy ( & memi ) ;
if ( use_weight )
ao2_unlock ( queues ) ;
free ( tmp ) ;
@ -3485,6 +3499,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
if ( ! ( dialed_interfaces = ast_calloc ( 1 , sizeof ( * dialed_interfaces ) ) ) ) {
ao2_ref ( cur , - 1 ) ;
ao2_unlock ( & qe - > parent ) ;
ao2_iterator_destroy ( & memi ) ;
if ( use_weight )
ao2_unlock ( queues ) ;
free ( tmp ) ;
@ -3522,6 +3537,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
if ( ! ( di = ast_calloc ( 1 , sizeof ( * di ) + strlen ( cur - > interface ) ) ) ) {
ao2_ref ( cur , - 1 ) ;
ao2_unlock ( qe - > parent ) ;
ao2_iterator_destroy ( & memi ) ;
if ( use_weight )
ao2_unlock ( queues ) ;
free ( tmp ) ;
@ -3556,6 +3572,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
ast_free ( tmp ) ;
}
}
ao2_iterator_destroy ( & memi ) ;
if ( qe - > parent - > timeoutpriority = = TIMEOUT_PRIORITY_APP ) {
/* Application arguments have higher timeout priority (behaviour for <=1.6) */
@ -4095,10 +4112,13 @@ static struct member *interface_exists(struct call_queue *q, const char *interfa
mem_iter = ao2_iterator_init ( q - > members , 0 ) ;
while ( ( mem = ao2_iterator_next ( & mem_iter ) ) ) {
if ( ! strcasecmp ( interface , mem - > interface ) )
if ( ! strcasecmp ( interface , mem - > interface ) ) {
ao2_iterator_destroy ( & mem_iter ) ;
return mem ;
}
ao2_ref ( mem , - 1 ) ;
}
ao2_iterator_destroy ( & mem_iter ) ;
return NULL ;
}
@ -4139,6 +4159,7 @@ static void dump_queue_members(struct call_queue *pm_queue)
}
value_len + = res ;
}
ao2_iterator_destroy ( & mem_iter ) ;
if ( value_len & & ! cur_member ) {
if ( ast_db_put ( pm_family , pm_queue - > name , value ) )
@ -4332,6 +4353,7 @@ static int set_member_paused(const char *queuename, const char *interface, const
ao2_unlock ( q ) ;
queue_unref ( q ) ;
}
ao2_iterator_destroy ( & queue_iter ) ;
return found ? RESULT_SUCCESS : RESULT_FAILURE ;
}
@ -4370,6 +4392,7 @@ static int set_member_penalty(char *queuename, char *interface, int penalty)
ao2_unlock ( q ) ;
queue_unref ( q ) ;
}
ao2_iterator_destroy ( & queue_iter ) ;
if ( foundinterface ) {
return RESULT_SUCCESS ;
@ -5166,6 +5189,7 @@ static int queue_function_qac(struct ast_channel *chan, const char *cmd, char *d
}
ao2_ref ( m , - 1 ) ;
}
ao2_iterator_destroy ( & mem_iter ) ;
} else if ( ! strcasecmp ( option , " free " ) ) {
mem_iter = ao2_iterator_init ( q - > members , 0 ) ;
while ( ( m = ao2_iterator_next ( & mem_iter ) ) ) {
@ -5175,6 +5199,7 @@ static int queue_function_qac(struct ast_channel *chan, const char *cmd, char *d
}
ao2_ref ( m , - 1 ) ;
}
ao2_iterator_destroy ( & mem_iter ) ;
} else /* must be "count" */
count = q - > membercount ;
ao2_unlock ( q ) ;
@ -5220,6 +5245,7 @@ static int queue_function_qac_dep(struct ast_channel *chan, const char *cmd, cha
}
ao2_ref ( m , - 1 ) ;
}
ao2_iterator_destroy ( & mem_iter ) ;
ao2_unlock ( q ) ;
queue_unref ( q ) ;
} else
@ -5303,6 +5329,7 @@ static int queue_function_queuememberlist(struct ast_channel *chan, const char *
}
ao2_ref ( m , - 1 ) ;
}
ao2_iterator_destroy ( & mem_iter ) ;
ao2_unlock ( q ) ;
queue_unref ( q ) ;
} else
@ -5532,7 +5559,7 @@ static int reload_queues(int reload)
ao2_lock ( queues ) ;
use_weight = 0 ;
/* Mark all queues as dead for the moment */
queue_iter = ao2_iterator_init ( queues , F_ AO2I_DONTLOCK) ;
queue_iter = ao2_iterator_init ( queues , AO2_ ITERATOR _DONTLOCK) ;
while ( ( q = ao2_iterator_next ( & queue_iter ) ) ) {
if ( ! q - > realtime ) {
q - > dead = 1 ;
@ -5769,7 +5796,7 @@ static char *__queues_show(struct mansession *s, int fd, int argc, char **argv)
}
}
queue_iter = ao2_iterator_init ( queues , F_ AO2I_DONTLOCK) ;
queue_iter = ao2_iterator_init ( queues , AO2_ ITERATOR _DONTLOCK) ;
ao2_lock ( queues ) ;
while ( ( q = ao2_iterator_next ( & queue_iter ) ) ) {
float sl ;
@ -5833,6 +5860,7 @@ static char *__queues_show(struct mansession *s, int fd, int argc, char **argv)
do_print ( s , fd , out - > str ) ;
ao2_ref ( mem , - 1 ) ;
}
ao2_iterator_destroy ( & mem_iter ) ;
}
if ( ! q - > head )
do_print ( s , fd , " No Callers " ) ;
@ -5852,6 +5880,7 @@ static char *__queues_show(struct mansession *s, int fd, int argc, char **argv)
ao2_unlock ( q ) ;
queue_unref ( q ) ; /* Unref the iterator's reference */
}
ao2_iterator_destroy ( & queue_iter ) ;
ao2_unlock ( queues ) ;
if ( ! found ) {
if ( argc = = 3 )
@ -5880,6 +5909,7 @@ static char *complete_queue(const char *line, const char *word, int pos, int sta
}
queue_unref ( q ) ;
}
ao2_iterator_destroy ( & queue_iter ) ;
return ret ;
}
@ -5988,6 +6018,7 @@ static int manager_queues_summary(struct mansession *s, const struct message *m)
}
ao2_ref ( mem , - 1 ) ;
}
ao2_iterator_destroy ( & mem_iter ) ;
for ( qe = q - > head ; qe ; qe = qe - > next ) {
if ( ( now - qe - > start ) > qlongestholdtime ) {
qlongestholdtime = now - qe - > start ;
@ -6008,6 +6039,7 @@ static int manager_queues_summary(struct mansession *s, const struct message *m)
ao2_unlock ( q ) ;
queue_unref ( q ) ;
}
ao2_iterator_destroy ( & queue_iter ) ;
astman_append ( s ,
" Event: QueueSummaryComplete \r \n "
" %s "
@ -6080,6 +6112,7 @@ static int manager_queues_status(struct mansession *s, const struct message *m)
}
ao2_ref ( mem , - 1 ) ;
}
ao2_iterator_destroy ( & mem_iter ) ;
/* List Queue Entries */
pos = 1 ;
for ( qe = q - > head ; qe ; qe = qe - > next ) {
@ -6101,6 +6134,7 @@ static int manager_queues_status(struct mansession *s, const struct message *m)
ao2_unlock ( q ) ;
queue_unref ( q ) ;
}
ao2_iterator_destroy ( & queue_iter ) ;
astman_append ( s ,
" Event: QueueStatusComplete \r \n "
@ -6400,13 +6434,17 @@ static char *complete_queue_remove_member(const char *line, const char *word, in
tmp = ast_strdup ( m - > interface ) ;
ao2_ref ( m , - 1 ) ;
queue_unref ( q ) ;
ao2_iterator_destroy ( & mem_iter ) ;
ao2_iterator_destroy ( & queue_iter ) ;
return tmp ;
}
ao2_ref ( m , - 1 ) ;
}
ao2_iterator_destroy ( & mem_iter ) ;
ao2_unlock ( q ) ;
queue_unref ( q ) ;
}
ao2_iterator_destroy ( & queue_iter ) ;
return NULL ;
}
@ -6723,6 +6761,7 @@ static int unload_module(void)
ao2_unlink ( queues , q ) ;
queue_unref ( q ) ;
}
ao2_iterator_destroy ( & q_iter ) ;
ao2_ref ( queues , - 1 ) ;
devicestate_tps = ast_taskprocessor_unreference ( devicestate_tps ) ;
ast_unload_realtime ( " queue_members " ) ;