compositor: Pass the entire string in one-shot when writting logger data
authorMarius Vlad <marius.vlad@collabora.com>
Fri, 1 Nov 2019 12:28:22 +0000 (14:28 +0200)
committerMarius Vlad <marius.vlad@collabora.com>
Tue, 5 Nov 2019 11:59:18 +0000 (13:59 +0200)
This fixes the situation where the same logger scope is passed multiple
times and the timestamp is being sent before the log mesasge.

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Reported-by: Pekka Paalanen <pekka.paalanen@collabora.com>
compositor/main.c

index f9b7a631dc2bead166fc1733a7cd14d0db981658..29a427b9d3910996ebc55e9b9a9fefb0e513c174 100644 (file)
@@ -199,14 +199,24 @@ weston_log_file_close(void)
 static int
 vlog(const char *fmt, va_list ap)
 {
+       const char *oom = "Out of memory";
        char timestr[128];
        int len = 0;
+       char *str;
 
        if (weston_log_scope_is_enabled(log_scope)) {
-               len = weston_log_scope_printf(log_scope, "%s ",
-                                             weston_log_timestamp(timestr,
-                                             sizeof timestr));
-               len += weston_log_scope_vprintf(log_scope, fmt, ap);
+               int len_va;
+               char *log_timestamp = weston_log_timestamp(timestr,
+                                                          sizeof(timestr));
+               len_va = vasprintf(&str, fmt, ap);
+               if (len_va >= 0) {
+                       len = weston_log_scope_printf(log_scope, "%s %s",
+                                                     log_timestamp, str);
+                       free(str);
+               } else {
+                       len = weston_log_scope_printf(log_scope, "%s %s",
+                                                     log_timestamp, oom);
+               }
        }
 
        return len;