Update of /cvsroot/freevo/kaa/base/src/notifier
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv868
Modified Files:
callback.py
Log Message:
For Signal and WeakrefCallback, handle the case where weakrefs to user
args become invalid. For Signals, automatically disconnect the callback,
for WeakNotifierCallback, automatically call unregister.
Index: callback.py
===================================================================
RCS file: /cvsroot/freevo/kaa/base/src/notifier/callback.py,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** callback.py 14 Jul 2005 00:11:52 -0000 1.6
--- callback.py 14 Jul 2005 00:35:44 -0000 1.7
***************
*** 71,84 ****
! def weakref_data(data):
if type(data) in (str, int, long, types.NoneType):
# Naive optimization for common immutable cases.
return data
elif type(data) == types.MethodType:
! return WeakCallback(data)
elif type(data) in (list, tuple):
d = []
for item in data:
! d.append(weakref_data(item))
if type(data) == tuple:
d = tuple(d)
--- 71,87 ----
! def weakref_data(data, destroy_cb = None):
if type(data) in (str, int, long, types.NoneType):
# Naive optimization for common immutable cases.
return data
elif type(data) == types.MethodType:
! cb = WeakCallback(data)
! if destroy_cb:
! cb.set_weakref_destroy_cb(destroy_cb)
! return cb
elif type(data) in (list, tuple):
d = []
for item in data:
! d.append(weakref_data(item, destroy_cb))
if type(data) == tuple:
d = tuple(d)
***************
*** 87,94 ****
d = {}
for key, val in data.items():
! d[weakref_data(key)] = weakref_data(val)
return d
elif type(data) != types.FunctionType:
try:
return _weakref.ref(data)
except TypeError:
--- 90,100 ----
d = {}
for key, val in data.items():
! d[weakref_data(key)] = weakref_data(val, destroy_cb)
return d
elif type(data) != types.FunctionType:
+ print "DESTROY CB", data, destroy_cb
try:
+ if destroy_cb:
+ return _weakref.ref(data, destroy_cb)
return _weakref.ref(data)
except TypeError:
***************
*** 266,271 ****
self._instance = None
! self._args = weakref_data(args)
! self._kwargs = weakref_data(kwargs)
self._weakref_destroyed_user_cb = None
--- 272,277 ----
self._instance = None
! self._args = weakref_data(args, self._weakref_destroyed)
! self._kwargs = weakref_data(kwargs, self._weakref_destroyed)
self._weakref_destroyed_user_cb = None
***************
*** 298,302 ****
def _weakref_destroyed(self, object):
! if self._weakref_destroyed_user_cb:
return self._weakref_destroyed_user_cb(self, object)
--- 304,308 ----
def _weakref_destroyed(self, object):
! if self and self._weakref_destroyed_user_cb:
return self._weakref_destroyed_user_cb(self, object)
***************
*** 306,311 ****
def _weakref_destroyed(self, object):
! super(WeakNotifierCallback, self)._weakref_destroyed(object)
! self.unregister()
--- 312,318 ----
def _weakref_destroyed(self, object):
! if WeakNotifierCallback and self:
! super(WeakNotifierCallback, self)._weakref_destroyed(object)
! self.unregister()
***************
*** 354,358 ****
callback = WeakCallback(callback)
callback.set_weakref_destroyed_cb(self._weakref_destroyed)
! args, kwargs = weakref_data(args), weakref_data(kwargs)
if pos == -1:
pos = len(self._callbacks)
--- 361,370 ----
callback = WeakCallback(callback)
callback.set_weakref_destroyed_cb(self._weakref_destroyed)
!
! # We create a callback for weakref destruction for user data
! # as well.
! data_cb = Callback(self._weakref_destroyed, callback)
! data_cb.set_user_args_first()
! args, kwargs = weakref_data(args, data_cb), weakref_data(kwargs,
data_cb)
if pos == -1:
pos = len(self._callbacks)
***************
*** 434,438 ****
def _weakref_destroyed(self, callback, weakref):
! self._disconnect(callback, None, None)
--- 446,451 ----
def _weakref_destroyed(self, callback, weakref):
! if Signal and self:
! self._disconnect(callback, None, None)
-------------------------------------------------------
This SF.Net email is sponsored by the 'Do More With Dual!' webinar happening
July 14 at 8am PDT/11am EDT. We invite you to explore the latest in dual
core and dual graphics technology at this free one hour event hosted by HP,
AMD, and NVIDIA. To register visit http://www.hp.com/go/dualwebinar
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog