| /* Check for interrupts */ | |
| #include "Python.h" | |
| #include "pythread.h" | |
| #ifdef QUICKWIN | |
| #include <io.h> | |
| void | |
| PyOS_InitInterrupts(void) | |
| { | |
| } | |
| void | |
| PyOS_FiniInterrupts(void) | |
| { | |
| } | |
| int | |
| PyOS_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> | |
| void | |
| PyOS_InitInterrupts(void) | |
| { | |
| _go32_want_ctrl_break(1 /* TRUE */); | |
| } | |
| void | |
| PyOS_FiniInterrupts(void) | |
| { | |
| } | |
| int | |
| PyOS_InterruptOccurred(void) | |
| { | |
| return _go32_was_ctrl_break_hit(); | |
| } | |
| #else /* !__GNUC__ */ | |
| /* This might work for MS-DOS (untested though): */ | |
| void | |
| PyOS_InitInterrupts(void) | |
| { | |
| } | |
| void | |
| PyOS_FiniInterrupts(void) | |
| { | |
| } | |
| int | |
| PyOS_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; | |
| void | |
| PyErr_SetInterrupt(void) | |
| { | |
| interrupted = 1; | |
| } | |
| extern int PyErr_CheckSignals(void); | |
| static int | |
| checksignals_witharg(void * arg) | |
| { | |
| return PyErr_CheckSignals(); | |
| } | |
| static void | |
| intcatcher(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; | |
| void | |
| PyOS_InitInterrupts(void) | |
| { | |
| if ((old_siginthandler = PyOS_setsig(SIGINT, SIG_IGN)) != SIG_IGN) | |
| PyOS_setsig(SIGINT, intcatcher); | |
| } | |
| void | |
| PyOS_FiniInterrupts(void) | |
| { | |
| PyOS_setsig(SIGINT, old_siginthandler); | |
| } | |
| int | |
| PyOS_InterruptOccurred(void) | |
| { | |
| if (!interrupted) | |
| return 0; | |
| interrupted = 0; | |
| return 1; | |
| } | |
| #endif /* !OK */ | |
| void | |
| PyOS_AfterFork(void) | |
| { | |
| #ifdef WITH_THREAD | |
| PyEval_ReInitThreads(); | |
| PyThread_ReInitTLS(); | |
| #endif | |
| } |