summaryrefslogtreecommitdiffstats
path: root/Lib/idlelib/PyShell.py
diff options
context:
space:
mode:
authorKurt B. Kaiser <kbk@shore.net>2003-05-19 23:11:51 (GMT)
committerKurt B. Kaiser <kbk@shore.net>2003-05-19 23:11:51 (GMT)
commit88957d8d0d9bf6d45603171927aa82d921bf9697 (patch)
treec886f3bc2cb561c30366b966501804d4f34f55df /Lib/idlelib/PyShell.py
parent8fd86cc46e0f056bd8af5dfe4c6ad1a30af453d5 (diff)
downloadcpython-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.py16
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"