cogl/trace: Make global start/stop more explicit
Don't try to handle things by threads enabling/disabling the main trace context on-demand, just have a clear start/stop API. For the D-Bus API, it becomes more straight forward, and for the persistent variant too, as it avoids having to pass garbage input when it's known that arguments will be discarded. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2998>
This commit is contained in:
parent
33a210d768
commit
ab39eaf131
@ -127,14 +127,24 @@ cogl_trace_context_ref (CoglTraceContext *trace_context)
|
|||||||
return trace_context;
|
return trace_context;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
ensure_trace_context (int fd,
|
setup_trace_context (int fd,
|
||||||
const char *filename)
|
const char *filename,
|
||||||
|
GError **error)
|
||||||
{
|
{
|
||||||
g_mutex_lock (&cogl_trace_mutex);
|
g_autoptr (GMutexLocker) locker = NULL;
|
||||||
if (!cogl_trace_context)
|
|
||||||
cogl_trace_context = cogl_trace_context_new (fd, filename);
|
locker = g_mutex_locker_new (&cogl_trace_mutex);
|
||||||
g_mutex_unlock (&cogl_trace_mutex);
|
if (cogl_trace_context)
|
||||||
|
{
|
||||||
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
|
"Trace context already setup");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
cogl_trace_context = cogl_trace_context_new (fd, filename);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static CoglTraceThreadContext *
|
static CoglTraceThreadContext *
|
||||||
@ -205,15 +215,35 @@ disable_tracing_idle_callback (gpointer user_data)
|
|||||||
return G_SOURCE_REMOVE;
|
return G_SOURCE_REMOVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
gboolean
|
||||||
set_tracing_enabled_on_thread (GMainContext *main_context,
|
cogl_start_tracing_with_path (const char *filename,
|
||||||
const char *group,
|
GError **error)
|
||||||
int fd,
|
{
|
||||||
const char *filename)
|
return setup_trace_context (-1, filename, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
cogl_start_tracing_with_fd (int fd,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
return setup_trace_context (fd, NULL, error);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_stop_tracing (void)
|
||||||
|
{
|
||||||
|
g_mutex_lock (&cogl_trace_mutex);
|
||||||
|
g_clear_pointer (&cogl_trace_context, cogl_trace_context_unref);
|
||||||
|
g_mutex_unlock (&cogl_trace_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_set_tracing_enabled_on_thread (GMainContext *main_context,
|
||||||
|
const char *group)
|
||||||
{
|
{
|
||||||
TraceData *data;
|
TraceData *data;
|
||||||
|
|
||||||
ensure_trace_context (fd, filename);
|
g_return_if_fail (cogl_trace_context);
|
||||||
|
|
||||||
data = g_new0 (TraceData, 1);
|
data = g_new0 (TraceData, 1);
|
||||||
data->group = group ? strdup (group) : NULL;
|
data->group = group ? strdup (group) : NULL;
|
||||||
@ -239,29 +269,9 @@ set_tracing_enabled_on_thread (GMainContext *main_context,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
cogl_set_tracing_enabled_on_thread_with_fd (GMainContext *main_context,
|
|
||||||
const char *group,
|
|
||||||
int fd)
|
|
||||||
{
|
|
||||||
set_tracing_enabled_on_thread (main_context, group, fd, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
cogl_set_tracing_enabled_on_thread (GMainContext *main_context,
|
|
||||||
const char *group,
|
|
||||||
const char *filename)
|
|
||||||
{
|
|
||||||
set_tracing_enabled_on_thread (main_context, group, -1, filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
cogl_set_tracing_disabled_on_thread (GMainContext *main_context)
|
cogl_set_tracing_disabled_on_thread (GMainContext *main_context)
|
||||||
{
|
{
|
||||||
g_mutex_lock (&cogl_trace_mutex);
|
|
||||||
g_clear_pointer (&cogl_trace_context, cogl_trace_context_unref);
|
|
||||||
g_mutex_unlock (&cogl_trace_mutex);
|
|
||||||
|
|
||||||
if (g_main_context_get_thread_default () == main_context)
|
if (g_main_context_get_thread_default () == main_context)
|
||||||
{
|
{
|
||||||
disable_tracing_idle_callback (NULL);
|
disable_tracing_idle_callback (NULL);
|
||||||
@ -330,18 +340,33 @@ cogl_trace_describe (CoglTraceHead *head,
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
cogl_start_tracing_with_path (const char *filename,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
|
||||||
|
"Tracing disabled at build time");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
cogl_start_tracing_with_fd (int fd,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
|
||||||
|
"Tracing disabled at build time");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cogl_set_tracing_enabled_on_thread_with_fd (void *data,
|
cogl_stop_tracing (void)
|
||||||
const char *group,
|
|
||||||
int fd)
|
|
||||||
{
|
{
|
||||||
fprintf (stderr, "Tracing not enabled");
|
fprintf (stderr, "Tracing not enabled");
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cogl_set_tracing_enabled_on_thread (void *data,
|
cogl_set_tracing_enabled_on_thread (void *data,
|
||||||
const char *group,
|
const char *group)
|
||||||
const char *filename)
|
|
||||||
{
|
{
|
||||||
fprintf (stderr, "Tracing not enabled");
|
fprintf (stderr, "Tracing not enabled");
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#define COGL_TRACE_H
|
#define COGL_TRACE_H
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
#include <gio/gio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
@ -53,18 +54,26 @@ CoglTraceContext *cogl_trace_context;
|
|||||||
COGL_EXPORT
|
COGL_EXPORT
|
||||||
GMutex cogl_trace_mutex;
|
GMutex cogl_trace_mutex;
|
||||||
|
|
||||||
COGL_EXPORT void
|
COGL_EXPORT
|
||||||
cogl_set_tracing_enabled_on_thread_with_fd (GMainContext *main_context,
|
gboolean cogl_start_tracing_with_path (const char *filename,
|
||||||
const char *group,
|
GError **error);
|
||||||
int fd);
|
|
||||||
|
|
||||||
COGL_EXPORT void
|
COGL_EXPORT
|
||||||
cogl_set_tracing_enabled_on_thread (GMainContext *main_context,
|
gboolean cogl_start_tracing_with_fd (int fd,
|
||||||
const char *group,
|
GError **error);
|
||||||
const char *filename);
|
|
||||||
|
|
||||||
COGL_EXPORT void
|
COGL_EXPORT
|
||||||
cogl_set_tracing_disabled_on_thread (GMainContext *main_context);
|
void cogl_stop_tracing (void);
|
||||||
|
|
||||||
|
COGL_EXPORT
|
||||||
|
gboolean cogl_is_tracing (void);
|
||||||
|
|
||||||
|
COGL_EXPORT
|
||||||
|
void cogl_set_tracing_enabled_on_thread (GMainContext *main_context,
|
||||||
|
const char *group);
|
||||||
|
|
||||||
|
COGL_EXPORT
|
||||||
|
void cogl_set_tracing_disabled_on_thread (GMainContext *main_context);
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
cogl_trace_begin (CoglTraceHead *head,
|
cogl_trace_begin (CoglTraceHead *head,
|
||||||
@ -140,16 +149,25 @@ cogl_is_tracing_enabled (void)
|
|||||||
#define COGL_TRACE_ANCHOR(Name) (void) 0
|
#define COGL_TRACE_ANCHOR(Name) (void) 0
|
||||||
#define COGL_TRACE_BEGIN_ANCHORED(Name, name) (void) 0
|
#define COGL_TRACE_BEGIN_ANCHORED(Name, name) (void) 0
|
||||||
|
|
||||||
COGL_EXPORT void
|
COGL_EXPORT
|
||||||
cogl_set_tracing_enabled_on_thread_with_fd (void *data,
|
gboolean cogl_start_tracing_with_path (const char *filename,
|
||||||
const char *group,
|
GError **error);
|
||||||
int fd);
|
|
||||||
COGL_EXPORT void
|
COGL_EXPORT
|
||||||
cogl_set_tracing_enabled_on_thread (void *data,
|
gboolean cogl_start_tracing_with_fd (int fd,
|
||||||
const char *group,
|
GError **error);
|
||||||
const char *filename);
|
|
||||||
COGL_EXPORT void
|
COGL_EXPORT
|
||||||
cogl_set_tracing_disabled_on_thread (void *data);
|
void cogl_stop_tracing (void);
|
||||||
|
|
||||||
|
COGL_EXPORT
|
||||||
|
gboolean cogl_is_tracing (void);
|
||||||
|
|
||||||
|
COGL_EXPORT
|
||||||
|
void cogl_set_tracing_enabled_on_thread (void *data,
|
||||||
|
const char *group)
|
||||||
|
COGL_EXPORT
|
||||||
|
void cogl_set_tracing_disabled_on_thread (void *data);
|
||||||
|
|
||||||
#endif /* COGL_HAS_TRACING */
|
#endif /* COGL_HAS_TRACING */
|
||||||
|
|
||||||
|
@ -87,6 +87,7 @@ handle_start (MetaDBusSysprof3Profiler *dbus_profiler,
|
|||||||
{
|
{
|
||||||
MetaProfiler *profiler = META_PROFILER (dbus_profiler);
|
MetaProfiler *profiler = META_PROFILER (dbus_profiler);
|
||||||
GMainContext *main_context = g_main_context_default ();
|
GMainContext *main_context = g_main_context_default ();
|
||||||
|
g_autoptr (GError) error = NULL;
|
||||||
const char *group_name;
|
const char *group_name;
|
||||||
int position;
|
int position;
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
@ -111,17 +112,31 @@ handle_start (MetaDBusSysprof3Profiler *dbus_profiler,
|
|||||||
|
|
||||||
if (fd != -1)
|
if (fd != -1)
|
||||||
{
|
{
|
||||||
cogl_set_tracing_enabled_on_thread_with_fd (main_context,
|
if (!cogl_start_tracing_with_fd (fd, &error))
|
||||||
group_name,
|
{
|
||||||
fd);
|
g_dbus_method_invocation_return_error (invocation,
|
||||||
|
G_DBUS_ERROR,
|
||||||
|
G_DBUS_ERROR_FAILED,
|
||||||
|
"Failed to start: %s",
|
||||||
|
error->message);
|
||||||
|
return G_DBUS_METHOD_INVOCATION_HANDLED;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cogl_set_tracing_enabled_on_thread (main_context,
|
if (!cogl_start_tracing_with_path ("mutter-profile.syscap", &error))
|
||||||
group_name,
|
{
|
||||||
"mutter-profile.syscap");
|
g_dbus_method_invocation_return_error (invocation,
|
||||||
|
G_DBUS_ERROR,
|
||||||
|
G_DBUS_ERROR_FAILED,
|
||||||
|
"Failed to start: %s",
|
||||||
|
error->message);
|
||||||
|
return G_DBUS_METHOD_INVOCATION_HANDLED;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cogl_set_tracing_enabled_on_thread (main_context, group_name);
|
||||||
|
|
||||||
g_mutex_lock (&profiler->mutex);
|
g_mutex_lock (&profiler->mutex);
|
||||||
for (l = profiler->threads; l; l = l->next)
|
for (l = profiler->threads; l; l = l->next)
|
||||||
{
|
{
|
||||||
@ -131,18 +146,8 @@ handle_start (MetaDBusSysprof3Profiler *dbus_profiler,
|
|||||||
thread_group_name = g_strdup_printf ("%s (%s)",
|
thread_group_name = g_strdup_printf ("%s (%s)",
|
||||||
group_name,
|
group_name,
|
||||||
thread_info->name);
|
thread_info->name);
|
||||||
if (fd != -1)
|
cogl_set_tracing_enabled_on_thread (thread_info->main_context,
|
||||||
{
|
thread_group_name);
|
||||||
cogl_set_tracing_enabled_on_thread_with_fd (thread_info->main_context,
|
|
||||||
thread_group_name,
|
|
||||||
fd);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cogl_set_tracing_enabled_on_thread (thread_info->main_context,
|
|
||||||
thread_group_name,
|
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
g_mutex_unlock (&profiler->mutex);
|
g_mutex_unlock (&profiler->mutex);
|
||||||
|
|
||||||
@ -245,6 +250,9 @@ meta_profiler_finalize (GObject *object)
|
|||||||
{
|
{
|
||||||
MetaProfiler *self = (MetaProfiler *)object;
|
MetaProfiler *self = (MetaProfiler *)object;
|
||||||
|
|
||||||
|
if (self->persistent)
|
||||||
|
cogl_stop_tracing ();
|
||||||
|
|
||||||
g_cancellable_cancel (self->cancellable);
|
g_cancellable_cancel (self->cancellable);
|
||||||
|
|
||||||
g_clear_object (&self->cancellable);
|
g_clear_object (&self->cancellable);
|
||||||
@ -285,14 +293,22 @@ meta_profiler_new (const char *trace_file)
|
|||||||
{
|
{
|
||||||
GMainContext *main_context = g_main_context_default ();
|
GMainContext *main_context = g_main_context_default ();
|
||||||
const char *group_name;
|
const char *group_name;
|
||||||
|
g_autoptr (GError) error = NULL;
|
||||||
|
|
||||||
/* Translators: this string will appear in Sysprof */
|
/* Translators: this string will appear in Sysprof */
|
||||||
group_name = _("Compositor");
|
group_name = _("Compositor");
|
||||||
|
|
||||||
cogl_set_tracing_enabled_on_thread (main_context,
|
if (!cogl_start_tracing_with_path (trace_file, &error))
|
||||||
group_name,
|
{
|
||||||
trace_file);
|
g_warning ("Failed to start persistent profiling: %s",
|
||||||
profiler->persistent = TRUE;
|
error->message);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cogl_set_tracing_enabled_on_thread (main_context, group_name);
|
||||||
|
profiler->persistent = TRUE;
|
||||||
|
profiler->running = TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return profiler;
|
return profiler;
|
||||||
|
Loading…
Reference in New Issue
Block a user