[mutter/gbsneto/tracing: 5/9] profiler: Support setting output filename
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/gbsneto/tracing: 5/9] profiler: Support setting output filename
- Date: Fri, 31 May 2019 01:26:57 +0000 (UTC)
commit 716acd1e946a172d0518a19241e4c6b218ae53c7
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Fri Apr 12 15:34:56 2019 -0300
profiler: Support setting output filename
So we can have some control over where the file will
be saved.
https://gitlab.gnome.org/GNOME/mutter/merge_requests/197
cogl/cogl/cogl-trace.c | 85 ++++++++++++++++++++++++++++++++++++++++----------
cogl/cogl/cogl-trace.h | 11 +++++--
2 files changed, 76 insertions(+), 20 deletions(-)
---
diff --git a/cogl/cogl/cogl-trace.c b/cogl/cogl/cogl-trace.c
index 1ce62d10a..d5c66cc17 100644
--- a/cogl/cogl/cogl-trace.c
+++ b/cogl/cogl/cogl-trace.c
@@ -30,6 +30,22 @@
#define COGL_TRACE_OUTPUT_FILE "cogl-trace-sp-capture.syscap"
#define BUFFER_LENGTH (4096 * 4)
+typedef struct
+{
+ int fd;
+ char *filename;
+} TraceData;
+
+static void
+trace_data_free (gpointer user_data)
+{
+ TraceData *data = user_data;
+
+ data->fd = -1;
+ g_clear_pointer (&data->filename, g_free);
+ g_free (data);
+}
+
static void cogl_trace_thread_context_free (gpointer data);
GPrivate cogl_trace_thread_data = G_PRIVATE_INIT (cogl_trace_thread_context_free);
@@ -37,21 +53,26 @@ CoglTraceContext *cogl_trace_context;
GMutex cogl_trace_mutex;
static CoglTraceContext *
-cogl_trace_context_new (int fd)
+cogl_trace_context_new (int fd,
+ const char *filename)
{
CoglTraceContext *context;
SysprofCaptureWriter *writer;
- g_debug ("Initializing trace context with fd=%d", fd);
-
- if (fd == -1)
+ if (fd != -1)
{
- writer = sysprof_capture_writer_new (COGL_TRACE_OUTPUT_FILE,
- BUFFER_LENGTH);
+ g_debug ("Initializing trace context with fd=%d", fd);
+ writer = sysprof_capture_writer_new_from_fd (fd, BUFFER_LENGTH);
+ }
+ else if (filename != NULL)
+ {
+ g_debug ("Initializing trace context with filename='%s'", filename);
+ writer = sysprof_capture_writer_new (filename, BUFFER_LENGTH);
}
else
{
- writer = sysprof_capture_writer_new_from_fd (fd, BUFFER_LENGTH);
+ g_debug ("Initializing trace context with default dilename");
+ writer = sysprof_capture_writer_new (COGL_TRACE_OUTPUT_FILE, BUFFER_LENGTH);
}
context = g_new0 (CoglTraceContext, 1);
@@ -67,11 +88,11 @@ cogl_trace_context_free (CoglTraceContext *trace_context)
}
static void
-ensure_trace_context (int fd)
+ensure_trace_context (TraceData *data)
{
g_mutex_lock (&cogl_trace_mutex);
if (!cogl_trace_context)
- cogl_trace_context = cogl_trace_context_new (fd);
+ cogl_trace_context = cogl_trace_context_new (data->fd, data->filename);
g_mutex_unlock (&cogl_trace_mutex);
}
@@ -102,10 +123,10 @@ enable_tracing_idle_callback (gpointer user_data)
{
CoglTraceThreadContext *thread_context =
g_private_get (&cogl_trace_thread_data);
- int fd = GPOINTER_TO_INT (user_data);
+ TraceData *data = user_data;
ensure_sigpipe_ignored ();
- ensure_trace_context (fd);
+ ensure_trace_context (data);
if (thread_context)
{
@@ -157,20 +178,43 @@ disable_tracing_idle_callback (gpointer user_data)
return G_SOURCE_REMOVE;
}
-void
-cogl_set_tracing_enabled_on_thread (GMainContext *main_context,
- int fd)
+static void
+set_tracing_enabled_on_thread (GMainContext *main_context,
+ int fd,
+ const char *filename)
{
+ TraceData *data;
GSource *source;
+ data = g_new0 (TraceData, 1);
+ data->fd = fd;
+ data->filename = filename ? strdup (filename) : NULL;
+
source = g_idle_source_new ();
- g_source_set_callback (source, enable_tracing_idle_callback, GINT_TO_POINTER (fd), NULL);
+ g_source_set_callback (source,
+ enable_tracing_idle_callback,
+ data,
+ trace_data_free);
g_source_attach (source, main_context);
g_source_unref (source);
}
+void
+cogl_set_tracing_enabled_on_thread_with_fd (GMainContext *main_context,
+ int fd)
+{
+ set_tracing_enabled_on_thread (main_context, fd, NULL);
+}
+
+void
+cogl_set_tracing_enabled_on_thread (GMainContext *main_context,
+ const char *filename)
+{
+ set_tracing_enabled_on_thread (main_context, -1, filename);
+}
+
void
cogl_set_tracing_disabled_on_thread (GMainContext *main_context)
{
@@ -190,8 +234,15 @@ cogl_set_tracing_disabled_on_thread (GMainContext *main_context)
#include <stdio.h>
void
-cogl_set_tracing_enabled_on_thread (void *data,
- int fd)
+cogl_set_tracing_enabled_on_thread_with_fd (void *data,
+ int fd)
+{
+ fprintf (stderr, "Tracing not enabled");
+}
+
+void
+cogl_set_tracing_enabled_on_thread (void *data,
+ const char *filename)
{
fprintf (stderr, "Tracing not enabled");
}
diff --git a/cogl/cogl/cogl-trace.h b/cogl/cogl/cogl-trace.h
index ffcd4d240..2e9d2fa5e 100644
--- a/cogl/cogl/cogl-trace.h
+++ b/cogl/cogl/cogl-trace.h
@@ -51,8 +51,11 @@ extern GPrivate cogl_trace_thread_data;
extern CoglTraceContext *cogl_trace_context;
extern GMutex cogl_trace_mutex;
+void cogl_set_tracing_enabled_on_thread_with_fd (GMainContext *main_context,
+ int fd);
+
void cogl_set_tracing_enabled_on_thread (GMainContext *main_context,
- int fd);
+ const char *filename);
void cogl_set_tracing_disabled_on_thread (GMainContext *main_context);
@@ -129,8 +132,10 @@ cogl_auto_trace_end_helper (CoglTraceHead **head)
#define COGL_TRACE_END(Name) (void) 0
#define COGL_TRACE_BEGIN_SCOPED(Name) (void) 0
-void cogl_set_tracing_enabled_on_thread (void *data, int fd);
-
+void cogl_set_tracing_enabled_on_thread_with_fd (void *data,
+ int fd);
+void cogl_set_tracing_enabled_on_thread (void *data,
+ const char *filename);
void cogl_set_tracing_disabled_on_thread (void *data);
#endif /* HAVE_TRACING */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]