176 lines · 2.4 KB · C
RawDownload
 /* Check for interrupts */ #include "Python.h" #ifdef QUICKWIN #include <io.h> voidPyOS_InitInterrupts(void){} voidPyOS_FiniInterrupts(void){} intPyOS_InterruptOccurred(void){	_wyield();} #define OK #endif /* QUICKWIN */ #if defined(_M_IX86) && !defined(__QNX__)#include <io.h>#endif #if defined(MSDOS) && !defined(QUICKWIN) #ifdef __GNUC__ /* This is for DJGPP's GO32 extender.  I don't know how to trap * control-C  (There's no API for ctrl-C, and I don't want to mess with * the interrupt vectors.)  However, this DOES catch control-break. * --Amrit */ #include <go32.h> voidPyOS_InitInterrupts(void){	_go32_want_ctrl_break(1 /* TRUE */);} voidPyOS_FiniInterrupts(void){} intPyOS_InterruptOccurred(void){	return _go32_was_ctrl_break_hit();} #else /* !__GNUC__ */ /* This might work for MS-DOS (untested though): */ voidPyOS_InitInterrupts(void){} voidPyOS_FiniInterrupts(void){} intPyOS_InterruptOccurred(void){	int interrupted = 0;	while (kbhit()) {		if (getch() == '\003')			interrupted = 1;	}	return interrupted;} #endif /* __GNUC__ */ #define OK #endif /* MSDOS && !QUICKWIN */  #ifndef OK /* Default version -- for real operating systems and for Standard C */ #include <stdio.h>#include <string.h>#include <signal.h> static int interrupted; voidPyErr_SetInterrupt(void){	interrupted = 1;} extern int PyErr_CheckSignals(void); static intchecksignals_witharg(void * arg){	return PyErr_CheckSignals();} static voidintcatcher(int sig){	extern void Py_Exit(int);	static char message[] ="python: to interrupt a truly hanging Python program, interrupt once more.\n";	switch (interrupted++) {	case 0:		break;	case 1:#ifdef RISCOS		fprintf(stderr, message);#else		write(2, message, strlen(message));#endif		break;	case 2:		interrupted = 0;		Py_Exit(1);		break;	}	PyOS_setsig(SIGINT, intcatcher);	Py_AddPendingCall(checksignals_witharg, NULL);} static void (*old_siginthandler)(int) = SIG_DFL; voidPyOS_InitInterrupts(void){	if ((old_siginthandler = PyOS_setsig(SIGINT, SIG_IGN)) != SIG_IGN)		PyOS_setsig(SIGINT, intcatcher);} voidPyOS_FiniInterrupts(void){	PyOS_setsig(SIGINT, old_siginthandler);} intPyOS_InterruptOccurred(void){	if (!interrupted)		return 0;	interrupted = 0;	return 1;} #endif /* !OK */ voidPyOS_AfterFork(void){#ifdef WITH_THREAD	PyEval_ReInitThreads();#endif}