GtkTextTag still not unreferenced properly
- From: Jeff Franks <jcf tpg com au>
- To: gtk-devel-list gnome org
- Subject: GtkTextTag still not unreferenced properly
- Date: Tue, 02 Apr 2002 15:07:00 +1000
Hi,
Sorry, this was the message I meant to send.
Havoc, do you remember my previous message about GtkTextTag not being
unreferenced properly:
When a GtkTextBuffer is finalized it unreferences its GtkTextTagTable.
When the GtkTextTagTable is finalized it calls the following line of code:
gtk_text_tag_table_foreach (table, foreach_unref, NULL);
which unreferences each tag in the table. At the start of this
function a tag has a reference count of 2 and after being unreferenced
it still has a reference count of 1. When you apply a tag the
'gtk_text_buffer_real_apply_tag()' function gets called. This calls
'_gtk_text_btree_tag()" which inturn calls
'gtk_text_btree_get_tag_info()' which increases the reference count of
a tag. Searching through the source code I couldn't find any where
that the tag gets unreferenced again, except for 'foreach_unref()' in
GtkTextTagTable. When I removed the line that increases the reference
count I found that GtkTextBuffer, GtkTextTagTable and GtkTextTag still
worked properly.
You added the following lines of code to the 'foreach_unref' function in
gtktexttagtable.c
tmp = tag->table->buffers;
while (tmp != NULL)
{
_gtk_text_buffer_notify_will_remove_tag (GTK_TEXT_BUFFER (tmp->data), tag);
tmp = tmp->next;
}
This should have fixed the problem because
_gtk_text_buffer_notify_will_remove_tag() results in
gtk_text_btree_remove_tag_info() being called which removes the
reference added by gtk_text_btree_get_tag_info(), but it didn't. Going
through the code again I noticed that tag->table->buffers is always
NULL. Looking at the code from gtk_text_buffer_finalize():
if (buffer->tag_table)
{
_gtk_text_tag_table_remove_buffer (buffer->tag_table, buffer);
g_object_unref (G_OBJECT (buffer->tag_table));
buffer->tag_table = NULL;
}
I noticed that the buffer is removed from the tag_table before the
tag_table is unreferenced and its finalization code run. When a
tag_table has only one buffer tag->table->buffers will always be NULL. I
did try to find a way around this problem but couldn't.
Jeff.
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]