/* 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){intinterrupted=0;while(kbhit()){if(getch()=='\003')interrupted=1;}returninterrupted;}#endif /* __GNUC__ */#define OK#endif /* MSDOS && !QUICKWIN */#ifdef macintosh/* The Mac interrupt code has moved to macglue.c */#define OK#endif /* macintosh */#ifndef OK/* Default version -- for real operating systems and for Standard C */#include <stdio.h>#include <string.h>#include <signal.h>#ifdef HAVE_UNISTD_H#include <unistd.h>#endifstaticintinterrupted;voidPyErr_SetInterrupt(void){interrupted=1;}externintPyErr_CheckSignals(void);staticintchecksignals_witharg(void*arg){returnPyErr_CheckSignals();}staticvoidintcatcher(intsig){externvoidPy_Exit(int);staticcharmessage[]="python: to interrupt a truly hanging Python program, interrupt once more.\n";switch(interrupted++){case0:break;case1:#ifdef RISCOSfprintf(stderr,message);#elsewrite(2,message,strlen(message));#endifbreak;case2:interrupted=0;Py_Exit(1);break;}signal(SIGINT,intcatcher);Py_AddPendingCall(checksignals_witharg,NULL);}staticvoid(*old_siginthandler)(int)=SIG_DFL;voidPyOS_InitInterrupts(void){if((old_siginthandler=signal(SIGINT,SIG_IGN))!=SIG_IGN)signal(SIGINT,intcatcher);#ifdef HAVE_SIGINTERRUPT/* This is for SunOS and other modern BSD derivatives. It means that system calls (like read()) are not restarted after an interrupt. This is necessary so interrupting a read() or readline() call works as expected. XXX On old BSD (pure 4.2 or older) you may have to do this differently! */siginterrupt(SIGINT,1);#endif /* HAVE_SIGINTERRUPT */}voidPyOS_FiniInterrupts(void){signal(SIGINT,old_siginthandler);}intPyOS_InterruptOccurred(void){if(!interrupted)return0;interrupted=0;return1;}#endif /* !OK */voidPyOS_AfterFork(void){#ifdef WITH_THREADPyEval_ReInitThreads();#endif}