blob: 519f40400bbe9dbaef7e5aaa52426c3d0a39df03 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* Check for interrupts */
12
Fred Drakeeb375e42000-08-23 18:17:42 +000013#include "Python.h"
Guido van Rossumd6a15ad1991-06-24 22:30:42 +000014
Guido van Rossum1d5735e1994-08-30 08:27:36 +000015#ifdef QUICKWIN
16
17#include <io.h>
18
19void
Thomas Wouters23c9e002000-07-22 19:20:54 +000020PyOS_InitInterrupts(void)
Guido van Rossum1d5735e1994-08-30 08:27:36 +000021{
22}
23
Guido van Rossumaee094c1997-08-02 03:02:27 +000024void
Thomas Wouters23c9e002000-07-22 19:20:54 +000025PyOS_FiniInterrupts(void)
Guido van Rossumaee094c1997-08-02 03:02:27 +000026{
27}
28
Guido van Rossum1d5735e1994-08-30 08:27:36 +000029int
Thomas Wouters23c9e002000-07-22 19:20:54 +000030PyOS_InterruptOccurred(void)
Guido van Rossum1d5735e1994-08-30 08:27:36 +000031{
32 _wyield();
33}
34
35#define OK
36
37#endif /* QUICKWIN */
38
Guido van Rossum7bf22de1997-12-02 20:34:19 +000039#if defined(_M_IX86) && !defined(__QNX__)
Guido van Rossum1d5735e1994-08-30 08:27:36 +000040#include <io.h>
41#endif
42
43#if defined(MSDOS) && !defined(QUICKWIN)
44
45#ifdef __GNUC__
46
47/* This is for DJGPP's GO32 extender. I don't know how to trap
48 * control-C (There's no API for ctrl-C, and I don't want to mess with
49 * the interrupt vectors.) However, this DOES catch control-break.
50 * --Amrit
51 */
52
53#include <go32.h>
54
55void
Thomas Wouters23c9e002000-07-22 19:20:54 +000056PyOS_InitInterrupts(void)
Guido van Rossum1d5735e1994-08-30 08:27:36 +000057{
58 _go32_want_ctrl_break(1 /* TRUE */);
59}
60
Guido van Rossumaee094c1997-08-02 03:02:27 +000061void
Thomas Wouters23c9e002000-07-22 19:20:54 +000062PyOS_FiniInterrupts(void)
Guido van Rossumaee094c1997-08-02 03:02:27 +000063{
64}
65
Guido van Rossum1d5735e1994-08-30 08:27:36 +000066int
Thomas Wouters23c9e002000-07-22 19:20:54 +000067PyOS_InterruptOccurred(void)
Guido van Rossum1d5735e1994-08-30 08:27:36 +000068{
69 return _go32_was_ctrl_break_hit();
70}
71
72#else /* !__GNUC__ */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073
Guido van Rossum3f5da241990-12-20 15:06:42 +000074/* This might work for MS-DOS (untested though): */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000075
76void
Thomas Wouters23c9e002000-07-22 19:20:54 +000077PyOS_InitInterrupts(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000078{
79}
80
Guido van Rossumaee094c1997-08-02 03:02:27 +000081void
Thomas Wouters23c9e002000-07-22 19:20:54 +000082PyOS_FiniInterrupts(void)
Guido van Rossumaee094c1997-08-02 03:02:27 +000083{
84}
85
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086int
Thomas Wouters23c9e002000-07-22 19:20:54 +000087PyOS_InterruptOccurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088{
89 int interrupted = 0;
90 while (kbhit()) {
91 if (getch() == '\003')
92 interrupted = 1;
93 }
94 return interrupted;
95}
96
Guido van Rossum1d5735e1994-08-30 08:27:36 +000097#endif /* __GNUC__ */
98
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099#define OK
100
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000101#endif /* MSDOS && !QUICKWIN */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000102
103
Guido van Rossumd6a15ad1991-06-24 22:30:42 +0000104#ifdef macintosh
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000105
Jack Jansen9fc39891995-01-27 14:40:41 +0000106/* The Mac interrupt code has moved to macglue.c */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000107#define OK
108
Guido van Rossumd6a15ad1991-06-24 22:30:42 +0000109#endif /* macintosh */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000110
111
112#ifndef OK
113
Guido van Rossum3f5da241990-12-20 15:06:42 +0000114/* Default version -- for real operating systems and for Standard C */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000115
116#include <stdio.h>
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000117#include <string.h>
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000118#include <signal.h>
Guido van Rossumfd8a3931996-12-02 18:27:33 +0000119#ifdef HAVE_UNISTD_H
120#include <unistd.h>
121#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000122
Guido van Rossum62e376b1995-01-17 16:11:53 +0000123static int interrupted;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000124
Guido van Rossum575d5611995-03-10 15:13:03 +0000125void
Thomas Wouters23c9e002000-07-22 19:20:54 +0000126PyErr_SetInterrupt(void)
Guido van Rossum575d5611995-03-10 15:13:03 +0000127{
128 interrupted = 1;
129}
130
Thomas Wouters23c9e002000-07-22 19:20:54 +0000131extern int PyErr_CheckSignals(void);
Guido van Rossumad74fa61997-01-21 06:00:33 +0000132
Thomas Wouters23c9e002000-07-22 19:20:54 +0000133static int
134checksignals_witharg(void * arg)
135{
136 return PyErr_CheckSignals();
137}
138
Tim Peters4f1b2082000-07-23 21:18:09 +0000139static void
Thomas Wouters23c9e002000-07-22 19:20:54 +0000140intcatcher(int sig)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000141{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000142 extern void Py_Exit(int);
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000143 static char message[] =
144"python: to interrupt a truly hanging Python program, interrupt once more.\n";
145 switch (interrupted++) {
146 case 0:
147 break;
148 case 1:
149 write(2, message, strlen(message));
150 break;
151 case 2:
152 interrupted = 0;
Guido van Rossum86bea461997-04-29 21:03:06 +0000153 Py_Exit(1);
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000154 break;
155 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000156 signal(SIGINT, intcatcher);
Thomas Wouters23c9e002000-07-22 19:20:54 +0000157 Py_AddPendingCall(checksignals_witharg, NULL);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000158}
159
Tim Peters4f1b2082000-07-23 21:18:09 +0000160static void (*old_siginthandler)(int) = SIG_DFL;
Guido van Rossumaee094c1997-08-02 03:02:27 +0000161
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000162void
Thomas Wouters23c9e002000-07-22 19:20:54 +0000163PyOS_InitInterrupts(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000164{
Guido van Rossumaee094c1997-08-02 03:02:27 +0000165 if ((old_siginthandler = signal(SIGINT, SIG_IGN)) != SIG_IGN)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000166 signal(SIGINT, intcatcher);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000167#ifdef HAVE_SIGINTERRUPT
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000168 /* This is for SunOS and other modern BSD derivatives.
169 It means that system calls (like read()) are not restarted
170 after an interrupt. This is necessary so interrupting a
171 read() or readline() call works as expected.
172 XXX On old BSD (pure 4.2 or older) you may have to do this
173 differently! */
174 siginterrupt(SIGINT, 1);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000175#endif /* HAVE_SIGINTERRUPT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000176}
177
Guido van Rossumaee094c1997-08-02 03:02:27 +0000178void
Thomas Wouters23c9e002000-07-22 19:20:54 +0000179PyOS_FiniInterrupts(void)
Guido van Rossumaee094c1997-08-02 03:02:27 +0000180{
181 signal(SIGINT, old_siginthandler);
182}
183
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000184int
Thomas Wouters23c9e002000-07-22 19:20:54 +0000185PyOS_InterruptOccurred(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186{
187 if (!interrupted)
188 return 0;
189 interrupted = 0;
190 return 1;
191}
192
193#endif /* !OK */
Guido van Rossum359bcaa1997-11-14 22:24:28 +0000194
195void
Thomas Wouters23c9e002000-07-22 19:20:54 +0000196PyOS_AfterFork(void)
Guido van Rossum359bcaa1997-11-14 22:24:28 +0000197{
198}