On Thu, 2008-02-07 at 14:53 -0500, Kashyap Ashwin wrote:
> I made python print the #refs for alpha and that seems to be increasing
> for no reason. My guess is that it was not decremented after sine_func
> completed. I don't know much about clutter...

the alpha functions never increment the reference count of the alpha
object; the alpha object does not take a reference on the behaviour:
it's the other way around, so there's no reference cycle:

  behaviour
  +---> takes reference on ClutterAlpha
        +----> takes reference on ClutterTimeline

but the GObject side (and, implicitly, the Clutter side) of things is
cleared: there are no circular references to break, and the reference
count is correct.

> class AnimatedLabel():
> 
>     def __init__(self):
>         print 'INIT %s' % self
>         self.label = clutter.Label()
>         self.timeline = clutter.Timeline(duration=1000)
>         self.timeline.set_loop(True)
>         self.alpha = clutter.Alpha(self.timeline, clutter.ramp_func)
>         self.behaviour = clutter.BehaviourDepth(alpha=None,
> depth_start=0, depth_end=200)
>         self.behaviour.apply(self.label)
>         self.timeline.start()
> 
>     def __del__(self):
>         print '#alph:', sys.getrefcount(self.alpha)
>         print '#beh:', sys.getrefcount(self.behaviour)
>         print '#tim:', sys.getrefcount(self.timeline)
>         del self.alpha
>         del self.behaviour
>         print 'DEL %s' % self
> 
> 
> Output:
> INIT <__main__.AnimatedLabel instance at 0xb65cee4c>
> #alph: 481

eeek.

each python wrapper around alpha functions from the clutter module is
nothing more than a glorified function call:

        py_alpha = PyTuple_GetItem (args, 0);
        if (py_alpha &&
            pygobject_check (py_alpha, &PyClutterAlpha_Type))
          {
            alpha = CLUTTER_ALPHA (pygobject_get (py_alpha));
            return PyInt_FromLong (clutter_ramp_func (alpha, NULL));
          }

pygobject_get() does not increase the reference count (last time I
checked), and this is confirmed by the GObject reference count;
PyTuple_GetItem() is defined as:

  PyObject* PyTuple_GetItem(
PyObject *p, Py_ssize_t pos)
          Return value: Borrowed reference.

so it shouldn't increase the python object reference count either. 

> #alph: 2511

again: eeek.

> #beh: 2
> #tim: 2
> 
> 
> Obviously alpha is never freed! BTW if you look at alpha.__grefcount__,
> that seems to be sane (and it does not agree with python ref count only
> for alpha).

this is all very dodgy.

ciao,
 Emmanuele.

-- 
Emmanuele Bassi, OpenedHand Ltd.
Unit R, Homesdale Business Centre
216-218 Homesdale Rd., Bromley - BR12QZ
http://www.o-hand.com

-- 
To unsubscribe send a mail to [EMAIL PROTECTED]

Reply via email to