Browse Source

MT#55283 convert log info stack to array

Change-Id: I585c1e0a4aba4b53aaf1cd1db591a41f7e23939a
pull/1923/head
Richard Fuchs 9 months ago
parent
commit
4146d0f60b
3 changed files with 92 additions and 89 deletions
  1. +43
    -43
      daemon/log.c
  2. +3
    -2
      daemon/log.h
  3. +46
    -44
      daemon/log_funcs.h

+ 43
- 43
daemon/log.c View File

@ -12,8 +12,8 @@
#include "loglib.h" #include "loglib.h"
#include "main.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_cdr = 0;
int _log_facility_rtcp = 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) { 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: case LOG_INFO_NONE:
prefix[0] = 0; prefix[0] = 0;
break; break;
case LOG_INFO_CALL: case LOG_INFO_CALL:
snprintf(prefix, prefix_len, "[" STR_FORMAT_M "]: ", 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; break;
case LOG_INFO_STREAM_FD: 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]: ", 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 else
snprintf(prefix, prefix_len, "[" STR_FORMAT_M " port %5u]: ", 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 else
snprintf(prefix, prefix_len, "[no call, port %5u]: ", 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; break;
case LOG_INFO_STR: case LOG_INFO_STR:
snprintf(prefix, prefix_len, "[" STR_FORMAT_M "]: ", snprintf(prefix, prefix_len, "[" STR_FORMAT_M "]: ",
STR_FMT_M(log_info.str));
STR_FMT_M(log_info[log_info_idx].str));
break; break;
case LOG_INFO_C_STRING: case LOG_INFO_C_STRING:
snprintf(prefix, prefix_len, "[%s%s%s]: ", snprintf(prefix, prefix_len, "[%s%s%s]: ",
FMT_M(log_info.cstr));
FMT_M(log_info[log_info_idx].cstr));
break; break;
case LOG_INFO_ICE_AGENT: case LOG_INFO_ICE_AGENT:
snprintf(prefix, prefix_len, "[" STR_FORMAT_M "/" STR_FORMAT_M "/%u]: ", 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; break;
case LOG_INFO_MEDIA: case LOG_INFO_MEDIA:
snprintf(prefix, prefix_len, "[" STR_FORMAT_M "/" STR_FORMAT_M "/%u]: ", 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; break;
} }
} }
static void ilog_prefix_parsable(char *prefix, size_t prefix_len) { 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: case LOG_INFO_NONE:
prefix[0] = 0; prefix[0] = 0;
break; break;
case LOG_INFO_CALL: case LOG_INFO_CALL:
snprintf(prefix, prefix_len, "[ID=\""STR_FORMAT"\"]: ", snprintf(prefix, prefix_len, "[ID=\""STR_FORMAT"\"]: ",
STR_FMT(&log_info.call->callid));
STR_FMT(&log_info[log_info_idx].call->callid));
break; break;
case LOG_INFO_STREAM_FD: 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\"]: ", 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 else
snprintf(prefix, prefix_len, "[ID=\""STR_FORMAT"\" port=\"%5u\"]: ", 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; break;
case LOG_INFO_STR: case LOG_INFO_STR:
snprintf(prefix, prefix_len, "[ID=\""STR_FORMAT"\"]: ", snprintf(prefix, prefix_len, "[ID=\""STR_FORMAT"\"]: ",
STR_FMT(log_info.str));
STR_FMT(log_info[log_info_idx].str));
break; break;
case LOG_INFO_C_STRING: 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; break;
case LOG_INFO_ICE_AGENT: case LOG_INFO_ICE_AGENT:
snprintf(prefix, prefix_len, "[ID=\""STR_FORMAT"\" tag=\""STR_FORMAT"\" index=\"%u\"]: ", 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; break;
case LOG_INFO_MEDIA: case LOG_INFO_MEDIA:
snprintf(prefix, prefix_len, "[ID=\""STR_FORMAT"\" tag=\""STR_FORMAT"\" index=\"%u\"]: ", 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; break;
} }
} }
@ -167,16 +167,16 @@ void rtcplog(const char* cdrbuffer) {
int get_local_log_level(unsigned int subsystem_idx) { int get_local_log_level(unsigned int subsystem_idx) {
call_t *call = NULL; call_t *call = NULL;
switch (log_info.e) {
switch (log_info[log_info_idx].e) {
case LOG_INFO_CALL: case LOG_INFO_CALL:
case LOG_INFO_MEDIA: case LOG_INFO_MEDIA:
call = log_info.call;
call = log_info[log_info_idx].call;
break; break;
case LOG_INFO_STREAM_FD: case LOG_INFO_STREAM_FD:
call = log_info.stream_fd->call;
call = log_info[log_info_idx].stream_fd->call;
break; break;
case LOG_INFO_ICE_AGENT: case LOG_INFO_ICE_AGENT:
call = log_info.ice_agent->call;
call = log_info[log_info_idx].ice_agent->call;
break; break;
default: default:
break; break;


+ 3
- 2
daemon/log.h View File

@ -39,8 +39,9 @@ extern int _log_facility_rtcp;
extern int _log_facility_dtmf; 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;


+ 46
- 44
daemon/log_funcs.h View File

@ -27,35 +27,35 @@ INLINE void __log_info_release(struct log_info *li) {
break; 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() // should be paired with any invocation of log_info_X()
INLINE void log_info_pop(void) { 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(); call_memory_arena_release();
return; 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 // should be used with non-refcounted log info pieces
INLINE void log_info_pop_until(void *p) { INLINE void log_info_pop_until(void *p) {
assert(p != NULL); 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(); log_info_pop();
if (prev == p) if (prev == p)
break; break;
@ -63,54 +63,55 @@ INLINE void log_info_pop_until(void *p) {
} }
// clears current log context and entire stack // clears current log context and entire stack
INLINE void log_info_reset(void) { 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) { INLINE void log_info_call(call_t *c) {
if (!c) if (!c)
return; 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); call_memory_arena_set(c);
} }
INLINE void log_info_stream_fd(stream_fd *sfd) { INLINE void log_info_stream_fd(stream_fd *sfd) {
if (!sfd) if (!sfd)
return; 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); call_memory_arena_set(sfd->call);
} }
INLINE void log_info_str(const str *s) { INLINE void log_info_str(const str *s) {
if (!s || !s->s) if (!s || !s->s)
return; 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) { INLINE void log_info_c_string(const char *s) {
if (!s) if (!s)
return; 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) { INLINE void log_info_ice_agent(struct ice_agent *ag) {
if (!ag) if (!ag)
return; 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); call_memory_arena_set(ag->call);
} }
INLINE void log_info_media(struct call_media *m) { INLINE void log_info_media(struct call_media *m) {
@ -118,10 +119,11 @@ INLINE void log_info_media(struct call_media *m) {
return; return;
if (!m->call) if (!m->call)
return; 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); call_memory_arena_set(m->call);
} }


Loading…
Cancel
Save