[sysprof] libsysprof-collector: avoid formatting unless recording



commit 01d196abe4452136b37e2f8dbda84adf710f196e
Author: Christian Hergert <chergert redhat com>
Date:   Mon Mar 16 12:26:05 2020 -0700

    libsysprof-collector: avoid formatting unless recording
    
    We can avoid the process of creating the log message altogether if we are
    not actively recording messages.

 src/libsysprof-capture/sysprof-collector.c | 38 +++++++++++++++++++++++++-----
 1 file changed, 32 insertions(+), 6 deletions(-)
---
diff --git a/src/libsysprof-capture/sysprof-collector.c b/src/libsysprof-capture/sysprof-collector.c
index 5f06dd3..3c96065 100644
--- a/src/libsysprof-capture/sysprof-collector.c
+++ b/src/libsysprof-capture/sysprof-collector.c
@@ -461,12 +461,38 @@ sysprof_collector_log_printf (GLogLevelFlags  severity,
                               const gchar    *format,
                               ...)
 {
-  g_autofree gchar *formatted = NULL;
-  va_list args;
+  COLLECTOR_BEGIN {
+    g_autofree gchar *formatted = NULL;
+    SysprofCaptureLog *ev;
+    va_list args;
+    gsize len;
+    gsize sl;
 
-  va_start (args, format);
-  formatted = g_strdup_vprintf (format, args);
-  va_end (args);
+    va_start (args, format);
+    formatted = g_strdup_vprintf (format, args);
+    va_end (args);
+
+    if (domain == NULL)
+      domain = "";
 
-  sysprof_collector_log (severity, domain, formatted);
+    sl = strlen (formatted);
+    len = realign (sizeof *ev + sl + 1);
+
+    if ((ev = mapped_ring_buffer_allocate (collector->buffer, len)))
+      {
+        ev->frame.len = len;
+        ev->frame.type = SYSPROF_CAPTURE_FRAME_LOG;
+        ev->frame.cpu = _do_getcpu ();
+        ev->frame.pid = collector->pid;
+        ev->frame.time = SYSPROF_CAPTURE_CURRENT_TIME;
+        ev->severity = severity & 0xFFFF;
+        ev->padding1 = 0;
+        ev->padding2 = 0;
+        g_strlcpy (ev->domain, domain, sizeof ev->domain);
+        memcpy (ev->message, formatted, sl);
+        ev->message[sl] = 0;
+
+        mapped_ring_buffer_advance (collector->buffer, ev->frame.len);
+      }
+  } COLLECTOR_END;
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]