 ef67eb0b3c
			
		
	
	ef67eb0b3c
	
	
	
		
			
			This is a backport of the GdkProfiler from master. It does not include the pixel bandwidth numbers that come from gdkdrawcontext.c since there does not seem to be an analog in 3.x. Additionally, this implements the recent changes for SYsprof's D-Bus profiler API which adds a Capabilities property and an options hash-table to the D-Bus interface for forward portability.
		
			
				
	
	
		
			231 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			231 lines
		
	
	
		
			5.1 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>
 | |
| 
 | |
| #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 (void)
 | |
| {
 | |
|   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 (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);
 | |
| }
 | |
| 
 | |
| 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 */
 |