[Python-checkins] python/dist/src/Parser myreadline.c,2.26,2.27

mhammond@users.sourceforge.net mhammond@users.sourceforge.net
2002年7月14日 16:12:31 -0700


Update of /cvsroot/python/python/dist/src/Parser
In directory usw-pr-cvs1:/tmp/cvs-serv1634
Modified Files:
	myreadline.c 
Log Message:
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.27
diff -C2 -d -r2.26 -r2.27
*** myreadline.c	2 Mar 2001 06:29:51 -0000	2.26
--- myreadline.c	14 Jul 2002 23:12:29 -0000	2.27
***************
*** 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 */

AltStyle によって変換されたページ (->オリジナル) /