I would like to submit a patch for the memory leak problem but am still quite a newbie at all of this and am not sure how to go about it ?
Thanks,
Liza
--- Begin Message --- Thanks Christian. I added the following few Py_XDECREF lines to gtk/gtktreeview.override and the fix took care of the memory leak I was seeing before:

pytreecolumn = pygobject_new((GObject *)tree_column);
pycell = pygobject_new((GObject *)cell);
pytreemodel = pygobject_new((GObject *)tree_model);
pyiter = pyg_boxed_new(GTK_TYPE_TREE_ITER, iter, TRUE, TRUE);

if (cunote->data)
retobj = PyEval_CallFunction(cunote->func, "(OOOOO)", pytreecolumn, pycell, pytreemodel, pyiter, cunote->data);
else
retobj = PyEval_CallFunction(cunote->func, "(OOOO)", pytreecolumn, pycell, pytreemodel, pyiter);


Py_XDECREF(pytreecolumn);
Py_XDECREF(pycell);
Py_XDECREF(pytreemodel);
Py_XDECREF(pyiter);

Thanks again for your help.
Liza

Christian Robottom Reis wrote:

On Tue, Feb 10, 2004 at 04:04:02PM -0600, Liza Klerck wrote:


I am seeing a significant memory leak when using the set_cell_data_func() method of a gtk.TreeViewColumn. I have included an example program that illustrates the problem, I am using python2.3 on


It would be best to file this (great) summary in bugzilla.gnome.org so it doesn't get lost. I'd suggest, if you have a bit more time, trimming down the testcase to the bare minimum so it's easier to isolate the problem.



Each time the rendering function (renderFunc) is called the memory usage increases, even when the rendering function executes no code. When I commend out the call to set_cell_data_func() the memory leak does not occur.



If you have the time, take a look at gtk/gtktreeview.override in the pygtk source code. In particular, I've noticed that the wrapper for set_cell_data_func creates four (AFAICS, temporary?) objects for each call to the function:

   pytreecolumn = pygobject_new((GObject *)tree_column);
   pycell = pygobject_new((GObject *)cell);
   pytreemodel = pygobject_new((GObject *)tree_model);
   pyiter = pyg_boxed_new(GTK_TYPE_TREE_ITER, iter,
                          TRUE, TRUE);
   if (cunote->data)
       retobj = PyEval_CallFunction(cunote->func, "(OOOOO)",
                                    pytreecolumn, pycell,
                                    pytreemodel, pyiter, cunote->data);
   else
       retobj = PyEval_CallFunction(cunote->func, "(OOOO)",
                                    pytreecolumn, pycell,
                                    pytreemodel, pyiter);

The fact that they aren't destroyed nor referenced after the function
exists is suggestive to me, but I can't debug or build at the moment, so
if you could help out the debugging it would be really appreciated.

Johan, do you think we're leaking these objects?

Take care,
--
Christian Robottom Reis | http://async.com.br/~kiko/ | [+55 16] 261 2331





--- End Message ---
_______________________________________________
pygtk mailing list   [EMAIL PROTECTED]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/

Reply via email to