summaryrefslogtreecommitdiff
path: root/atk-adaptor/accessible-register.c
diff options
context:
space:
mode:
authorMike Gorse <mgorse@novell.com>2011-08-15 14:22:02 -0500
committerMike Gorse <mgorse@novell.com>2011-08-15 14:22:02 -0500
commita1a316d1ef4167dbca147bc3477ed22305c83743 (patch)
tree1cc5075eba5489aeb0b04d15515c2c13d8697c1d /atk-adaptor/accessible-register.c
parent8c08a7600a39a10e5d1e6dc0c22a5ae196bce823 (diff)
downloadat-spi2-atk-a1a316d1ef4167dbca147bc3477ed22305c83743.tar.gz
Fixed some problems when shutting down and restarting the module
If gnome_accessibility_module_shutdown was called and followed by a call to gnome_accessibility_module_init, then things would go awry because of various resources not being freed. Fixed several of these issues, although some issues might remain.
Diffstat (limited to 'atk-adaptor/accessible-register.c')
-rw-r--r--atk-adaptor/accessible-register.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/atk-adaptor/accessible-register.c b/atk-adaptor/accessible-register.c
index 83c1c6d..14f256f 100644
--- a/atk-adaptor/accessible-register.c
+++ b/atk-adaptor/accessible-register.c
@@ -121,11 +121,26 @@ spi_register_init (SpiRegister * reg)
}
static void
+deregister_object (gpointer data, GObject * gobj)
+{
+ SpiRegister *reg = SPI_REGISTER (data);
+
+ spi_register_deregister_object (reg, gobj, FALSE);
+}
+
+static void
+spi_register_remove_weak_ref (gpointer key, gpointer val, gpointer reg)
+{
+ g_object_weak_unref (val, deregister_object, reg);
+}
+
+static void
spi_register_finalize (GObject * object)
{
SpiRegister *reg = SPI_REGISTER (object);
- g_free (reg->ref2ptr);
+ g_hash_table_foreach (reg->ref2ptr, spi_register_remove_weak_ref, reg);
+ g_hash_table_unref (reg->ref2ptr);
G_OBJECT_CLASS (spi_register_parent_class)->finalize (object);
}
@@ -186,16 +201,8 @@ ref_to_path (guint ref)
* Removes the AtkObject from the reference lookup tables, meaning
* it is no longer exposed over D-Bus.
*/
-static void
-deregister_object (gpointer data, GObject * gobj)
-{
- SpiRegister *reg = SPI_REGISTER (data);
-
- spi_register_deregister_object (reg, gobj);
-}
-
void
-spi_register_deregister_object (SpiRegister *reg, GObject *gobj)
+spi_register_deregister_object (SpiRegister *reg, GObject *gobj, gboolean unref)
{
guint ref;
@@ -206,6 +213,8 @@ spi_register_deregister_object (SpiRegister *reg, GObject *gobj)
register_signals [OBJECT_DEREGISTERED],
0,
gobj);
+ if (unref)
+ g_object_weak_unref (gobj, deregister_object, reg);
g_hash_table_remove (reg->ref2ptr, GINT_TO_POINTER (ref));
#ifdef SPI_ATK_DEBUG