Greg Ewing wrote:
>>>         # Use closure to get at weakref to allow direct invocation
>>>         # This creates a cycle, so this approach relies on cyclic GC
>>>         # to clean up the finalizer objects!
> 
> This implementation is broken. There's no need
> to create any such cycle.

I know, but it was late and my brain wasn't up to the job of getting rid of it 
:)

Here's a pretty easy way to fix it to avoid relying on the cyclic GC (actually 
based on your other message about explicitly breaking the cycle when the 
finalizer is invoked):

_finalizer_refs = set()
def finalizer(*args, **kwds):
      """Create a finalizer from an object, callback and keyword dictionary"""
      # Use positional args and a closure to avoid namespace collisions
      obj, callback = args
      def _finalizer(_ref=None):
          """Callable that invokes the finalization callback"""
          # Use closure to get at weakref to allow direct invocation
          try:
              ref = boxed_ref.pop()
          except IndexError:
              pass
          else:
              _finalizer_refs.remove(ref)
              callback(_finalizer)
      # Give callback access to keyword arguments
      _finalizer.__dict__ = kwds
      boxed_ref = [weakref.ref(obj, _finalizer)]
      _finalizer_refs.add(boxed_ref[0])
      return _finalizer

Cheers,
Nick.

-- 
Nick Coghlan   |   [EMAIL PROTECTED]   |   Brisbane, Australia
---------------------------------------------------------------
             http://www.boredomandlaziness.org
_______________________________________________
Python-3000 mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-3000
Unsubscribe: 
http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com

Reply via email to