[Python-checkins] python/dist/src/Modules timemodule.c,2.128,2.129

mhammond@users.sourceforge.net mhammond@users.sourceforge.net
2002年7月15日 18:29:21 -0700


Update of /cvsroot/python/python/dist/src/Modules
In directory usw-pr-cvs1:/tmp/cvs-serv18190
Modified Files:
	timemodule.c 
Log Message:
Fix bug 581232 - [Windows] Can not interrupt time.sleep()
time.sleep() will now be interrupted on the main thread when Ctrl+C is pressed. Other threads are never interrupted.
Index: timemodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/timemodule.c,v
retrieving revision 2.128
retrieving revision 2.129
diff -C2 -d -r2.128 -r2.129
*** timemodule.c	30 Jun 2002 15:26:09 -0000	2.128
--- timemodule.c	16 Jul 2002 01:29:19 -0000	2.129
***************
*** 29,33 ****
--- 29,50 ----
 #else
 #ifdef MS_WINDOWS
+ #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
+ #include "pythread.h"
+ 
+ /* helper to allow us to interrupt sleep() on Windows*/
+ static HANDLE hInterruptEvent = NULL;
+ static BOOL WINAPI PyCtrlHandler(DWORD dwCtrlType)
+ {
+ 	SetEvent(hInterruptEvent);
+ 	/* allow other default handlers to be called.
+ 	 Default Python handler will setup the
+ 	 KeyboardInterrupt exception.
+ 	*/
+ 	return FALSE;
+ }
+ static long main_thread;
+ 
+ 
 #if defined(__BORLANDC__)
 /* These overrides not needed for Win32 */
***************
*** 681,685 ****
 #endif /* __CYGWIN__ */
 #endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
! 
 PyStructSequence_InitType(&StructTimeType, &struct_time_type_desc);
 	Py_INCREF(&StructTimeType);
--- 698,710 ----
 #endif /* __CYGWIN__ */
 #endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
! #ifdef MS_WINDOWS
! 	/* Helper to allow interrupts for Windows.
! 	 If Ctrl+C event delivered while not sleeping
! 	 it will be ignored.
! 	*/
! 	main_thread = PyThread_get_thread_ident();
! 	hInterruptEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
! 	SetConsoleCtrlHandler( PyCtrlHandler, TRUE);
! #endif /* MS_WINDOWS */
 PyStructSequence_InitType(&StructTimeType, &struct_time_type_desc);
 	Py_INCREF(&StructTimeType);
***************
*** 776,782 ****
 			return -1;
 		}
- 		/* XXX Can't interrupt this sleep */
 		Py_BEGIN_ALLOW_THREADS
! 		Sleep((unsigned long)millisecs);
 		Py_END_ALLOW_THREADS
 	}
--- 801,825 ----
 			return -1;
 		}
 		Py_BEGIN_ALLOW_THREADS
! 		/* allow sleep(0) to maintain win32 semantics, and as decreed by
! 		 Guido, only the main thread can be interrupted. */
! 		if ((unsigned long)millisecs==0 || main_thread != PyThread_get_thread_ident())
! 			Sleep((unsigned long)millisecs);
! 		else {
! 			DWORD rc;
! 			ResetEvent(hInterruptEvent);
! 			rc = WaitForSingleObject(hInterruptEvent, (unsigned long)millisecs);
! 			if (rc==WAIT_OBJECT_0) {
! 				/* yield to make sure real Python signal handler called */
! 				Sleep(1);
! 				Py_BLOCK_THREADS
! 				/* PyErr_SetFromErrno() does the "right thing" wrt signals
! 				 if errno=EINTR
! 				*/
! 				errno = EINTR;
! 				PyErr_SetFromErrno(PyExc_IOError);
! 				return -1;
! 			}
! 		}
 		Py_END_ALLOW_THREADS
 	}

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