[Python-Dev] safety of Py_CLEAR and self (original) (raw)

Jeremy Hylton jeremy at alum.mit.edu
Mon Feb 12 19:04:21 CET 2007


On 2/12/07, Guido van Rossum <guido at python.org> wrote:

Looking for where tpclear() is being called, the only caller is line 713 in gmodule.c, which explicitly surrounds the call with an INCREF/DECREF pair. Perhaps that's the clue you're looking for?

Yes, of course. The INCREF guarantees that the object can't be collected until the tp_clear() returns. Thanks.

Jeremy

--Guido On 2/12/07, Jeremy Hylton <jeremy at alum.mit.edu> wrote: > I was wondering today how I could convince myself that a sequence of > PyCLEAR() calls in a tpclear function was safe. Take for example a > really trivial sequence of code on frameclear(): > > PyCLEAR(f->fexctype); > PyCLEAR(f->fexcvalue); > PyCLEAR(f->fexctraceback); > PyCLEAR(f->ftrace); > > We use PyCLEAR() so that multiple calls to frameclear() are safe. > The first time this runs it sets exctype to NULL before calling > DECREF. This guarantees that a subsequent frameclear() or > framedealloc() won't attempt to DECREF it a second time. I think I > understand why that's desireable and why it works. The primary risk > is that via DECREF we may execute an arbitrary amount of Python code > via weakref callbacks, finalizers, and code in other threads that gets > resumed while the callbacks and finalizers are running. > > My question, specifically, then: Why it is safe to assume that f > doesn't point to trash after a particular call to PyCLEAR()? Any > particular call to PyCLEAR() could break the cycle that the object is > involved in an lead to a call to framedealloc(). The frame could get > returned to an obmalloc pool, returned to the OS, or just re-used by > another object before we get back to PyCLEAR(). It seems like such > behavior would be exceedingly unlikely, but I can't convince myself > that it is impossible. Which is it: improbable or impossible? If it > is only improbable, should we figure out how to write code that is > safe against such an improbable event? > > Jeremy _> ________________________ > Python-Dev mailing list > Python-Dev at python.org > http://mail.python.org/mailman/listinfo/python-dev > Unsubscribe: http://mail.python.org/mailman/options/python-dev/guido%40python.org >

-- --Guido van Rossum (home page: http://www.python.org/~guido/)



More information about the Python-Dev mailing list