bug fixes and memory leak fixes

This commit is contained in:
Darren Ranalli 2009-05-27 21:06:09 +00:00
parent 36dbe8c093
commit 2deb24b233

View File

@ -30,9 +30,12 @@ class Messenger:
Or, for an example with more real data:
{'mouseDown': {avatar: [avatar.jump, [2.0], 1]}}
"""
# eventName->objMsgrId->callbackInfo
self.__callbacks = {}
# objMsgrId->set(eventName)
self.__objectEvents = {}
self._messengerIdGen = 0
# objMsgrId->listenerObject
self._id2object = {}
# A mapping of taskChain -> eventList, used for sending events
@ -61,10 +64,10 @@ class Messenger:
# accept/ignore more than once over their lifetime)
# get unique messenger id for this object
# assumes lock is held.
if not hasattr(object, '_messengerId'):
object._messengerId = (object.__class__.__name__, self._messengerIdGen)
if not hasattr(object, '_MSGRmessengerId'):
object._MSGRmessengerId = (object.__class__.__name__, self._messengerIdGen)
self._messengerIdGen += 1
return object._messengerId
return object._MSGRmessengerId
def _storeObject(self, object):
# store reference-counted reference to object in case we need to
@ -149,14 +152,14 @@ class Messenger:
self.notify.warning(
"object: %s accept: \"%s\" new callback: %s() supplanting old callback: %s()" %
(object.__class__.__name__, safeRepr(event), method.__name__, oldMethod.__name__))
else:
self._storeObject(object)
acceptorDict[id] = [method, extraArgs, persistent]
# Remember that this object is listening for this event
eventDict = self.__objectEvents.setdefault(id, {})
eventDict.setdefault(event, None)
if event not in eventDict:
self._storeObject(object)
eventDict[event] = None
finally:
self.lock.release()
@ -219,7 +222,7 @@ class Messenger:
# entry from the Messenger alltogether
if (len(acceptorDict) == 0):
del self.__callbacks[event]
self._releaseObject(object)
self._releaseObject(object)
del self.__objectEvents[id]
finally:
self.lock.release()
@ -343,7 +346,8 @@ class Messenger:
del eventDict[event]
if (len(eventDict) == 0):
del self.__objectEvents[id]
self._releaseObject(self._getObject(id))
del acceptorDict[id]
# If the dictionary at this event is now empty, remove
# the event entry from the Messenger altogether
@ -384,6 +388,7 @@ class Messenger:
try:
self.__callbacks.clear()
self.__objectEvents.clear()
self._id2object.clear()
finally:
self.lock.release()