diff --git a/daemon/call.c b/daemon/call.c index fc8693563..598f9f84d 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -33,7 +33,9 @@ #define LOG_PREFIX_C "[%s] " #define LOG_PREFIX_CI "[%s - %s] " #define LOG_PARAMS_C(c) (c)->callid -#define LOG_PARAMS_CI(c) (c)->callid, (c)->log_info +#define LOG_PARAMS_CI(c) (c)->callid, log_info + +static __thread const char *log_info; @@ -1374,6 +1376,7 @@ static struct call *call_create(const char *callid, struct callmaster *m) { c->created = poller_now; c->infohash = g_hash_table_new_full(g_str_hash, g_str_equal, free, free); c->branches = g_hash_table_new_full(g_str_hash0, g_str_equal0, free, NULL); + mutex_init(&c->lock); return c; } @@ -1462,7 +1465,7 @@ char *call_update_udp(const char **out, struct callmaster *m) { char *ret; c = call_get_or_create(out[RE_UDP_UL_CALLID], out[RE_UDP_UL_VIABRANCH], m); - c->log_info = out[RE_UDP_UL_VIABRANCH]; + log_info = out[RE_UDP_UL_VIABRANCH]; strdupfree(&c->calling_agent, "UNKNOWN(udp)"); if (addr_parse_udp(&st, out)) @@ -1478,14 +1481,14 @@ char *call_update_udp(const char **out, struct callmaster *m) { ret = streams_print(c->callstreams, 1, (num >= 0) ? 0 : 1, out[RE_UDP_COOKIE], 1); mylog(LOG_INFO, LOG_PREFIX_CI "Returning to SIP proxy: %s", LOG_PARAMS_CI(c), ret); - c->log_info = NULL; + log_info = NULL; obj_put(c); return ret; fail: mylog(LOG_WARNING, "Failed to parse a media stream: %s/%s:%s", out[RE_UDP_UL_ADDR4], out[RE_UDP_UL_ADDR6], out[RE_UDP_UL_PORT]); asprintf(&ret, "%s E8\n", out[RE_UDP_COOKIE]); - c->log_info = NULL; + log_info = NULL; obj_put(c); return ret; } @@ -1509,7 +1512,7 @@ char *call_lookup_udp(const char **out, struct callmaster *m) { obj_hold(c); rwlock_unlock_r(&m->hashlock); - c->log_info = out[RE_UDP_UL_CALLID]; + log_info = out[RE_UDP_UL_CALLID]; strdupfree(&c->called_agent, "UNKNOWN(udp)"); if (addr_parse_udp(&st, out)) @@ -1525,14 +1528,14 @@ char *call_lookup_udp(const char **out, struct callmaster *m) { ret = streams_print(c->callstreams, 1, (num >= 0) ? 1 : 0, out[RE_UDP_COOKIE], 1); mylog(LOG_INFO, LOG_PREFIX_CI "Returning to SIP proxy: %s", LOG_PARAMS_CI(c), ret); - c->log_info = NULL; + log_info = NULL; obj_put(c); return ret; fail: mylog(LOG_WARNING, "Failed to parse a media stream: %s/%s:%s", out[RE_UDP_UL_ADDR4], out[RE_UDP_UL_ADDR6], out[RE_UDP_UL_PORT]); asprintf(&ret, "%s E8\n", out[RE_UDP_COOKIE]); - c->log_info = NULL; + log_info = NULL; obj_put(c); return ret; } @@ -1612,7 +1615,7 @@ char *call_delete_udp(const char **out, struct callmaster *m) { obj_hold(c); rwlock_unlock_r(&m->hashlock); - c->log_info = out[RE_UDP_D_VIABRANCH]; + log_info = out[RE_UDP_D_VIABRANCH]; if (out[RE_UDP_D_FROMTAG] && *out[RE_UDP_D_FROMTAG]) { for (l = c->callstreams->head; l; l = l->next) { @@ -1668,10 +1671,9 @@ err: goto out; out: - if (c) { - c->log_info = NULL; + log_info = NULL; + if (c) obj_put(c); - } return ret; } diff --git a/daemon/call.h b/daemon/call.h index a0604d8f5..4eea4591c 100644 --- a/daemon/call.h +++ b/daemon/call.h @@ -81,18 +81,17 @@ struct call { struct callmaster *callmaster; + mutex_t lock; GQueue *callstreams; + GHashTable *branches; + char *calling_agent; + char *called_agent; char *callid; char redis_uuid[37]; time_t created; - char *calling_agent; - char *called_agent; GHashTable *infohash; - GHashTable *branches; time_t lookup_done; - - const char *log_info; /* branch */ }; struct callmaster_config {