From: Mike C. F. <mcf...@us...> - 2004-10-18 04:09:43
|
Update of /cvsroot/pydispatcher/dispatch In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21885 Modified Files: dispatcher.py Log Message: Fix memory leaks stemming from the registration and cleanup of receivers which are deleted. Index: dispatcher.py =================================================================== RCS file: /cvsroot/pydispatcher/dispatch/dispatcher.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** dispatcher.py 18 Feb 2004 00:29:46 -0000 1.6 --- dispatcher.py 18 Oct 2004 04:09:32 -0000 1.7 *************** *** 138,162 **** 'Signal cannot be None (receiver=%r sender=%r)'%( receiver,sender) ) ! receiverID = id( receiver ) ! if weak: receiver = saferef.safeRef(receiver, onDelete=_removeReceiver) senderkey = id(sender) - signals = {} if connections.has_key(senderkey): signals = connections[senderkey] else: ! connections[senderkey] = signals ! # Keep track of senders for cleanup. ! # Is Anonymous something we want to clean up? ! if sender not in (None, Anonymous, Any): ! def remove(object, senderkey=senderkey): ! _removeSender(senderkey=senderkey) ! # Skip objects that can not be weakly referenced, which means ! # they won't be automatically cleaned up, but that's too bad. ! try: ! weakSender = weakref.ref(sender, remove) ! senders[senderkey] = weakSender ! sendersBack.setdefault(receiverID,[]).append(senderkey) ! except: ! pass receivers = [] if signals.has_key(signal): --- 138,168 ---- 'Signal cannot be None (receiver=%r sender=%r)'%( receiver,sender) ) ! if weak: ! receiver = saferef.safeRef(receiver, onDelete=_removeReceiver) senderkey = id(sender) if connections.has_key(senderkey): signals = connections[senderkey] else: ! connections[senderkey] = signals = {} ! # Keep track of senders for cleanup. ! # Is Anonymous something we want to clean up? ! if sender not in (None, Anonymous, Any): ! def remove(object, senderkey=senderkey): ! _removeSender(senderkey=senderkey) ! # Skip objects that can not be weakly referenced, which means ! # they won't be automatically cleaned up, but that's too bad. ! try: ! weakSender = weakref.ref(sender, remove) ! senders[senderkey] = weakSender ! except: ! pass ! try: ! receiverID = id(receiver) ! current = sendersBack.get( receiverID ) ! if current is None: ! sendersBack[ receiverID ] = current = [] ! current.append(senderkey) ! except: ! pass receivers = [] if signals.has_key(signal): *************** *** 164,169 **** else: signals[signal] = receivers ! try: receivers.remove(receiver) ! except ValueError: pass receivers.append(receiver) --- 170,177 ---- else: signals[signal] = receivers ! try: ! receivers.remove(receiver) ! except ValueError: ! pass receivers.append(receiver) *************** *** 362,366 **** for senderkey in sendersBack.get(backKey,()): try: ! for signal in connections[senderkey].keys(): try: receivers = connections[senderkey][signal] --- 370,378 ---- for senderkey in sendersBack.get(backKey,()): try: ! signals = connections[senderkey].keys() ! except KeyError,err: ! pass ! else: ! for signal in signals: try: receivers = connections[senderkey][signal] *************** *** 368,376 **** pass else: ! try: receivers.remove(receiver) ! except: pass _cleanupConnections(senderkey, signal) ! except KeyError: ! pass def _cleanupConnections(senderkey, signal): --- 380,392 ---- pass else: ! try: ! receivers.remove( receiver ) ! except Exception, err: ! pass _cleanupConnections(senderkey, signal) ! try: ! del sendersBack[ backKey ] ! except KeyError: ! pass def _cleanupConnections(senderkey, signal): *************** *** 392,396 **** # No more signal connections. Therefore, remove the sender. _removeSender(senderkey) ! def _removeSender(senderkey): """Remove senderkey from connections.""" --- 408,412 ---- # No more signal connections. Therefore, remove the sender. _removeSender(senderkey) ! def _removeSender(senderkey): """Remove senderkey from connections.""" *************** *** 404,406 **** except: pass - \ No newline at end of file --- 420,421 ---- |