[gtksourceview/gnome-3-20] gutterrenderer: avoid signal emission when possible



commit 95711cbf6df8111fecbfd2aa1471227a27e1a980
Author: Christian Hergert <chergert redhat com>
Date:   Wed Apr 20 02:32:52 2016 -0700

    gutterrenderer: avoid signal emission when possible
    
    When we simply have a subclass that overrides ::query_data vfunc and no
    signals connected, we can avoid the signal emission altogether.
    
    This is similar to what gtk_widget_draw() does to avoid signal emission.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=765300

 gtksourceview/gtksourcegutterrenderer.c |   16 +++++++++++++++-
 1 files changed, 15 insertions(+), 1 deletions(-)
---
diff --git a/gtksourceview/gtksourcegutterrenderer.c b/gtksourceview/gtksourcegutterrenderer.c
index 6bb74e7..31e5656 100644
--- a/gtksourceview/gtksourcegutterrenderer.c
+++ b/gtksourceview/gtksourcegutterrenderer.c
@@ -1059,7 +1059,21 @@ gtk_source_gutter_renderer_query_data (GtkSourceGutterRenderer      *renderer,
        g_return_if_fail (start != NULL);
        g_return_if_fail (end != NULL);
 
-       g_signal_emit (renderer, signals[QUERY_DATA], 0, start, end, state);
+
+       /* Signal emission is relatively expensive and this code path is
+        * frequent enough to optimize the common case where we only have the
+        * override and no connected handlers.
+        *
+        * This is the same trick used by gtk_widget_draw().
+        */
+       if (G_UNLIKELY (g_signal_has_handler_pending (renderer, signals[QUERY_DATA], 0, FALSE)))
+       {
+               g_signal_emit (renderer, signals[QUERY_DATA], 0, start, end, state);
+       }
+       else if (GTK_SOURCE_GUTTER_RENDERER_GET_CLASS (renderer)->query_data)
+       {
+               GTK_SOURCE_GUTTER_RENDERER_GET_CLASS (renderer)->query_data (renderer, start, end, state);
+       }
 }
 
 /**


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