mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-02 09:52:27 -04:00
bug fixes and memory leak fixes
This commit is contained in:
parent
36dbe8c093
commit
2deb24b233
@ -30,9 +30,12 @@ class Messenger:
|
|||||||
Or, for an example with more real data:
|
Or, for an example with more real data:
|
||||||
{'mouseDown': {avatar: [avatar.jump, [2.0], 1]}}
|
{'mouseDown': {avatar: [avatar.jump, [2.0], 1]}}
|
||||||
"""
|
"""
|
||||||
|
# eventName->objMsgrId->callbackInfo
|
||||||
self.__callbacks = {}
|
self.__callbacks = {}
|
||||||
|
# objMsgrId->set(eventName)
|
||||||
self.__objectEvents = {}
|
self.__objectEvents = {}
|
||||||
self._messengerIdGen = 0
|
self._messengerIdGen = 0
|
||||||
|
# objMsgrId->listenerObject
|
||||||
self._id2object = {}
|
self._id2object = {}
|
||||||
|
|
||||||
# A mapping of taskChain -> eventList, used for sending events
|
# A mapping of taskChain -> eventList, used for sending events
|
||||||
@ -61,10 +64,10 @@ class Messenger:
|
|||||||
# accept/ignore more than once over their lifetime)
|
# accept/ignore more than once over their lifetime)
|
||||||
# get unique messenger id for this object
|
# get unique messenger id for this object
|
||||||
# assumes lock is held.
|
# assumes lock is held.
|
||||||
if not hasattr(object, '_messengerId'):
|
if not hasattr(object, '_MSGRmessengerId'):
|
||||||
object._messengerId = (object.__class__.__name__, self._messengerIdGen)
|
object._MSGRmessengerId = (object.__class__.__name__, self._messengerIdGen)
|
||||||
self._messengerIdGen += 1
|
self._messengerIdGen += 1
|
||||||
return object._messengerId
|
return object._MSGRmessengerId
|
||||||
|
|
||||||
def _storeObject(self, object):
|
def _storeObject(self, object):
|
||||||
# store reference-counted reference to object in case we need to
|
# store reference-counted reference to object in case we need to
|
||||||
@ -149,14 +152,14 @@ class Messenger:
|
|||||||
self.notify.warning(
|
self.notify.warning(
|
||||||
"object: %s accept: \"%s\" new callback: %s() supplanting old callback: %s()" %
|
"object: %s accept: \"%s\" new callback: %s() supplanting old callback: %s()" %
|
||||||
(object.__class__.__name__, safeRepr(event), method.__name__, oldMethod.__name__))
|
(object.__class__.__name__, safeRepr(event), method.__name__, oldMethod.__name__))
|
||||||
else:
|
|
||||||
self._storeObject(object)
|
|
||||||
|
|
||||||
acceptorDict[id] = [method, extraArgs, persistent]
|
acceptorDict[id] = [method, extraArgs, persistent]
|
||||||
|
|
||||||
# Remember that this object is listening for this event
|
# Remember that this object is listening for this event
|
||||||
eventDict = self.__objectEvents.setdefault(id, {})
|
eventDict = self.__objectEvents.setdefault(id, {})
|
||||||
eventDict.setdefault(event, None)
|
if event not in eventDict:
|
||||||
|
self._storeObject(object)
|
||||||
|
eventDict[event] = None
|
||||||
finally:
|
finally:
|
||||||
self.lock.release()
|
self.lock.release()
|
||||||
|
|
||||||
@ -219,7 +222,7 @@ class Messenger:
|
|||||||
# entry from the Messenger alltogether
|
# entry from the Messenger alltogether
|
||||||
if (len(acceptorDict) == 0):
|
if (len(acceptorDict) == 0):
|
||||||
del self.__callbacks[event]
|
del self.__callbacks[event]
|
||||||
self._releaseObject(object)
|
self._releaseObject(object)
|
||||||
del self.__objectEvents[id]
|
del self.__objectEvents[id]
|
||||||
finally:
|
finally:
|
||||||
self.lock.release()
|
self.lock.release()
|
||||||
@ -343,6 +346,7 @@ class Messenger:
|
|||||||
del eventDict[event]
|
del eventDict[event]
|
||||||
if (len(eventDict) == 0):
|
if (len(eventDict) == 0):
|
||||||
del self.__objectEvents[id]
|
del self.__objectEvents[id]
|
||||||
|
self._releaseObject(self._getObject(id))
|
||||||
|
|
||||||
del acceptorDict[id]
|
del acceptorDict[id]
|
||||||
# If the dictionary at this event is now empty, remove
|
# If the dictionary at this event is now empty, remove
|
||||||
@ -384,6 +388,7 @@ class Messenger:
|
|||||||
try:
|
try:
|
||||||
self.__callbacks.clear()
|
self.__callbacks.clear()
|
||||||
self.__objectEvents.clear()
|
self.__objectEvents.clear()
|
||||||
|
self._id2object.clear()
|
||||||
finally:
|
finally:
|
||||||
self.lock.release()
|
self.lock.release()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user