|
|
|
@ -1760,9 +1760,7 @@ void call_delete(const char **out, struct callmaster *m) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void call_status_iterator(void *key, void *val, void *ptr) { |
|
|
|
struct call *c = val; |
|
|
|
struct control_stream *s = ptr; |
|
|
|
static void call_status_iterator(struct call *c, struct control_stream *s) { |
|
|
|
GList *l; |
|
|
|
struct callstream *cs; |
|
|
|
struct peer *p; |
|
|
|
@ -1819,22 +1817,35 @@ next: |
|
|
|
mutex_unlock(&c->lock); |
|
|
|
} |
|
|
|
|
|
|
|
static void callmaster_get_all_calls_interator(void *key, void *val, void *ptr) { |
|
|
|
GQueue *q = ptr; |
|
|
|
g_queue_push_tail(q, obj_get(val)); |
|
|
|
} |
|
|
|
|
|
|
|
void calls_status(struct callmaster *m, struct control_stream *s) { |
|
|
|
struct stats st; |
|
|
|
GQueue q = G_QUEUE_INIT; |
|
|
|
struct call *c; |
|
|
|
|
|
|
|
mutex_lock(&m->statslock); |
|
|
|
st = m->stats; |
|
|
|
mutex_unlock(&m->statslock); |
|
|
|
|
|
|
|
rwlock_lock_r(&m->hashlock); |
|
|
|
g_hash_table_foreach(m->callhash, callmaster_get_all_calls_interator, &q); |
|
|
|
rwlock_unlock_r(&m->hashlock); |
|
|
|
|
|
|
|
control_stream_printf(s, "proxy %u %llu/%llu/%llu\n", |
|
|
|
g_hash_table_size(m->callhash), |
|
|
|
g_queue_get_length(&q), |
|
|
|
(long long unsigned int) st.bytes, |
|
|
|
(long long unsigned int) st.bytes - st.errors, |
|
|
|
(long long unsigned int) st.bytes * 2 - st.errors); |
|
|
|
|
|
|
|
g_hash_table_foreach(m->callhash, call_status_iterator, s); |
|
|
|
rwlock_unlock_r(&m->hashlock); |
|
|
|
while (q.head) { |
|
|
|
c = g_queue_pop_head(&q); |
|
|
|
call_status_iterator(c, s); |
|
|
|
obj_put(c); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|