mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2025-01-04 01:31:13 +00:00
6de85c0a68
This allows us to avoid hand-rolling g_strdup_printf calls, but also moves the printf into the called function where it doesn't bloat the code of the calling function if the profiler is not running.
258 lines
5.8 KiB
C
258 lines
5.8 KiB
C
/* GDK - The GIMP Drawing Kit
|
|
*
|
|
* gdkprofiler.c: A simple profiler
|
|
*
|
|
* Copyright © 2018 Matthias Clasen
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#include <sys/types.h>
|
|
#include <signal.h>
|
|
|
|
#ifdef HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
#include "gdkversionmacros.h"
|
|
#include "gdkprofilerprivate.h"
|
|
#include "gdkframeclockprivate.h"
|
|
|
|
#ifdef HAVE_SYSPROF_CAPTURE
|
|
|
|
#include <sysprof-capture.h>
|
|
|
|
static SysprofCaptureWriter *writer = NULL;
|
|
static gboolean running = FALSE;
|
|
|
|
static void
|
|
profiler_stop (int s)
|
|
{
|
|
if (writer)
|
|
sysprof_capture_writer_unref (writer);
|
|
}
|
|
|
|
void
|
|
gdk_profiler_start (int fd)
|
|
{
|
|
if (writer)
|
|
return;
|
|
|
|
sysprof_clock_init ();
|
|
|
|
if (fd == -1)
|
|
{
|
|
gchar *filename;
|
|
|
|
filename = g_strdup_printf ("gtk.%d.syscap", getpid ());
|
|
g_print ("Writing profiling data to %s\n", filename);
|
|
writer = sysprof_capture_writer_new (filename, 16*1024);
|
|
g_free (filename);
|
|
}
|
|
else if (fd > 2)
|
|
writer = sysprof_capture_writer_new_from_fd (fd, 16*1024);
|
|
|
|
if (writer)
|
|
running = TRUE;
|
|
|
|
atexit (G_CALLBACK (profiler_stop));
|
|
signal (SIGTERM, profiler_stop);
|
|
}
|
|
|
|
void
|
|
gdk_profiler_stop (void)
|
|
{
|
|
running = FALSE;
|
|
}
|
|
|
|
gboolean
|
|
gdk_profiler_is_running (void)
|
|
{
|
|
return running;
|
|
}
|
|
|
|
void
|
|
gdk_profiler_add_mark (gint64 start,
|
|
guint64 duration,
|
|
const char *name,
|
|
const char *message)
|
|
{
|
|
if (!running)
|
|
return;
|
|
|
|
sysprof_capture_writer_add_mark (writer,
|
|
start,
|
|
-1, getpid (),
|
|
duration,
|
|
"gtk", name, message);
|
|
}
|
|
|
|
void
|
|
gdk_profiler_add_markf (gint64 start,
|
|
guint64 duration,
|
|
const char *name,
|
|
const char *format,
|
|
...)
|
|
{
|
|
va_list args;
|
|
char *message;
|
|
|
|
if (!running)
|
|
return;
|
|
|
|
va_start (args, format);
|
|
message = g_strdup_vprintf (format, args);
|
|
va_end (args);
|
|
|
|
sysprof_capture_writer_add_mark (writer,
|
|
start,
|
|
-1, getpid (),
|
|
duration,
|
|
"gtk", name, message);
|
|
g_free (message);
|
|
}
|
|
|
|
static guint
|
|
define_counter (const char *name,
|
|
const char *description,
|
|
int type)
|
|
{
|
|
SysprofCaptureCounter counter;
|
|
|
|
if (!writer)
|
|
return 0;
|
|
|
|
counter.id = (guint) sysprof_capture_writer_request_counter (writer, 1);
|
|
counter.type = type;
|
|
counter.value.vdbl = 0;
|
|
g_strlcpy (counter.category, "gtk", sizeof counter.category);
|
|
g_strlcpy (counter.name, name, sizeof counter.name);
|
|
g_strlcpy (counter.description, description, sizeof counter.name);
|
|
|
|
sysprof_capture_writer_define_counters (writer,
|
|
SYSPROF_CAPTURE_CURRENT_TIME,
|
|
-1,
|
|
getpid (),
|
|
&counter,
|
|
1);
|
|
|
|
return counter.id;
|
|
}
|
|
|
|
guint
|
|
gdk_profiler_define_counter (const char *name,
|
|
const char *description)
|
|
{
|
|
return define_counter (name, description, SYSPROF_CAPTURE_COUNTER_DOUBLE);
|
|
}
|
|
|
|
guint
|
|
gdk_profiler_define_int_counter (const char *name,
|
|
const char *description)
|
|
{
|
|
return define_counter (name, description, SYSPROF_CAPTURE_COUNTER_INT64);
|
|
}
|
|
|
|
void
|
|
gdk_profiler_set_counter (guint id,
|
|
gint64 time,
|
|
double val)
|
|
{
|
|
SysprofCaptureCounterValue value;
|
|
|
|
if (!running)
|
|
return;
|
|
|
|
value.vdbl = val;
|
|
sysprof_capture_writer_set_counters (writer,
|
|
time,
|
|
-1, getpid (),
|
|
&id, &value, 1);
|
|
}
|
|
|
|
void
|
|
gdk_profiler_set_int_counter (guint id,
|
|
gint64 time,
|
|
gint64 val)
|
|
{
|
|
SysprofCaptureCounterValue value;
|
|
|
|
if (!running)
|
|
return;
|
|
|
|
value.v64 = val;
|
|
sysprof_capture_writer_set_counters (writer,
|
|
time,
|
|
-1, getpid (),
|
|
&id, &value, 1);
|
|
}
|
|
|
|
#else
|
|
|
|
void
|
|
gdk_profiler_start (int fd)
|
|
{
|
|
}
|
|
|
|
void
|
|
gdk_profiler_stop (void)
|
|
{
|
|
}
|
|
|
|
gboolean
|
|
gdk_profiler_is_running (void)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
void
|
|
gdk_profiler_add_mark (gint64 start,
|
|
guint64 duration,
|
|
const char *name,
|
|
const char *message)
|
|
{
|
|
}
|
|
|
|
guint
|
|
gdk_profiler_define_counter (const char *name,
|
|
const char *description)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
gdk_profiler_set_counter (guint id,
|
|
gint64 time,
|
|
double value)
|
|
{
|
|
}
|
|
|
|
guint
|
|
gdk_profiler_define_int_counter (const char *name,
|
|
const char *description)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
gdk_profiler_set_int_counter (guint id,
|
|
gint64 time,
|
|
gint64 value)
|
|
{
|
|
}
|
|
|
|
#endif /* G_OS_WIN32 */
|