[gnome-shell/wip/carlosg/mild-style-perf-improvements: 1/2] st: Use g_signal_handler_disconnect() to disconnect from StTheme



commit 1e2d5576c434308a20a7bbe2d4c017df10e002f9
Author: Carlos Garnacho <carlosg gnome org>
Date:   Tue Apr 30 14:42:59 2019 +0200

    st: Use g_signal_handler_disconnect() to disconnect from StTheme
    
    With a high enough amount of actors, there may be enough theme nodes and
    signal connections on StTheme::custom-stylesheets-changed that
    g_signal_handlers_disconnect_by*() on dispose becomes expensive, this may
    become a surprisingly hot spot in StWidget::style-changed.
    
    Keep the handler ID around and use g_signal_handler_disconnect() to avoid
    linear lookups for the matching func/data.

 src/st/st-theme-node-private.h |  2 ++
 src/st/st-theme-node.c         | 13 ++++++++-----
 2 files changed, 10 insertions(+), 5 deletions(-)
---
diff --git a/src/st/st-theme-node-private.h b/src/st/st-theme-node-private.h
index 2e6b232f6..47be65dba 100644
--- a/src/st/st-theme-node-private.h
+++ b/src/st/st-theme-node-private.h
@@ -107,6 +107,8 @@ struct _StThemeNode {
   int box_shadow_min_width;
   int box_shadow_min_height;
 
+  guint stylesheets_changed_id;
+
   CoglPipeline *border_slices_texture;
   CoglPipeline *border_slices_pipeline;
   CoglPipeline *background_texture;
diff --git a/src/st/st-theme-node.c b/src/st/st-theme-node.c
index 8a6ebf03f..8e910f831 100644
--- a/src/st/st-theme-node.c
+++ b/src/st/st-theme-node.c
@@ -111,9 +111,11 @@ st_theme_node_dispose (GObject *gobject)
       node->icon_colors = NULL;
     }
 
-  if (node->theme)
-    g_signal_handlers_disconnect_by_func (node->theme,
-                                          on_custom_stylesheets_changed, node);
+  if (node->theme && node->stylesheets_changed_id)
+    {
+      g_signal_handler_disconnect (node->theme, node->stylesheets_changed_id);
+      node->stylesheets_changed_id = 0;
+    }
 
   st_theme_node_paint_state_free (&node->cached_state);
 
@@ -230,8 +232,9 @@ st_theme_node_new (StThemeContext    *context,
   if (theme != NULL)
     {
       node->theme = g_object_ref (theme);
-      g_signal_connect (node->theme, "custom-stylesheets-changed",
-                        G_CALLBACK (on_custom_stylesheets_changed), node);
+      node->stylesheets_changed_id =
+        g_signal_connect (node->theme, "custom-stylesheets-changed",
+                          G_CALLBACK (on_custom_stylesheets_changed), node);
     }
 
   node->element_type = element_type;


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