From 1adef8fe7bb7026423c849376063a8cc366c0807 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 8 Feb 2013 09:41:39 -0500 Subject: [PATCH] split stream traversal for stats query into separate function --- daemon/call.c | 111 +++++++++++++++++++++++++++++--------------------- 1 file changed, 65 insertions(+), 46 deletions(-) diff --git a/daemon/call.c b/daemon/call.c index c020fb6..be20313 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -1949,6 +1949,59 @@ str *call_delete_udp(char **out, struct callmaster *m) { return str_sprintf("%s 0\n", out[RE_UDP_COOKIE]); } +#define SSUM(x) \ + totals[0].x += p->rtps[0].stats.x; \ + totals[1].x += p->rtps[1].stats.x; \ + totals[2].x += px->rtps[0].stats.x; \ + totals[3].x += px->rtps[1].stats.x +/* call must be locked */ +static void stats_query(struct call *call, str *fromtag, str *totag, struct stats *totals, + void (*cb)(struct peer *, struct peer *, void *), void *arg) +{ + GList *l; + struct callstream *cs; + int i; + struct peer *p, *px; + + ZERO(totals[0]); /* rtp in */ + ZERO(totals[1]); /* rtcp in */ + ZERO(totals[2]); /* rtp out */ + ZERO(totals[3]); /* rtcp out */ + + for (l = call->callstreams->head; l; l = l->next) { + cs = l->data; + mutex_lock(&cs->lock); + + for (i = 0; i < 2; i++) { + p = &cs->peers[i]; + px = &cs->peers[i ^ 1]; + + if (!fromtag->len) + goto tag_match; + + if (str_cmp_str(&p->tag, fromtag)) + continue; + if (!totag->len) + goto tag_match; + + if (str_cmp_str(&px->tag, totag)) + continue; + +tag_match: + if (cb) + cb(p, px, arg); + + SSUM(packets); + SSUM(bytes); + SSUM(errors); + + break; + } + + mutex_unlock(&cs->lock); + } +} + str *call_query_udp(char **out, struct callmaster *m) { struct call *c; str *ret, callid; @@ -2390,20 +2443,19 @@ static bencode_item_t *peer_stats(bencode_buffer_t *b, struct peer *p) { return d; } -#define SSUM(x) \ - totals[0].x += p->rtps[0].stats.x; \ - totals[1].x += p->rtps[1].stats.x; \ - totals[2].x += px->rtps[0].stats.x; \ - totals[3].x += px->rtps[1].stats.x +static void ng_stats_cb(struct peer *p, struct peer *px, void *streams) { + bencode_item_t *stream; + + stream = bencode_list_add_list(streams); + bencode_list_add(stream, peer_stats(stream->buffer, p)); + bencode_list_add(stream, peer_stats(stream->buffer, px)); +} + const char *call_query_ng(bencode_item_t *input, struct callmaster *m, bencode_item_t *output) { str callid, fromtag, totag; struct call *call; - GList *l; - struct callstream *cs; - bencode_item_t *streams, *stream, *dict; - struct peer *p, *px; - struct stats totals[4]; /* rtp in, rtcp in, rtp out, rtcp out */ - int i; + bencode_item_t *streams, *dict; + struct stats totals[4]; if (!bencode_dictionary_get_str(input, "call-id", &callid)) return "No call-id in message"; @@ -2415,42 +2467,9 @@ const char *call_query_ng(bencode_item_t *input, struct callmaster *m, bencode_i bencode_dictionary_add_string(output, "result", "ok"); bencode_dictionary_add_integer(output, "created", call->created); - streams = bencode_dictionary_add_list(output, "streams"); - - ZERO(totals); - for (l = call->callstreams->head; l; l = l->next) { - cs = l->data; - mutex_lock(&cs->lock); - - for (i = 0; i < 2; i++) { - p = &cs->peers[i]; - px = &cs->peers[i ^ 1]; - - if (!fromtag.len) - goto tag_match; - - if (str_cmp_str(&p->tag, &fromtag)) - continue; - if (!totag.len) - goto tag_match; - - if (str_cmp_str(&px->tag, &totag)) - continue; - -tag_match: - stream = bencode_list_add_list(streams); - bencode_list_add(stream, peer_stats(output->buffer, p)); - bencode_list_add(stream, peer_stats(output->buffer, px)); - SSUM(packets); - SSUM(bytes); - SSUM(errors); - - break; - } - - mutex_unlock(&cs->lock); - } + streams = bencode_dictionary_add_list(output, "streams"); + stats_query(call, &fromtag, &totag, totals, ng_stats_cb, streams); mutex_unlock(&call->lock);