diff options
author | Padraig O'Briain <padraig.obriain@sun.com> | 2003-11-03 14:38:23 +0000 |
---|---|---|
committer | Padraig O'Briain <padraigo@src.gnome.org> | 2003-11-03 14:38:23 +0000 |
commit | 4459bc29f32ecbcddbde5d282f8e14d1fea4e863 (patch) | |
tree | f76ab7a3a431acb92ba12704f5679878c51d4f2a | |
parent | 2e06ea9c9cbbf0d873a684f6ee3827c7ae058bc2 (diff) | |
download | atk-4459bc29f32ecbcddbde5d282f8e14d1fea4e863.tar.gz |
Use weak references for objects in a relation instead of object references
2003-11-03 Padraig O'Briain <padraig.obriain@sun.com>
* atk/atkrelation.c: Use weak references for objects in a relation
instead of object references so that objects are not leaked when
corresponding widgets are destroyed.
This fixes bug #125725.
-rw-r--r-- | ChangeLog | 10 | ||||
-rwxr-xr-x | atk/atkrelation.c | 22 |
2 files changed, 26 insertions, 6 deletions
@@ -1,8 +1,16 @@ +2003-11-03 Padraig O'Briain <padraig.obriain@sun.com> + + * atk/atkrelation.c: Use weak references for objects in a relation + instead of object references so that objects are not leaked when + corresponding widgets are destroyed. + + This fixes bug #125725. + 2003-10-31 Padraig O'Briain <padraig.obriain@sun.com> * configure.in: Add reference to docs/version.xml - Shopuld have been done in previous commit but was omitted. + Should have been done in previous commit but was omitted. Fixes build break reported in bugs #1258548 and #125902. 2003-10-29 Padraig O'Briain <padraig.obriain@sun.com> diff --git a/atk/atkrelation.c b/atk/atkrelation.c index 544804b..8c8cda2 100755 --- a/atk/atkrelation.c +++ b/atk/atkrelation.c @@ -246,6 +246,7 @@ atk_relation_new (AtkObject **targets, g_value_init (value, ATK_TYPE_OBJECT); g_value_set_object (value, targets[i]); array = g_value_array_append (array, value); + g_value_unset (value); g_free (value); } @@ -292,6 +293,18 @@ atk_relation_get_target (AtkRelation *relation) } static void +delete_object_while_in_relation (gpointer callback_data, + GObject *where_the_object_was) +{ + GPtrArray *array; + + g_assert (callback_data != NULL); + + array = callback_data; + g_ptr_array_remove (array, where_the_object_was); +} + +static void atk_relation_finalize (GObject *object) { AtkRelation *relation; @@ -306,10 +319,9 @@ atk_relation_finalize (GObject *object) for (i = 0; i < relation->target->len; i++) { - /* - * Remove a reference to AtkObject being removed from a relation - */ - g_object_unref (g_ptr_array_index (relation->target, i)); + g_object_weak_unref (G_OBJECT (g_ptr_array_index (relation->target, i)), + (GWeakNotify) delete_object_while_in_relation, + relation->target); } g_ptr_array_free (relation->target, TRUE); } @@ -381,8 +393,8 @@ atk_relation_get_ptr_array_from_value_array (GValueArray *array) { value = g_value_array_get_nth (array, i); obj = g_value_get_object (value); - g_object_ref (obj); g_ptr_array_add (return_array, obj); + g_object_weak_ref (obj, (GWeakNotify) delete_object_while_in_relation, return_array); } return return_array; |