Fix lifecycle of an accessible's cache
authorMike Gorse <mgorse@suse.com>
Sat, 19 Jul 2014 21:26:52 +0000 (16:26 -0500)
committerMike Gorse <mgorse@suse.com>
Sat, 19 Jul 2014 21:26:52 +0000 (16:26 -0500)
When a cache is referenced in response to an event, it is supposed
to be unref'd after the event handler has been called.

atspi/atspi-accessible.c
atspi/atspi-event-listener.c
atspi/atspi-misc-private.h
atspi/atspi-misc.c

index 23aad90..b294a5d 100644 (file)
@@ -190,7 +190,8 @@ atspi_accessible_finalize (GObject *object)
   if (accessible->attributes)
     g_hash_table_unref (accessible->attributes);
 
-    _atspi_accessible_unref_cache (accessible);
+    if (accessible->priv->cache)
+      g_hash_table_destroy (accessible->priv->cache);
 
 #ifdef DEBUG_REF_COUNTS
   accessible_count--;
index 09ccfd3..292e88b 100644 (file)
@@ -1038,7 +1038,7 @@ _atspi_dbus_handle_event (DBusConnection *bus, DBusMessage *message, void *data)
   if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_ARRAY)
   {
     /* new form -- parse properties sent with event */
-    _atspi_dbus_update_cache_from_dict (e.source, &iter);
+    cache = _atspi_dbus_update_cache_from_dict (e.source, &iter);
   }
 
   if (!strncmp (e.type, "object:children-changed", 23))
index cd472b0..fe5ca56 100644 (file)
@@ -159,7 +159,7 @@ GHashTable *_atspi_get_live_refs ();
 
 gchar *_atspi_name_compat (gchar *in);
 
-void _atspi_dbus_update_cache_from_dict (AtspiAccessible *accessible, DBusMessageIter *iter);
+GHashTable *_atspi_dbus_update_cache_from_dict (AtspiAccessible *accessible, DBusMessageIter *iter);
 
 gboolean _atspi_get_allow_sync ();
 
index 0492b3f..f698544 100644 (file)
@@ -1705,7 +1705,7 @@ atspi_role_get_name (AtspiRole role)
   return NULL;
 }
 
-void
+GHashTable *
 _atspi_dbus_update_cache_from_dict (AtspiAccessible *accessible, DBusMessageIter *iter)
 {
   GHashTable *cache = _atspi_accessible_ref_cache (accessible);
@@ -1768,6 +1768,8 @@ _atspi_dbus_update_cache_from_dict (AtspiAccessible *accessible, DBusMessageIter
       g_hash_table_insert (cache, g_strdup (key), val); 
     dbus_message_iter_next (&iter_dict);
   }
+
+  return cache;
 }
 
 gboolean