fix trace logging

This commit is contained in:
Wim Taymans 2017-04-27 18:56:59 +02:00
parent 214a0e27d8
commit 430b749d53
3 changed files with 24 additions and 14 deletions

View file

@ -49,14 +49,19 @@ do_logv (SpaLog *log,
{ {
DebugLog *l = SPA_CONTAINER_OF (log, DebugLog, log); DebugLog *l = SPA_CONTAINER_OF (log, DebugLog, log);
char text[1024], location[1024]; char text[1024], location[1024];
static const char *levels[] = { "-", "E", "W", "I", "D", "T", }; static const char *levels[] = { "-", "E", "W", "I", "D", "T", "*T*"};
int size; int size;
bool do_trace = (level == SPA_LOG_LEVEL_TRACE && l->source);
vsnprintf (text, sizeof(text), fmt, args); vsnprintf (text, sizeof(text), fmt, args);
if ((do_trace = (level == SPA_LOG_LEVEL_TRACE && l->source)))
level++;
size = snprintf (location, sizeof(location), "[%s][%s:%i %s()] %s\n", size = snprintf (location, sizeof(location), "[%s][%s:%i %s()] %s\n",
levels[level], strrchr (file, '/')+1, line, func, text); levels[level], strrchr (file, '/')+1, line, func, text);
if (SPA_UNLIKELY (level == SPA_LOG_LEVEL_TRACE && l->source)) { if (SPA_UNLIKELY (do_trace)) {
uint32_t index; uint32_t index;
uint64_t count = 1; uint64_t count = 1;
@ -68,7 +73,7 @@ do_logv (SpaLog *log,
write (l->source->fd, &count, sizeof(uint64_t)); write (l->source->fd, &count, sizeof(uint64_t));
} else } else
fputs (location, stderr); fputs (location, stdout);
} }
static void static void
@ -119,20 +124,21 @@ on_trace_event (SpaSource *source)
fprintf (stderr, "failed to read event fd: %s", strerror (errno)); fprintf (stderr, "failed to read event fd: %s", strerror (errno));
while ((avail = spa_ringbuffer_get_read_index (&log.trace_rb, &index)) > 0) { while ((avail = spa_ringbuffer_get_read_index (&log.trace_rb, &index)) > 0) {
uint32_t offset, first, written; uint32_t offset, first;
if (avail > log.trace_rb.size) { if (avail > log.trace_rb.size) {
fprintf (stderr, "\n** trace overflow ** %d\n", avail);
index += avail - log.trace_rb.size; index += avail - log.trace_rb.size;
avail = log.trace_rb.size; avail = log.trace_rb.size;
} }
offset = index & log.trace_rb.mask; offset = index & log.trace_rb.mask;
first = SPA_MIN (avail, log.trace_rb.size - offset); first = SPA_MIN (avail, log.trace_rb.size - offset);
written = fprintf (stderr, "%*s", first, log.trace_data + offset); fwrite (log.trace_data + offset, first, 1, stderr);
if (SPA_UNLIKELY (avail > first)) { if (SPA_UNLIKELY (avail > first)) {
written += fprintf (stderr, "%*s", avail - first, log.trace_data + first); fwrite (log.trace_data, avail - first, 1, stderr);
} }
spa_ringbuffer_read_update (&log.trace_rb, index + written); spa_ringbuffer_read_update (&log.trace_rb, index + avail);
} }
} }

View file

@ -42,7 +42,7 @@ main (int argc, char *argv[])
} }
loop = pinos_main_loop_new (); loop = pinos_main_loop_new ();
#if 0 #if 1
{ {
SpaSource *source; SpaSource *source;
source = pinos_loop_add_event (loop->loop, NULL, NULL); source = pinos_loop_add_event (loop->loop, NULL, NULL);

View file

@ -465,14 +465,18 @@ do_logv (SpaLog *log,
{ {
DebugLog *l = SPA_CONTAINER_OF (log, DebugLog, log); DebugLog *l = SPA_CONTAINER_OF (log, DebugLog, log);
char text[512], location[1024]; char text[512], location[1024];
static const char *levels[] = { "-", "E", "W", "I", "D", "T", }; static const char *levels[] = { "-", "E", "W", "I", "D", "T", "*T*" };
int size; int size;
bool do_trace;
if ((do_trace = (level == SPA_LOG_LEVEL_TRACE && l->source)))
level++;
vsnprintf (text, sizeof(text), fmt, args); vsnprintf (text, sizeof(text), fmt, args);
size = snprintf (location, sizeof(location), "[%s][%s:%i %s()] %s\n", size = snprintf (location, sizeof(location), "[%s][%s:%i %s()] %s\n",
levels[level], strrchr (file, '/')+1, line, func, text); levels[level], strrchr (file, '/')+1, line, func, text);
if (SPA_UNLIKELY (level == SPA_LOG_LEVEL_TRACE) && l->source) { if (SPA_UNLIKELY (do_trace)) {
uint32_t index; uint32_t index;
uint64_t count = 1; uint64_t count = 1;
@ -528,7 +532,7 @@ on_trace_event (SpaSource *source)
fprintf (stderr, "failed to read event fd: %s", strerror (errno)); fprintf (stderr, "failed to read event fd: %s", strerror (errno));
while ((avail = spa_ringbuffer_get_read_index (&log.trace_rb, &index)) > 0) { while ((avail = spa_ringbuffer_get_read_index (&log.trace_rb, &index)) > 0) {
uint32_t offset, first, written; uint32_t offset, first;
if (avail > log.trace_rb.size) { if (avail > log.trace_rb.size) {
index += avail - log.trace_rb.size; index += avail - log.trace_rb.size;
@ -537,11 +541,11 @@ on_trace_event (SpaSource *source)
offset = index & log.trace_rb.mask; offset = index & log.trace_rb.mask;
first = SPA_MIN (avail, log.trace_rb.size - offset); first = SPA_MIN (avail, log.trace_rb.size - offset);
written = fprintf (stderr, "%*s", first, log.trace_data + offset); fwrite (log.trace_data + offset, first, 1, stderr);
if (SPA_UNLIKELY (avail > first)) { if (SPA_UNLIKELY (avail > first)) {
written += fprintf (stderr, "%*s", avail - first, log.trace_data + first); fwrite (log.trace_data, avail - first, 1, stderr);
} }
spa_ringbuffer_read_update (&log.trace_rb, index + written); spa_ringbuffer_read_update (&log.trace_rb, index + avail);
} }
} }