[gnome-shell] st/texture-cache: Move icon theme lookup out of the hot path



commit b51be0e389d92e6b1b444d3134b96c3bfe134bb0
Author: Ivan Molodetskikh <yalterz gmail com>
Date:   Tue Jan 5 16:45:55 2021 +0300

    st/texture-cache: Move icon theme lookup out of the hot path
    
    It was showing up on profile traces over at
    https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1547#note_996417
    After this change it no longer does.
    
    Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1558>

 src/st/st-texture-cache.c | 25 +++++++++++++------------
 1 file changed, 13 insertions(+), 12 deletions(-)
---
diff --git a/src/st/st-texture-cache.c b/src/st/st-texture-cache.c
index 744acd509f..89620706cb 100644
--- a/src/st/st-texture-cache.c
+++ b/src/st/st-texture-cache.c
@@ -974,7 +974,6 @@ st_texture_cache_load_gicon (StTextureCache    *cache,
   g_autofree char *key = NULL;
   float actor_size;
   GtkIconTheme *theme;
-  GtkIconInfo *info;
   StTextureCachePolicy policy;
   StIconColors *colors = NULL;
   StIconStyle icon_style = ST_ICON_STYLE_REQUESTED;
@@ -1014,11 +1013,6 @@ st_texture_cache_load_gicon (StTextureCache    *cache,
     lookup_flags |= GTK_ICON_LOOKUP_DIR_LTR;
 
   scale = ceilf (paint_scale * resource_scale);
-  info = gtk_icon_theme_lookup_by_gicon_for_scale (theme, icon,
-                                                   size, scale,
-                                                   lookup_flags);
-  if (info == NULL)
-    return NULL;
 
   gicon_string = g_icon_to_string (icon);
   /* A return value of NULL indicates that the icon can not be serialized,
@@ -1046,14 +1040,21 @@ st_texture_cache_load_gicon (StTextureCache    *cache,
 
   actor = create_invisible_actor ();
   clutter_actor_set_size (actor, actor_size, actor_size);
-  if (ensure_request (cache, key, policy, &request, actor))
-    {
-      /* If there's an outstanding request, we've just added ourselves to it */
-      g_object_unref (info);
-    }
-  else
+  if (!ensure_request (cache, key, policy, &request, actor))
     {
       /* Else, make a new request */
+      GtkIconInfo *info;
+
+      info = gtk_icon_theme_lookup_by_gicon_for_scale (theme, icon,
+                                                       size, scale,
+                                                       lookup_flags);
+      if (info == NULL)
+        {
+          g_hash_table_remove (cache->priv->outstanding_requests, key);
+          texture_load_data_free (request);
+          g_object_unref (actor);
+          return NULL;
+        }
 
       request->cache = cache;
       /* Transfer ownership of key */


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