[gdome]Re: reference counting again
- From: Chaoron <chaoron ludens elte hu>
- To: gdome gnome org
- Subject: [gdome]Re: reference counting again
- Date: Thu, 13 Jun 2002 01:00:51 +0200
Again. Let's see the critical iteration!
while ((tmpnode = gdome_n_firstChild(newnode, &exc)) != NULL)
{
g_print("lives: %d\n", gdome_treegc_livenodes(tmpnode));
gdome_n_appendChild(root, tmpnode, &exc);
gdome_n_unref(tmpnode, &exc);
// gdome_n_unref(tmpnode, &exc);
g_print("lives left: %d\n\n", gdome_treegc_livenodes(tmpnode));
}
gdome_n_firstChild() creates the GdomeNode object and also increases
the number of live nodes. As you can see in the output, it's number of
live nodes are 2. Gdome_n_appendChild() also increases the reference
count of tmpnode (and so the no. of live nodes). So that I should
dereference tmpnode two times, if I don't want my program leak memory.
Just try to run the program in memprof, it shows one GdomeNode object
leaks per child. Also you can see the number of livenodes are 2 on each
child at the end of the iteration.
However, dereferencing tmpnode the second time looks also decrease
the reference of it's sibling. It looks correct only for the first
child node: at the end of the iteration the number of live nodes equals
one. But the next node returned by gdome_n_firstChild() only has one
live node, even though nobody wanted to dereference that node.
If you don't use gdome_treegc_livenodes(), the iteration may not
fail, but the heap is become corrupted. For me it returned NULL getting
the document element of new the document.
I also check the real reference count of the (really a)
Gdome_xml_Node object and this behaviour looks like an anomaly for me.
A normal traversal of child nodes is simply the following iteration:
node = gdome_n_firstChild(root, &exc);
while (node != NULL)
{
/* do sg */
save = node;
node = gdome_n_nextSibling(save, &exc);
gdome_n_unref(save, &exc);
}
It's just the same, for a new document: you create a GdomeNode
object by gdome_n_firstChild() and destroy that reference with
gdome_n_unref() (without destroying the xmlNode inside GdomeNode).
Any working solution for this problem? I really need to have a
function creating a new document from any subtree. Some parts are
missing from the example code such as namespace handling and importing
attributes, but I already have code for these.
Daniel
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]