2 /* Check for interrupts */
12 PyOS_InitInterrupts(void)
17 PyOS_FiniInterrupts(void)
22 PyOS_InterruptOccurred(void)
31 #if defined(_M_IX86) && !defined(__QNX__)
35 #if defined(MSDOS) && !defined(QUICKWIN)
39 /* This is for DJGPP's GO32 extender. I don't know how to trap
40 * control-C (There's no API for ctrl-C, and I don't want to mess with
41 * the interrupt vectors.) However, this DOES catch control-break.
48 PyOS_InitInterrupts(void)
50 _go32_want_ctrl_break(1 /* TRUE */);
54 PyOS_FiniInterrupts(void)
59 PyOS_InterruptOccurred(void)
61 return _go32_was_ctrl_break_hit();
66 /* This might work for MS-DOS (untested though): */
69 PyOS_InitInterrupts(void)
74 PyOS_FiniInterrupts(void)
79 PyOS_InterruptOccurred(void)
83 if (getch() == '\003')
93 #endif /* MSDOS && !QUICKWIN */
98 /* Default version -- for real operating systems and for Standard C */
104 static int interrupted
;
107 PyErr_SetInterrupt(void)
112 extern int PyErr_CheckSignals(void);
115 checksignals_witharg(void * arg
)
117 return PyErr_CheckSignals();
123 extern void Py_Exit(int);
124 static char message
[] =
125 "python: to interrupt a truly hanging Python program, interrupt once more.\n";
126 switch (interrupted
++) {
131 fprintf(stderr
, message
);
133 write(2, message
, strlen(message
));
141 PyOS_setsig(SIGINT
, intcatcher
);
142 Py_AddPendingCall(checksignals_witharg
, NULL
);
145 static void (*old_siginthandler
)(int) = SIG_DFL
;
148 PyOS_InitInterrupts(void)
150 if ((old_siginthandler
= PyOS_setsig(SIGINT
, SIG_IGN
)) != SIG_IGN
)
151 PyOS_setsig(SIGINT
, intcatcher
);
155 PyOS_FiniInterrupts(void)
157 PyOS_setsig(SIGINT
, old_siginthandler
);
161 PyOS_InterruptOccurred(void)
175 PyEval_ReInitThreads();
176 PyThread_ReInitTLS();