Only add items to the cache on children-changed if they are passed in
authorMike Gorse <mgorse@suse.com>
Mon, 9 Jul 2012 22:36:26 +0000 (17:36 -0500)
committerMike Gorse <mgorse@suse.com>
Mon, 9 Jul 2012 22:36:26 +0000 (17:36 -0500)
Gtk tree views, for instance, send children-changed signals without passing
an object. If a toolkit does this, then assume that it is doing so because
fetching the object would be expensive, and/or the object is transient, so
just have the cache bypass the signal rather than ref the child in order to
add it. Helps with performance when creating large gtk+ tree views.

https://bugzilla.gnome.org/show_bug.cgi?id=674719

atk-adaptor/accessible-cache.c

index c997b4a..a0922e6 100644 (file)
@@ -321,7 +321,6 @@ child_added_listener (GSignalInvocationHint * signal_hint,
                       const GValue * param_values, gpointer data)
 {
   SpiCache *cache = spi_global_cache;
                       const GValue * param_values, gpointer data)
 {
   SpiCache *cache = spi_global_cache;
-  gboolean child_needs_ref = TRUE;
   AtkObject *accessible;
 
   const gchar *detail = NULL;
   AtkObject *accessible;
 
   const gchar *detail = NULL;
@@ -351,14 +350,13 @@ child_added_listener (GSignalInvocationHint * signal_hint,
           gpointer child;
           int index = g_value_get_uint (param_values + 1);
           child = g_value_get_pointer (param_values + 2);
           gpointer child;
           int index = g_value_get_uint (param_values + 1);
           child = g_value_get_pointer (param_values + 2);
-
-          if (!ATK_IS_OBJECT (child))
+          if (!child)
             {
             {
-              child = atk_object_ref_accessible_child (accessible, index);
-              child_needs_ref = FALSE;
+              g_static_rec_mutex_unlock (&cache_mutex);
+              return;
             }
             }
-          if (child_needs_ref)
-            g_object_ref (child);
+
+          g_object_ref (child);
           g_queue_push_tail (cache->add_traversal, child);
 
           if (cache->add_pending_idle == 0)
           g_queue_push_tail (cache->add_traversal, child);
 
           if (cache->add_pending_idle == 0)