Commit d3630ed4 authored by Pekka Paalanen's avatar Pekka Paalanen Committed by Daniel Stone

compositor: offer logs via weston-debug

This registers a new weston-debug scope "log" through which one can get
live log output interspersed with possible other debugging prints. This
is implemented by passing the format and varargs received in our usual
logging entrypoints through to the debug scope as well.

Anywhere where the varargs set is used twice (once for vfprintf, another
for the debug scope), we copy the va_list in order to avoid reusing it,
which leads to memory safety issues.
Signed-off-by: Pekka Paalanen's avatarPekka Paalanen <>
Signed-off-by: default avatarManiraj Devadoss <>
Reviewed-by: Pekka Paalanen's avatarPekka Paalanen <>
Reviewed-by: Daniel Stone's avatarDaniel Stone <>
parent b9fdc14b
......@@ -119,6 +119,7 @@ struct wet_compositor {
static FILE *weston_logfile = NULL;
static struct weston_debug_scope *log_scope;
static int cached_tm_mday = -1;
......@@ -149,9 +150,19 @@ static int weston_log_timestamp(void)
static void
custom_handler(const char *fmt, va_list arg)
char timestr[128];
va_list arg2;
va_copy(arg2, arg);
fprintf(weston_logfile, "libwayland: ");
vfprintf(weston_logfile, fmt, arg);
vfprintf(weston_logfile, fmt, arg2);
weston_debug_scope_printf(log_scope, "%s libwayland: ",
timestr, sizeof timestr));
weston_debug_scope_vprintf(log_scope, fmt, arg);
static void
......@@ -183,9 +194,21 @@ static int
vlog(const char *fmt, va_list ap)
int l;
char timestr[128];
va_list ap2;
va_copy(ap2, ap);
if (weston_debug_scope_is_enabled(log_scope)) {
weston_debug_scope_printf(log_scope, "%s ",
timestr, sizeof timestr));
weston_debug_scope_vprintf(log_scope, fmt, ap);
l = weston_log_timestamp();
l += vfprintf(weston_logfile, fmt, ap);
l += vfprintf(weston_logfile, fmt, ap2);
return l;
......@@ -193,6 +216,12 @@ vlog(const char *fmt, va_list ap)
static int
vlog_continue(const char *fmt, va_list argp)
va_list argp2;
va_copy(argp2, argp);
weston_debug_scope_vprintf(log_scope, fmt, argp2);
return vfprintf(weston_logfile, fmt, argp);
......@@ -2490,6 +2519,9 @@ int main(int argc, char *argv[])
segv_compositor = wet.compositor;
log_scope = weston_compositor_add_debug_scope(wet.compositor, "log",
"Weston and Wayland log\n", NULL, NULL);
if (debug_protocol)
......@@ -2602,6 +2634,8 @@ out:
/* free(NULL) is valid, and it won't be NULL if it's used */
log_scope = NULL;
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment