Mailing List Archive

python/dist/src/Parser myreadline.c,2.26,2.26.24.1
Update of /cvsroot/python/python/dist/src/Parser
In directory usw-pr-cvs1:/tmp/cvs-serv24304

Modified Files:
Tag: release22-maint
myreadline.c
Log Message:
Backport 2.27:

Fix bug 439992 - [win32] KeyboardInterrupt Not Caught.

This gets us closer to consistent Ctrl+C behaviour on NT and Win9x.
NT now reliably generates KeyboardInterrupt exceptions for NT when a
file IO operation was aborted. Bugfix candidate



Index: myreadline.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Parser/myreadline.c,v
retrieving revision 2.26
retrieving revision 2.26.24.1
diff -C2 -d -r2.26 -r2.26.24.1
*** myreadline.c 2 Mar 2001 06:29:51 -0000 2.26
--- myreadline.c 7 Oct 2002 02:33:56 -0000 2.26.24.1
***************
*** 11,14 ****
--- 11,18 ----

#include "Python.h"
+ #ifdef MS_WINDOWS
+ #define WIN32_LEAN_AND_MEAN
+ #include "windows.h"
+ #endif /* MS_WINDOWS */

int (*PyOS_InputHook)(void) = NULL;
***************
*** 32,35 ****
--- 36,68 ----
if (p != NULL)
return 0; /* No error */
+ #ifdef MS_WINDOWS
+ /* In the case of a Ctrl+C or some other external event
+ interrupting the operation:
+ Win2k/NT: ERROR_OPERATION_ABORTED is the most recent Win32
+ error code (and feof() returns TRUE).
+ Win9x: Ctrl+C seems to have no effect on fgets() returning
+ early - the signal handler is called, but the fgets()
+ only returns "normally" (ie, when Enter hit or feof())
+ */
+ if (GetLastError()==ERROR_OPERATION_ABORTED) {
+ /* Signals come asynchronously, so we sleep a brief
+ moment before checking if the handler has been
+ triggered (we cant just return 1 before the
+ signal handler has been called, as the later
+ signal may be treated as a separate interrupt).
+ */
+ Sleep(1);
+ if (PyOS_InterruptOccurred()) {
+ return 1; /* Interrupt */
+ }
+ /* Either the sleep wasn't long enough (need a
+ short loop retrying?) or not interrupted at all
+ (in which case we should revisit the whole thing!)
+ Logging some warning would be nice. assert is not
+ viable as under the debugger, the various dialogs
+ mean the condition is not true.
+ */
+ }
+ #endif /* MS_WINDOWS */
if (feof(fp)) {
return -1; /* EOF */