diff options
Diffstat (limited to 'Lib/idlelib/run.py')
| -rw-r--r-- | Lib/idlelib/run.py | 58 | 
1 files changed, 34 insertions, 24 deletions
diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py index 98255c7..abc9969 100644 --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -21,7 +21,8 @@ import __main__  # the socket) and the main thread (which runs user code), plus global  # completion and exit flags: -exit_requested = False +exit_now = False +quitting = False  def main():      """Start the Python execution server in a subprocess @@ -41,6 +42,8 @@ def main():      register and unregister themselves.      """ +    global exit_now +    global quitting      port = 8833      if sys.argv[1:]:          port = int(sys.argv[1]) @@ -52,8 +55,12 @@ def main():      sockthread.start()      while 1:          try: -            if exit_requested: -                sys.exit(0) +            if exit_now: +                try: +                    sys.exit(0) +                except KeyboardInterrupt: +                    # exiting but got an extra KBI? Try again! +                    continue              try:                  seq, request = rpc.request_queue.get(0)              except Queue.Empty: @@ -63,17 +70,22 @@ def main():              ret = method(*args, **kwargs)              rpc.response_queue.put((seq, ret))          except KeyboardInterrupt: +            if quitting: +                exit_now = True              continue          except SystemExit:              raise          except: +            type, value, tb = sys.exc_info()              try:                  print_exception()                  rpc.response_queue.put((seq, None))              except: -                traceback.print_exc(file=sys.__stderr__) -                sys.exit(1.1) -            continue +                # Link didn't work, print same exception to __stderr__ +                traceback.print_exception(type, value, tb, file=sys.__stderr__) +                sys.exit(0) +            else: +                continue  def manage_socket(address):      for i in range(6): @@ -89,17 +101,17 @@ def manage_socket(address):                                                + err[1] + ", retrying...."      else:          print>>sys.__stderr__, "\nConnection to Idle failed, exiting." -        global exit_requested -        exit_requested = True +        global exit_now +        exit_now = True          return      server.handle_request() # A single request only  def print_exception():      flush_stdout()      efile = sys.stderr -    typ, val, tb = info = sys.exc_info() +    typ, val, tb = sys.exc_info()      tbe = traceback.extract_tb(tb) -    print >>efile, 'Traceback (most recent call last):' +    print >>efile, '\nTraceback (most recent call last):'      exclude = ("run.py", "rpc.py", "threading.py", "Queue.py",                 "RemoteDebugger.py", "bdb.py")      cleanup_traceback(tbe, exclude) @@ -161,8 +173,8 @@ class MyRPCServer(rpc.RPCServer):          except SystemExit:              raise          except EOFError: -            global exit_requested -            exit_requested = True +            global exit_now +            exit_now = True              interrupt.interrupt_main()          except:              erf = sys.__stderr__ @@ -174,7 +186,7 @@ class MyRPCServer(rpc.RPCServer):              traceback.print_exc(file=erf)              print>>erf, '\n*** Unrecoverable, server exiting!'              print>>erf, '-'*40 -            os._exit(0) +            sys.exit(0)  class MyHandler(rpc.RPCHandler): @@ -190,15 +202,18 @@ class MyHandler(rpc.RPCHandler):      def exithook(self):          "override SocketIO method - wait for MainThread to shut us down" -        while 1: pass +        time.sleep(10)      def EOFhook(self):          "Override SocketIO method - terminate wait on callback and exit thread" -        global exit_requested -        exit_requested = True +        global quitting +        quitting = True +        interrupt.interrupt_main()      def decode_interrupthook(self):          "interrupt awakened thread" +        global quitting +        quitting = True          interrupt.interrupt_main() @@ -213,15 +228,10 @@ class Executive:          try:              exec code in self.locals          except: -            if exit_requested: +            if quitting:                  sys.exit(0) -            try: -                # even print a user code SystemExit exception, continue -                print_exception() -            except: -                # link not working?  -                traceback.print_exc(file=sys.__stderr__) -                sys.exit(1.2) +            # even print a user code SystemExit exception, continue +            print_exception()          else:              flush_stdout()  | 
