[gtksourceview/gnome-3-20] gutterrenderer: avoid signal emission when possible
- From: Paolo Borelli <pborelli src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtksourceview/gnome-3-20] gutterrenderer: avoid signal emission when possible
- Date: Sat, 23 Apr 2016 11:08:05 +0000 (UTC)
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]