[Python-checkins] r47182 - sandbox/trunk/pdb/mconnection.py sandbox/trunk/pdb/mpdb.py

Neal Norwitz nnorwitz at gmail.com
Fri Jun 30 22:45:30 CEST 2006


Note: you probably shouldn't be calling shutdown(), but there is a bug
in 2.5 where this is currently required.

n
--

On 6/30/06, matt.fleming <python-checkins at python.org> wrote:
> Author: matt.fleming
> Date: Fri Jun 30 22:12:21 2006
> New Revision: 47182
>
> Modified:
>    sandbox/trunk/pdb/mconnection.py
>    sandbox/trunk/pdb/mpdb.py
> Log:
> Allow mpdb to use pydb's restart command, both locally and remotely.
>
>
> Modified: sandbox/trunk/pdb/mconnection.py
> ==============================================================================
> --- sandbox/trunk/pdb/mconnection.py    (original)
> +++ sandbox/trunk/pdb/mconnection.py    Fri Jun 30 22:12:21 2006
> @@ -126,7 +126,7 @@
>      def disconnect(self):
>          if self.output is None or self._sock is None:
>              return
> -        self.output.close()
> +        self.output.shutdown(socket.SHUT_RDWR)
>          self._sock.close()
>          self._sock = None
>          self.listening = False
>
> Modified: sandbox/trunk/pdb/mpdb.py
> ==============================================================================
> --- sandbox/trunk/pdb/mpdb.py   (original)
> +++ sandbox/trunk/pdb/mpdb.py   Fri Jun 30 22:12:21 2006
> @@ -111,7 +111,8 @@
>          ret = self.connection.readline()
>          if ret == '':
>              self.errmsg('Connection closed unexpectedly')
> -            raise Exit
> +            self.onecmd = lambda x: pydb.Pdb.onecmd(self, x)
> +            self.do_rquit(None)
>          # The output from the command that we've just sent to the server
>          # is returned along with the prompt of that server. So we keep reading
>          # until we find our prompt.
> @@ -121,14 +122,34 @@
>                  # We're probably _never_ going to get that data and that
>                  # connection is probably dead.
>                  self.errmsg('Connection died unexpectedly')
> -                raise Exit
> +                self.onecmd = lambda x: pydb.Pdb.onecmd(self, x)
> +                self.do_rquit(None)
>              else:
>                  ret += self.connection.readline()
>                  i += 1
> +
> +        # Some 'special' actions must be taken depending on the data returned
> +        if 'restart_now' in ret:
> +            self.connection.write('ACK:restart_now')
> +            self.errmsg('Pdbserver restarting..')
> +            # We've acknowledged a restart, which means that a new pdbserver
> +            # process is started, so we have to connect all over again.
> +            self._disconnect()
> +            time.sleep(3.0)
> +            self.do_target(self.target_addr)
> +            return
>          self.msg_nocr(ret)
>          self.lastcmd = line
>          return
>
> +    def _disconnect(self):
> +        """ Disconnect a connection. """
> +        self.connection.disconnect()
> +        self.connection = None
> +        self.target = 'local'
> +        if hasattr(self, 'local_prompt'):
> +            self.prompt = self.local_prompt
> +
>      def msg_nocr(self, msg, out=None):
>          """Common routine for reporting messages. Derived classes may want
>          to override this to capture output.
> @@ -248,7 +269,7 @@
>              return
>          if self.target == 'remote':
>              self.errmsg('Already connected to a remote machine.')
> -            return
> +            return
>          if target == 'tcp':
>              # TODO: need to save state of current debug session
>              if self.connection: self.connection.disconnect()
> @@ -301,6 +322,7 @@
>          # in remote_onecmd, because it may be different to this client's.
>          self.local_prompt = self.prompt
>          self.prompt = ""
> +        self.target_addr = target + " " + addr
>          line = self.connection.readline()
>          if line == '':
>              self.errmsg('Connection closed unexpectedly')
> @@ -382,6 +404,7 @@
>          except ConnectionFailed, err:
>              self.errmsg("Failed to connect to %s: (%s)" % (comm, err))
>              return
> +        self.pdbserver_addr = comm
>          self.target = 'remote'
>          self._rebind_input(self.connection)
>          self._rebind_output(self.connection)
> @@ -395,15 +418,33 @@
>              return
>          self._rebind_output(self.orig_stdout)
>          self._rebind_input(self.orig_stdin)
> -        if self.connection != None:
> -            self.connection.disconnect()
> -        if hasattr(self, 'local_prompt'):
> -            self.prompt = self.local_prompt
> -        self.msg('Exiting remote debugging...')
> +        self._disconnect()
>          self.target = 'local'
>          self.do_quit(None)
>          raise Exit
>
> +    def do_restart(self, arg):
> +        """ Extend pydb.do_restart to signal to any clients connected on
> +        a debugger's connection that this debugger is going to be restarted.
> +        All state is lost, and a new copy of the debugger is used.
> +        """
> +        # We don't proceed with the restart until the action has been
> +        # ACK'd by any connected clients
> +        if self.connection != None:
> +            self.msg('restart_now\n(MPdb)')
> +            line = ""
> +            while not 'ACK:restart_now' in line:
> +                line = self.connection.readline()
> +            try:
> +                self.do_rquit(None)
> +            except Exit:
> +                pass
> +        else:
> +            self.msg("Re exec'ing\n\t%s" % self._sys_argv)
> +        os.execvp(self._sys_argv[0], self._sys_argv)
> +
> +
> +
>      def do_thread(self, arg):
>          """Use this command to switch between threads.
>  The new thread ID must be currently known.
> _______________________________________________
> Python-checkins mailing list
> Python-checkins at python.org
> http://mail.python.org/mailman/listinfo/python-checkins
>


More information about the Python-checkins mailing list