diff options
author | Kurt B. Kaiser <kbk@shore.net> | 2003-05-19 23:11:51 (GMT) |
---|---|---|
committer | Kurt B. Kaiser <kbk@shore.net> | 2003-05-19 23:11:51 (GMT) |
commit | 88957d8d0d9bf6d45603171927aa82d921bf9697 (patch) | |
tree | c886f3bc2cb561c30366b966501804d4f34f55df /Lib/idlelib/PyShell.py | |
parent | 8fd86cc46e0f056bd8af5dfe4c6ad1a30af453d5 (diff) | |
download | cpython-88957d8d0d9bf6d45603171927aa82d921bf9697.zip cpython-88957d8d0d9bf6d45603171927aa82d921bf9697.tar.gz cpython-88957d8d0d9bf6d45603171927aa82d921bf9697.tar.bz2 |
Fix race exposed by 2.4 GHz XP box: Don't tear down PyShell until
subprocess polling has terminated. Tk callit gets unhappy if it can't
find the function 'after' scheduled to run.
M PyShell.py
Diffstat (limited to 'Lib/idlelib/PyShell.py')
-rw-r--r-- | Lib/idlelib/PyShell.py | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py index d978fc2..dc47f07 100644 --- a/Lib/idlelib/PyShell.py +++ b/Lib/idlelib/PyShell.py @@ -426,8 +426,6 @@ class ModifiedInterpreter(InteractiveInterpreter): except (EOFError, IOError, KeyboardInterrupt): # lost connection or subprocess terminated itself, restart # [the KBI is from rpc.SocketIO.handle_EOF()] - if self.tkconsole.closing: - return response = None self.restart_subprocess() self.tkconsole.endexecuting() @@ -448,8 +446,10 @@ class ModifiedInterpreter(InteractiveInterpreter): print >>console, errmsg, what # we received a response to the currently active seq number: self.tkconsole.endexecuting() - # Reschedule myself in 50 ms - self.tkconsole.text.after(50, self.poll_subprocess) + # Reschedule myself + if not self.tkconsole.closing: + self.tkconsole.text.after(self.tkconsole.pollinterval, + self.poll_subprocess) debugger = None @@ -716,6 +716,7 @@ class PyShell(OutputWindow): # self.history = self.History(self.text) # + self.pollinterval = 50 # millisec if use_subprocess: self.interp.start_subprocess() @@ -798,7 +799,12 @@ class PyShell(OutputWindow): self.interp.interrupt_subprocess() return "cancel" else: - return EditorWindow.close(self) + self.closing = True + # Wait for poll_subprocess() rescheduling to stop + self.text.after(2 * self.pollinterval, self.close2) + + def close2(self): + return EditorWindow.close(self) def _close(self): "Extend EditorWindow._close(), shut down debugger and execution server" |