|
|
|
@ -173,9 +173,7 @@ out: |
|
|
|
|
|
|
|
|
|
|
|
/* called with hashlock held */ |
|
|
|
static void call_timer_iterator(gpointer data, gpointer user_data) { |
|
|
|
struct call *c = data; |
|
|
|
struct iterator_helper *hlp = user_data; |
|
|
|
static void call_timer_iterator(struct call *c, struct iterator_helper *hlp) { |
|
|
|
GList *it; |
|
|
|
unsigned int check; |
|
|
|
int good = 0; |
|
|
|
@ -292,6 +290,7 @@ out: |
|
|
|
rwlock_unlock_r(&rtpe_config.config_lock); |
|
|
|
rwlock_unlock_r(&c->master_lock); |
|
|
|
log_info_clear(); |
|
|
|
obj_put(c); |
|
|
|
} |
|
|
|
|
|
|
|
void xmlrpc_kill_calls(void *p) { |
|
|
|
@ -499,9 +498,16 @@ static void update_requests_per_second_stats(struct requests_ps *request, u_int6 |
|
|
|
mutex_unlock(&request->lock); |
|
|
|
} |
|
|
|
|
|
|
|
static void calls_build_list(void *k, void *v, void *d) { |
|
|
|
GSList **list = d; |
|
|
|
struct call *c = v; |
|
|
|
*list = g_slist_prepend(*list, obj_get(c)); |
|
|
|
} |
|
|
|
|
|
|
|
static void call_timer(void *ptr) { |
|
|
|
struct iterator_helper hlp; |
|
|
|
GList *i, *l, *calls = NULL; |
|
|
|
GList *i, *l; |
|
|
|
GSList *calls = NULL; |
|
|
|
struct rtpengine_list_entry *ke; |
|
|
|
struct packet_stream *ps, *sink; |
|
|
|
struct stats tmpstats; |
|
|
|
@ -517,18 +523,15 @@ static void call_timer(void *ptr) { |
|
|
|
|
|
|
|
/* obtain the call list and make a copy from it so not to hold the lock */ |
|
|
|
rwlock_lock_r(&rtpe_callhash_lock); |
|
|
|
l = g_hash_table_get_values(rtpe_callhash); |
|
|
|
if (l) { |
|
|
|
calls = g_list_copy(l); |
|
|
|
g_list_free(l); |
|
|
|
g_list_foreach(calls, call_obj_get, NULL); |
|
|
|
} |
|
|
|
g_hash_table_foreach(rtpe_callhash, calls_build_list, &calls); |
|
|
|
rwlock_unlock_r(&rtpe_callhash_lock); |
|
|
|
|
|
|
|
if (calls) { |
|
|
|
g_list_foreach(calls, call_timer_iterator, &hlp); |
|
|
|
g_list_free_full(calls, call_obj_put); |
|
|
|
while (calls) { |
|
|
|
struct call *c = calls->data; |
|
|
|
call_timer_iterator(c, &hlp); |
|
|
|
calls = g_slist_delete_link(calls, calls); |
|
|
|
} |
|
|
|
|
|
|
|
atomic64_local_copy_zero_struct(&tmpstats, &rtpe_statsps, bytes); |
|
|
|
atomic64_local_copy_zero_struct(&tmpstats, &rtpe_statsps, packets); |
|
|
|
atomic64_local_copy_zero_struct(&tmpstats, &rtpe_statsps, errors); |
|
|
|
|