[Zope-dev] Understanding LeakFinder-0.1.1

Tim Peters tim.peters at gmail.com
Wed Jan 12 16:37:56 EST 2005

[Rodrigo Dias Arruda Senra]
> reading LeakFinder's code (version 0.1.1) I was puzzled by:
> """
> if not hasattr(DB, '_lf_real_open'):
>     # Patch DB with a way to block open operations.
>     DB._open_lock = allocate_lock()
>     def open(self, *args, **kw):
>         self._open_lock.acquire()
>         self._open_lock.release()
>         return apply(self._lf_real_open, args, kw)
>     DB._lf_real_open = DB.open
>     DB.open = open
> """
> Inside the  redefined::open(), the lock is acquired and
> released before delegating to the original::open().
> I wonder if:
> 1) That was done intentionally as a _step_on_the_break_ measure
> 2) acquire() or release() cause a desired side effect (despite 1),
>    inside ZODB's inner-sanctum (that eludes me)
> 3) That was not the original intention, where apply() should come
>    between acquire() and release()
> 4) none above (I'd appreciate to learn why)

I'm not familiar with this code (haven't seen it before), but I think
it's clear enough:  elsewhere, getControlledRefcounts() acquires this
lock.  That prevents the patched DB.open() from calling the real
DB.open() until getControlledRefcounts() releases the lock again.  But
I don't see anything to stop getControlledRefcounts() from being
called while any number of other threads are in the midst of the real

More information about the Zope-Dev mailing list