diff --git a/direct/src/showbase/Messenger.py b/direct/src/showbase/Messenger.py index a0a3f9c817..68fad09c78 100644 --- a/direct/src/showbase/Messenger.py +++ b/direct/src/showbase/Messenger.py @@ -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()