From f20f72c27a19e52d9a5ca6796ce676fc3f79333e Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Tue, 7 Aug 2012 14:09:45 +0000 Subject: [PATCH] reorder calls to redis for proper locking --- daemon/call.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/daemon/call.c b/daemon/call.c index 6a4f692..144f921 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -198,7 +198,7 @@ static int stream_packet(struct streamrelay *r, char *b, int l, struct sockaddr_ struct streamrelay *p, *p2; struct peer *pe, *pe2; struct callstream *cs; - int ret; + int ret, update = 0; struct sockaddr_in sin; struct sockaddr_in6 sin6; struct msghdr mh; @@ -263,8 +263,7 @@ peerinfo: if (pe->confirmed && pe2->confirmed && pe2->filled) kernelize(cs); - if (redis_update) - redis_update(c, m->conf.redis); + update = 1; forward: if (IN6_IS_ADDR_UNSPECIFIED(&r->peer.ip46) || !r->peer.port || !r->fd_family) @@ -337,10 +336,11 @@ forward: mutex_lock(&m->statspslock); m->statsps.errors++; mutex_unlock(&m->statspslock); - return -1; + goto out; } drop: + ret = 0; r->stats.packets++; r->stats.bytes += l; r->last = poller_now; @@ -350,7 +350,11 @@ drop: m->statsps.bytes += l; mutex_unlock(&m->statspslock); - return 0; +out: + if (update && redis_update) + redis_update(c, m->conf.redis); + + return ret; } @@ -1625,14 +1629,14 @@ char *call_update_udp(const char **out, struct callmaster *m) { g_queue_push_tail(&q, &st); num = call_streams(c, &q, out[RE_UDP_UL_FROMTAG], 0); - g_queue_clear(&q); + ret = streams_print(c->callstreams, 1, (num >= 0) ? 0 : 1, out[RE_UDP_COOKIE], 1); + mutex_unlock(&c->lock); + if (redis_update) redis_update(c, m->conf.redis); - ret = streams_print(c->callstreams, 1, (num >= 0) ? 0 : 1, out[RE_UDP_COOKIE], 1); - mutex_unlock(&c->lock); mylog(LOG_INFO, LOG_PREFIX_CI "Returning to SIP proxy: %s", LOG_PARAMS_CI(c), ret); log_info = NULL; obj_put(c); @@ -1675,14 +1679,14 @@ char *call_lookup_udp(const char **out, struct callmaster *m) { g_queue_push_tail(&q, &st); num = call_streams(c, &q, out[RE_UDP_UL_TOTAG], 1); - g_queue_clear(&q); + ret = streams_print(c->callstreams, 1, (num >= 0) ? 1 : 0, out[RE_UDP_COOKIE], 1); + mutex_unlock(&c->lock); + if (redis_update) redis_update(c, m->conf.redis); - ret = streams_print(c->callstreams, 1, (num >= 0) ? 1 : 0, out[RE_UDP_COOKIE], 1); - mutex_unlock(&c->lock); mylog(LOG_INFO, LOG_PREFIX_CI "Returning to SIP proxy: %s", LOG_PARAMS_CI(c), ret); log_info = NULL; obj_put(c); @@ -1710,12 +1714,12 @@ char *call_request(const char **out, struct callmaster *m) { s = streams_parse(out[RE_TCP_RL_STREAMS], m); num = call_streams(c, s, g_hash_table_lookup(c->infohash, "fromtag"), 0); streams_free(s); + ret = streams_print(c->callstreams, abs(num), (num >= 0) ? 0 : 1, NULL, 0); + mutex_unlock(&c->lock); if (redis_update) redis_update(c, m->conf.redis); - ret = streams_print(c->callstreams, abs(num), (num >= 0) ? 0 : 1, NULL, 0); - mutex_unlock(&c->lock); mylog(LOG_INFO, LOG_PREFIX_CI "Returning to SIP proxy: %s", LOG_PARAMS_CI(c), ret); obj_put(c); return ret; @@ -1743,12 +1747,12 @@ char *call_lookup(const char **out, struct callmaster *m) { s = streams_parse(out[RE_TCP_RL_STREAMS], m); num = call_streams(c, s, g_hash_table_lookup(c->infohash, "totag"), 1); streams_free(s); + ret = streams_print(c->callstreams, abs(num), (num >= 0) ? 1 : 0, NULL, 0); + mutex_unlock(&c->lock); if (redis_update) redis_update(c, m->conf.redis); - ret = streams_print(c->callstreams, abs(num), (num >= 0) ? 1 : 0, NULL, 0); - mutex_unlock(&c->lock); mylog(LOG_INFO, LOG_PREFIX_CI "Returning to SIP proxy: %s", LOG_PARAMS_CI(c), ret); obj_put(c); return ret;