diff options
author | Mike Gorse <mgorse@novell.com> | 2011-08-15 14:22:02 -0500 |
---|---|---|
committer | Mike Gorse <mgorse@novell.com> | 2011-08-15 14:22:02 -0500 |
commit | a1a316d1ef4167dbca147bc3477ed22305c83743 (patch) | |
tree | 1cc5075eba5489aeb0b04d15515c2c13d8697c1d /atk-adaptor/accessible-register.c | |
parent | 8c08a7600a39a10e5d1e6dc0c22a5ae196bce823 (diff) | |
download | at-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.c | 29 |
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 |