Changeset 333

Show
Ignore:
Timestamp:
08/28/06 15:01:03 (2 years ago)
Author:
mj
Message:

The debugger can register both a remote-attach listener socket as well as a client socket when connected; deal with multiple sockets and clean up closing code and detection

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • z3wingdbg/trunk/debugger/twistedmainloop.py

    r332 r333  
    2929    def startReading(self): 
    3030        """Start waiting for read availability.""" 
    31         if getattr(self, 'reactor', None): 
    32             self.reactor.addReader(self) 
     31        self.reactor.addReader(self) 
    3332         
    3433    def stopReading(self): 
    3534        """Stop waiting for read availability""" 
    36         if getattr(self, 'reactor', None): 
    37             self.reactor.removeReader(self) 
     35        self.reactor.removeReader(self) 
    3836         
    3937    def logPrefix(self): 
     
    4644         
    4745    def close(self): 
     46        del self.socket 
    4847        self.stopReading() 
    49         for attr in ('socket', 'reactor', 'callback'): 
    50             try: 
    51                 delattr(self, attr) 
    52             except AttributeError: 
    53                 pass 
    5448         
    5549    def doRead(self): 
    56         if not self.fileno
     50        if not self.socket
    5751            return 
    5852        # Stop polling until the debug thread has dealt with us 
     
    6357    def debugThreadCallback(self): 
    6458        # Called in debug thread. Call callback and resume polling 
    65         if not self.fileno
     59        if not self.socket
    6660            return 
    6761        self.log.debug('In debug thread, dispatching callback') 
     
    6963        self.startReading() 
    7064        # Wake up the reactor now that we are reading again 
    71         if getattr(self, 'reactor', None): 
    72             self.reactor.wakeUp() 
     65        self.reactor.wakeUp() 
    7366 
    7467class WingDebuggerClientSocketHook(object): 
     
    7972     
    8073    """ 
    81     descriptor = None 
     74    descriptors = None 
    8275     
    8376    def __init__(self): 
    8477        self.log = logging.getLogger('z3wingdbg.debugger.twistedmainloop') 
     78        self.descriptors = {} 
    8579         
    8680    def _Setup(self, ignored, socket, callback): 
     
    8983     
    9084    def _RegisterSocket(self, socket, callback): 
    91         self.log.debug('Registering client socket %s callback with twisted',   
    92                        socket.getsockname()) 
    93         self.descriptor = WingDebuggerClientSocketDescriptor(socket, callback) 
     85        self.log.debug( 
     86            'Registering client socket %s, #%x callback with twisted',   
     87            socket.getsockname(), id(socket)) 
     88        descriptor = WingDebuggerClientSocketDescriptor(socket, callback) 
     89        self.descriptors[id(socket)] = descriptor 
    9490        return socket 
    9591     
    9692    def _UnregisterSocket(self, socket): 
    97         self.log.debug('Removing wrapped socket from twisted') 
    98         if self.descriptor: 
    99             self.descriptor.close() 
    100             self.descriptor = None 
     93        self.log.debug('Removing wrapped socket #%x from twisted' % id(socket)) 
     94        descriptor = self.descriptors.get(id(socket)) 
     95        if descriptor: 
     96            del self.descriptors[id(socket)] 
     97            descriptor.close() 
    10198     
    10299def handleDebugServerStart(event):