diff --git a/daemon/log.c b/daemon/log.c index 182a975c4..057d09174 100644 --- a/daemon/log.c +++ b/daemon/log.c @@ -12,8 +12,8 @@ #include "loglib.h" #include "main.h" -__thread struct log_info log_info; -__thread GSList *log_info_stack; +__thread struct log_info log_info[LOG_INFO_STACK_SIZE]; +__thread unsigned int log_info_idx; int _log_facility_cdr = 0; int _log_facility_rtcp = 0; @@ -34,96 +34,96 @@ static ilog_prefix_func * const ilog_prefix_funcs[__LF_LAST] = { static void ilog_prefix_default(char *prefix, size_t prefix_len) { - switch (log_info.e) { + switch (log_info[log_info_idx].e) { case LOG_INFO_NONE: prefix[0] = 0; break; case LOG_INFO_CALL: snprintf(prefix, prefix_len, "[" STR_FORMAT_M "]: ", - STR_FMT_M(&log_info.call->callid)); + STR_FMT_M(&log_info[log_info_idx].call->callid)); break; case LOG_INFO_STREAM_FD: - if (log_info.stream_fd->call) { - if (log_info.stream_fd->stream) + if (log_info[log_info_idx].stream_fd->call) { + if (log_info[log_info_idx].stream_fd->stream) snprintf(prefix, prefix_len, "[" STR_FORMAT_M "/" STR_FORMAT_M "/%u port %5u]: ", - STR_FMT_M(&log_info.stream_fd->call->callid), - STR_FMT_M(&log_info.stream_fd->stream->media->monologue->tag), - log_info.stream_fd->stream->media->index, - log_info.stream_fd->socket.local.port); + STR_FMT_M(&log_info[log_info_idx].stream_fd->call->callid), + STR_FMT_M(&log_info[log_info_idx].stream_fd->stream->media->monologue->tag), + log_info[log_info_idx].stream_fd->stream->media->index, + log_info[log_info_idx].stream_fd->socket.local.port); else snprintf(prefix, prefix_len, "[" STR_FORMAT_M " port %5u]: ", - STR_FMT_M(&log_info.stream_fd->call->callid), - log_info.stream_fd->socket.local.port); + STR_FMT_M(&log_info[log_info_idx].stream_fd->call->callid), + log_info[log_info_idx].stream_fd->socket.local.port); } else snprintf(prefix, prefix_len, "[no call, port %5u]: ", - log_info.stream_fd->socket.local.port); + log_info[log_info_idx].stream_fd->socket.local.port); break; case LOG_INFO_STR: snprintf(prefix, prefix_len, "[" STR_FORMAT_M "]: ", - STR_FMT_M(log_info.str)); + STR_FMT_M(log_info[log_info_idx].str)); break; case LOG_INFO_C_STRING: snprintf(prefix, prefix_len, "[%s%s%s]: ", - FMT_M(log_info.cstr)); + FMT_M(log_info[log_info_idx].cstr)); break; case LOG_INFO_ICE_AGENT: snprintf(prefix, prefix_len, "[" STR_FORMAT_M "/" STR_FORMAT_M "/%u]: ", - STR_FMT_M(&log_info.ice_agent->call->callid), - STR_FMT_M(&log_info.ice_agent->media->monologue->tag), - log_info.ice_agent->media->index); + STR_FMT_M(&log_info[log_info_idx].ice_agent->call->callid), + STR_FMT_M(&log_info[log_info_idx].ice_agent->media->monologue->tag), + log_info[log_info_idx].ice_agent->media->index); break; case LOG_INFO_MEDIA: snprintf(prefix, prefix_len, "[" STR_FORMAT_M "/" STR_FORMAT_M "/%u]: ", - STR_FMT_M(&log_info.call->callid), - STR_FMT_M(&log_info.media->monologue->tag), - log_info.media->index); + STR_FMT_M(&log_info[log_info_idx].call->callid), + STR_FMT_M(&log_info[log_info_idx].media->monologue->tag), + log_info[log_info_idx].media->index); break; } } static void ilog_prefix_parsable(char *prefix, size_t prefix_len) { - switch (log_info.e) { + switch (log_info[log_info_idx].e) { case LOG_INFO_NONE: prefix[0] = 0; break; case LOG_INFO_CALL: snprintf(prefix, prefix_len, "[ID=\""STR_FORMAT"\"]: ", - STR_FMT(&log_info.call->callid)); + STR_FMT(&log_info[log_info_idx].call->callid)); break; case LOG_INFO_STREAM_FD: - if (log_info.stream_fd->call) { - if (log_info.stream_fd->stream) + if (log_info[log_info_idx].stream_fd->call) { + if (log_info[log_info_idx].stream_fd->stream) snprintf(prefix, prefix_len, "[ID=\""STR_FORMAT"\" tag=\""STR_FORMAT"\" index=\"%u\" port=\"%5u\"]: ", - STR_FMT(&log_info.stream_fd->call->callid), - STR_FMT(&log_info.stream_fd->stream->media->monologue->tag), - log_info.stream_fd->stream->media->index, - log_info.stream_fd->socket.local.port); + STR_FMT(&log_info[log_info_idx].stream_fd->call->callid), + STR_FMT(&log_info[log_info_idx].stream_fd->stream->media->monologue->tag), + log_info[log_info_idx].stream_fd->stream->media->index, + log_info[log_info_idx].stream_fd->socket.local.port); else snprintf(prefix, prefix_len, "[ID=\""STR_FORMAT"\" port=\"%5u\"]: ", - STR_FMT(&log_info.stream_fd->call->callid), - log_info.stream_fd->socket.local.port); + STR_FMT(&log_info[log_info_idx].stream_fd->call->callid), + log_info[log_info_idx].stream_fd->socket.local.port); } break; case LOG_INFO_STR: snprintf(prefix, prefix_len, "[ID=\""STR_FORMAT"\"]: ", - STR_FMT(log_info.str)); + STR_FMT(log_info[log_info_idx].str)); break; case LOG_INFO_C_STRING: - snprintf(prefix, prefix_len, "[ID=\"%s\"]: ", log_info.cstr); + snprintf(prefix, prefix_len, "[ID=\"%s\"]: ", log_info[log_info_idx].cstr); break; case LOG_INFO_ICE_AGENT: snprintf(prefix, prefix_len, "[ID=\""STR_FORMAT"\" tag=\""STR_FORMAT"\" index=\"%u\"]: ", - STR_FMT(&log_info.ice_agent->call->callid), - STR_FMT(&log_info.ice_agent->media->monologue->tag), - log_info.ice_agent->media->index); + STR_FMT(&log_info[log_info_idx].ice_agent->call->callid), + STR_FMT(&log_info[log_info_idx].ice_agent->media->monologue->tag), + log_info[log_info_idx].ice_agent->media->index); break; case LOG_INFO_MEDIA: snprintf(prefix, prefix_len, "[ID=\""STR_FORMAT"\" tag=\""STR_FORMAT"\" index=\"%u\"]: ", - STR_FMT(&log_info.call->callid), - STR_FMT(&log_info.media->monologue->tag), - log_info.media->index); + STR_FMT(&log_info[log_info_idx].call->callid), + STR_FMT(&log_info[log_info_idx].media->monologue->tag), + log_info[log_info_idx].media->index); break; } } @@ -167,16 +167,16 @@ void rtcplog(const char* cdrbuffer) { int get_local_log_level(unsigned int subsystem_idx) { call_t *call = NULL; - switch (log_info.e) { + switch (log_info[log_info_idx].e) { case LOG_INFO_CALL: case LOG_INFO_MEDIA: - call = log_info.call; + call = log_info[log_info_idx].call; break; case LOG_INFO_STREAM_FD: - call = log_info.stream_fd->call; + call = log_info[log_info_idx].stream_fd->call; break; case LOG_INFO_ICE_AGENT: - call = log_info.ice_agent->call; + call = log_info[log_info_idx].ice_agent->call; break; default: break; diff --git a/daemon/log.h b/daemon/log.h index 6f0fefed3..e9f91a179 100644 --- a/daemon/log.h +++ b/daemon/log.h @@ -39,8 +39,9 @@ extern int _log_facility_rtcp; extern int _log_facility_dtmf; -extern __thread struct log_info log_info; -extern __thread GSList *log_info_stack; +#define LOG_INFO_STACK_SIZE 8 +extern __thread struct log_info log_info[LOG_INFO_STACK_SIZE]; +extern __thread unsigned int log_info_idx; diff --git a/daemon/log_funcs.h b/daemon/log_funcs.h index 665d64c81..9e1795a17 100644 --- a/daemon/log_funcs.h +++ b/daemon/log_funcs.h @@ -27,35 +27,35 @@ INLINE void __log_info_release(struct log_info *li) { break; } } -INLINE void __log_info_push(void) { - if (log_info.e == LOG_INFO_NONE) - return; - struct log_info *copy = g_slice_alloc(sizeof(*copy)); - *copy = log_info; - log_info_stack = g_slist_prepend(log_info_stack, copy); - ZERO(log_info); +INLINE bool __log_info_push(void) { + if (log_info[log_info_idx].e == LOG_INFO_NONE) + return true; + log_info_idx++; + if (log_info_idx >= LOG_INFO_STACK_SIZE) { + log_info_idx = LOG_INFO_STACK_SIZE - 1; + return false; + } + ZERO(log_info[log_info_idx]); + return true; } // should be paired with any invocation of log_info_X() INLINE void log_info_pop(void) { - __log_info_release(&log_info); + __log_info_release(&log_info[log_info_idx]); - if (!log_info_stack) { - ZERO(log_info); + if (log_info_idx == 0) { + ZERO(log_info[0]); call_memory_arena_release(); return; } - struct log_info *next = log_info_stack->data; - log_info = *next; - g_slice_free1(sizeof(*next), next); - log_info_stack = g_slist_delete_link(log_info_stack, log_info_stack); + log_info_idx--; } // should be used with non-refcounted log info pieces INLINE void log_info_pop_until(void *p) { assert(p != NULL); - while (log_info.ptr) { - void *prev = log_info.ptr; + while (log_info_idx || log_info[log_info_idx].ptr) { + void *prev = log_info[log_info_idx].ptr; log_info_pop(); if (prev == p) break; @@ -63,54 +63,55 @@ INLINE void log_info_pop_until(void *p) { } // clears current log context and entire stack INLINE void log_info_reset(void) { - __log_info_release(&log_info); - ZERO(log_info); - call_memory_arena_release(); + while (log_info_idx) + log_info_pop(); - while (log_info_stack) { - struct log_info *element = log_info_stack->data; - __log_info_release(element); - g_slice_free1(sizeof(*element), element); - log_info_stack = g_slist_delete_link(log_info_stack, log_info_stack); - } + __log_info_release(&log_info[0]); + ZERO(log_info[0]); + call_memory_arena_release(); } INLINE void log_info_call(call_t *c) { if (!c) return; - __log_info_push(); - log_info.e = LOG_INFO_CALL; - log_info.call = obj_get(c); + if (!__log_info_push()) + return; + log_info[log_info_idx].e = LOG_INFO_CALL; + log_info[log_info_idx].call = obj_get(c); call_memory_arena_set(c); } INLINE void log_info_stream_fd(stream_fd *sfd) { if (!sfd) return; - __log_info_push(); - log_info.e = LOG_INFO_STREAM_FD; - log_info.stream_fd = obj_get(sfd); + if (!__log_info_push()) + return; + log_info[log_info_idx].e = LOG_INFO_STREAM_FD; + log_info[log_info_idx].stream_fd = obj_get(sfd); call_memory_arena_set(sfd->call); } INLINE void log_info_str(const str *s) { if (!s || !s->s) return; - __log_info_push(); - log_info.e = LOG_INFO_STR; - log_info.str = s; + if (!__log_info_push()) + return; + log_info[log_info_idx].e = LOG_INFO_STR; + log_info[log_info_idx].str = s; } INLINE void log_info_c_string(const char *s) { if (!s) return; - __log_info_push(); - log_info.e = LOG_INFO_C_STRING; - log_info.cstr = s; + if (!__log_info_push()) + return; + log_info[log_info_idx].e = LOG_INFO_C_STRING; + log_info[log_info_idx].cstr = s; } INLINE void log_info_ice_agent(struct ice_agent *ag) { if (!ag) return; - __log_info_push(); - log_info.e = LOG_INFO_ICE_AGENT; - log_info.ice_agent = (struct ice_agent *) obj_get(&ag->tt_obj); + if (!__log_info_push()) + return; + log_info[log_info_idx].e = LOG_INFO_ICE_AGENT; + log_info[log_info_idx].ice_agent = (struct ice_agent *) obj_get(&ag->tt_obj); call_memory_arena_set(ag->call); } INLINE void log_info_media(struct call_media *m) { @@ -118,10 +119,11 @@ INLINE void log_info_media(struct call_media *m) { return; if (!m->call) return; - __log_info_push(); - log_info.e = LOG_INFO_MEDIA; - log_info.call = obj_get(m->call); - log_info.media = m; + if (!__log_info_push()) + return; + log_info[log_info_idx].e = LOG_INFO_MEDIA; + log_info[log_info_idx].call = obj_get(m->call); + log_info[log_info_idx].media = m; call_memory_arena_set(m->call); }