| Guido van Rossum | f70e43a | 1991-02-19 12:39:46 +0000 | [diff] [blame] | 1 | /*********************************************************** | 
| Guido van Rossum | b9f8d6e | 1995-01-04 19:08:09 +0000 | [diff] [blame] | 2 | Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam, | 
 | 3 | The Netherlands. | 
| Guido van Rossum | f70e43a | 1991-02-19 12:39:46 +0000 | [diff] [blame] | 4 |  | 
 | 5 |                         All Rights Reserved | 
 | 6 |  | 
| Guido van Rossum | d266eb4 | 1996-10-25 14:44:06 +0000 | [diff] [blame] | 7 | Permission to use, copy, modify, and distribute this software and its | 
 | 8 | documentation for any purpose and without fee is hereby granted, | 
| Guido van Rossum | f70e43a | 1991-02-19 12:39:46 +0000 | [diff] [blame] | 9 | provided that the above copyright notice appear in all copies and that | 
| Guido van Rossum | d266eb4 | 1996-10-25 14:44:06 +0000 | [diff] [blame] | 10 | both that copyright notice and this permission notice appear in | 
| Guido van Rossum | f70e43a | 1991-02-19 12:39:46 +0000 | [diff] [blame] | 11 | supporting documentation, and that the names of Stichting Mathematisch | 
| Guido van Rossum | d266eb4 | 1996-10-25 14:44:06 +0000 | [diff] [blame] | 12 | Centrum or CWI or Corporation for National Research Initiatives or | 
 | 13 | CNRI not be used in advertising or publicity pertaining to | 
 | 14 | distribution of the software without specific, written prior | 
 | 15 | permission. | 
| Guido van Rossum | f70e43a | 1991-02-19 12:39:46 +0000 | [diff] [blame] | 16 |  | 
| Guido van Rossum | d266eb4 | 1996-10-25 14:44:06 +0000 | [diff] [blame] | 17 | While CWI is the initial source for this software, a modified version | 
 | 18 | is made available by the Corporation for National Research Initiatives | 
 | 19 | (CNRI) at the Internet address ftp://ftp.python.org. | 
 | 20 |  | 
 | 21 | STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH | 
 | 22 | REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF | 
 | 23 | MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH | 
 | 24 | CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL | 
 | 25 | DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR | 
 | 26 | PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER | 
 | 27 | TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | 
 | 28 | PERFORMANCE OF THIS SOFTWARE. | 
| Guido van Rossum | f70e43a | 1991-02-19 12:39:46 +0000 | [diff] [blame] | 29 |  | 
 | 30 | ******************************************************************/ | 
 | 31 |  | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 32 | /* Check for interrupts */ | 
 | 33 |  | 
| Guido van Rossum | 1d5735e | 1994-08-30 08:27:36 +0000 | [diff] [blame] | 34 | #include "config.h" | 
| Guido van Rossum | f261526 | 1998-12-04 18:50:20 +0000 | [diff] [blame] | 35 |  | 
 | 36 | /* config.h may or may not define DL_IMPORT */ | 
 | 37 | #ifndef DL_IMPORT	/* declarations for DLL import/export */ | 
 | 38 | #define DL_IMPORT(RTYPE) RTYPE | 
 | 39 | #endif | 
 | 40 |  | 
| Guido van Rossum | 1d5735e | 1994-08-30 08:27:36 +0000 | [diff] [blame] | 41 | #include "myproto.h" | 
| Guido van Rossum | bae9518 | 1997-02-14 21:12:24 +0000 | [diff] [blame] | 42 | #include "mymalloc.h" /* For ANY */ | 
| Guido van Rossum | 189e8f9 | 1992-01-19 16:29:05 +0000 | [diff] [blame] | 43 | #include "intrcheck.h" | 
 | 44 |  | 
| Guido van Rossum | bae9518 | 1997-02-14 21:12:24 +0000 | [diff] [blame] | 45 | /* Copied here from ceval.h -- can't include that file. */ | 
 | 46 | int Py_AddPendingCall Py_PROTO((int (*func) Py_PROTO((ANY *)), ANY *arg)); | 
 | 47 |  | 
| Guido van Rossum | d6a15ad | 1991-06-24 22:30:42 +0000 | [diff] [blame] | 48 |  | 
| Guido van Rossum | 1d5735e | 1994-08-30 08:27:36 +0000 | [diff] [blame] | 49 | #ifdef QUICKWIN | 
 | 50 |  | 
 | 51 | #include <io.h> | 
 | 52 |  | 
 | 53 | void | 
| Guido van Rossum | 86bea46 | 1997-04-29 21:03:06 +0000 | [diff] [blame] | 54 | PyOS_InitInterrupts() | 
| Guido van Rossum | 1d5735e | 1994-08-30 08:27:36 +0000 | [diff] [blame] | 55 | { | 
 | 56 | } | 
 | 57 |  | 
| Guido van Rossum | aee094c | 1997-08-02 03:02:27 +0000 | [diff] [blame] | 58 | void | 
 | 59 | PyOS_FiniInterrupts() | 
 | 60 | { | 
 | 61 | } | 
 | 62 |  | 
| Guido van Rossum | 1d5735e | 1994-08-30 08:27:36 +0000 | [diff] [blame] | 63 | int | 
| Guido van Rossum | 86bea46 | 1997-04-29 21:03:06 +0000 | [diff] [blame] | 64 | PyOS_InterruptOccurred() | 
| Guido van Rossum | 1d5735e | 1994-08-30 08:27:36 +0000 | [diff] [blame] | 65 | { | 
 | 66 | 	_wyield(); | 
 | 67 | } | 
 | 68 |  | 
 | 69 | #define OK | 
 | 70 |  | 
 | 71 | #endif /* QUICKWIN */ | 
 | 72 |  | 
| Guido van Rossum | 7bf22de | 1997-12-02 20:34:19 +0000 | [diff] [blame] | 73 | #if defined(_M_IX86) && !defined(__QNX__) | 
| Guido van Rossum | 1d5735e | 1994-08-30 08:27:36 +0000 | [diff] [blame] | 74 | #include <io.h> | 
 | 75 | #endif | 
 | 76 |  | 
 | 77 | #if defined(MSDOS) && !defined(QUICKWIN) | 
 | 78 |  | 
 | 79 | #ifdef __GNUC__ | 
 | 80 |  | 
 | 81 | /* This is for DJGPP's GO32 extender.  I don't know how to trap | 
 | 82 |  * control-C  (There's no API for ctrl-C, and I don't want to mess with | 
 | 83 |  * the interrupt vectors.)  However, this DOES catch control-break. | 
 | 84 |  * --Amrit | 
 | 85 |  */ | 
 | 86 |  | 
 | 87 | #include <go32.h> | 
 | 88 |  | 
 | 89 | void | 
| Guido van Rossum | 86bea46 | 1997-04-29 21:03:06 +0000 | [diff] [blame] | 90 | PyOS_InitInterrupts() | 
| Guido van Rossum | 1d5735e | 1994-08-30 08:27:36 +0000 | [diff] [blame] | 91 | { | 
 | 92 | 	_go32_want_ctrl_break(1 /* TRUE */); | 
 | 93 | } | 
 | 94 |  | 
| Guido van Rossum | aee094c | 1997-08-02 03:02:27 +0000 | [diff] [blame] | 95 | void | 
 | 96 | PyOS_FiniInterrupts() | 
 | 97 | { | 
 | 98 | } | 
 | 99 |  | 
| Guido van Rossum | 1d5735e | 1994-08-30 08:27:36 +0000 | [diff] [blame] | 100 | int | 
| Guido van Rossum | 86bea46 | 1997-04-29 21:03:06 +0000 | [diff] [blame] | 101 | PyOS_InterruptOccurred() | 
| Guido van Rossum | 1d5735e | 1994-08-30 08:27:36 +0000 | [diff] [blame] | 102 | { | 
 | 103 | 	return _go32_was_ctrl_break_hit(); | 
 | 104 | } | 
 | 105 |  | 
 | 106 | #else /* !__GNUC__ */ | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 107 |  | 
| Guido van Rossum | 3f5da24 | 1990-12-20 15:06:42 +0000 | [diff] [blame] | 108 | /* This might work for MS-DOS (untested though): */ | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 109 |  | 
 | 110 | void | 
| Guido van Rossum | 86bea46 | 1997-04-29 21:03:06 +0000 | [diff] [blame] | 111 | PyOS_InitInterrupts() | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 112 | { | 
 | 113 | } | 
 | 114 |  | 
| Guido van Rossum | aee094c | 1997-08-02 03:02:27 +0000 | [diff] [blame] | 115 | void | 
 | 116 | PyOS_FiniInterrupts() | 
 | 117 | { | 
 | 118 | } | 
 | 119 |  | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 120 | int | 
| Guido van Rossum | 86bea46 | 1997-04-29 21:03:06 +0000 | [diff] [blame] | 121 | PyOS_InterruptOccurred() | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 122 | { | 
 | 123 | 	int interrupted = 0; | 
 | 124 | 	while (kbhit()) { | 
 | 125 | 		if (getch() == '\003') | 
 | 126 | 			interrupted = 1; | 
 | 127 | 	} | 
 | 128 | 	return interrupted; | 
 | 129 | } | 
 | 130 |  | 
| Guido van Rossum | 1d5735e | 1994-08-30 08:27:36 +0000 | [diff] [blame] | 131 | #endif /* __GNUC__ */ | 
 | 132 |  | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 133 | #define OK | 
 | 134 |  | 
| Guido van Rossum | 1d5735e | 1994-08-30 08:27:36 +0000 | [diff] [blame] | 135 | #endif /* MSDOS && !QUICKWIN */ | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 136 |  | 
 | 137 |  | 
| Guido van Rossum | d6a15ad | 1991-06-24 22:30:42 +0000 | [diff] [blame] | 138 | #ifdef macintosh | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 139 |  | 
| Jack Jansen | 9fc3989 | 1995-01-27 14:40:41 +0000 | [diff] [blame] | 140 | /* The Mac interrupt code has moved to macglue.c */ | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 141 | #define OK | 
 | 142 |  | 
| Guido van Rossum | d6a15ad | 1991-06-24 22:30:42 +0000 | [diff] [blame] | 143 | #endif /* macintosh */ | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 144 |  | 
 | 145 |  | 
 | 146 | #ifndef OK | 
 | 147 |  | 
| Guido van Rossum | 3f5da24 | 1990-12-20 15:06:42 +0000 | [diff] [blame] | 148 | /* Default version -- for real operating systems and for Standard C */ | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 149 |  | 
 | 150 | #include <stdio.h> | 
| Guido van Rossum | 1d5735e | 1994-08-30 08:27:36 +0000 | [diff] [blame] | 151 | #include <string.h> | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 152 | #include <signal.h> | 
| Guido van Rossum | fd8a393 | 1996-12-02 18:27:33 +0000 | [diff] [blame] | 153 | #ifdef HAVE_UNISTD_H | 
 | 154 | #include <unistd.h> | 
 | 155 | #endif | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 156 |  | 
| Guido van Rossum | 62e376b | 1995-01-17 16:11:53 +0000 | [diff] [blame] | 157 | static int interrupted; | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 158 |  | 
| Guido van Rossum | 575d561 | 1995-03-10 15:13:03 +0000 | [diff] [blame] | 159 | void | 
 | 160 | PyErr_SetInterrupt() | 
 | 161 | { | 
 | 162 | 	interrupted = 1; | 
 | 163 | } | 
 | 164 |  | 
| Guido van Rossum | 86bea46 | 1997-04-29 21:03:06 +0000 | [diff] [blame] | 165 | extern int PyErr_CheckSignals(); | 
| Guido van Rossum | ad74fa6 | 1997-01-21 06:00:33 +0000 | [diff] [blame] | 166 |  | 
| Guido van Rossum | df840d9 | 1992-03-27 17:29:44 +0000 | [diff] [blame] | 167 | /* ARGSUSED */ | 
| Guido van Rossum | 1d5735e | 1994-08-30 08:27:36 +0000 | [diff] [blame] | 168 | static RETSIGTYPE | 
| Guido van Rossum | 7bf22de | 1997-12-02 20:34:19 +0000 | [diff] [blame] | 169 | #if defined(_M_IX86) && !defined(__QNX__) | 
| Guido van Rossum | 1d5735e | 1994-08-30 08:27:36 +0000 | [diff] [blame] | 170 | intcatcher(int sig)	/* So the C compiler shuts up */ | 
 | 171 | #else /* _M_IX86 */ | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 172 | intcatcher(sig) | 
| Guido van Rossum | df840d9 | 1992-03-27 17:29:44 +0000 | [diff] [blame] | 173 | 	int sig; /* Not used by required by interface */ | 
| Guido van Rossum | 1d5735e | 1994-08-30 08:27:36 +0000 | [diff] [blame] | 174 | #endif /* _M_IX86 */ | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 175 | { | 
| Guido van Rossum | 86bea46 | 1997-04-29 21:03:06 +0000 | [diff] [blame] | 176 | 	extern void Py_Exit Py_PROTO((int)); | 
| Guido van Rossum | f1dc566 | 1993-07-05 10:31:29 +0000 | [diff] [blame] | 177 | 	static char message[] = | 
 | 178 | "python: to interrupt a truly hanging Python program, interrupt once more.\n"; | 
 | 179 | 	switch (interrupted++) { | 
 | 180 | 	case 0: | 
 | 181 | 		break; | 
 | 182 | 	case 1: | 
 | 183 | 		write(2, message, strlen(message)); | 
 | 184 | 		break; | 
 | 185 | 	case 2: | 
 | 186 | 		interrupted = 0; | 
| Guido van Rossum | 86bea46 | 1997-04-29 21:03:06 +0000 | [diff] [blame] | 187 | 		Py_Exit(1); | 
| Guido van Rossum | f1dc566 | 1993-07-05 10:31:29 +0000 | [diff] [blame] | 188 | 		break; | 
 | 189 | 	} | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 190 | 	signal(SIGINT, intcatcher); | 
| Guido van Rossum | 86bea46 | 1997-04-29 21:03:06 +0000 | [diff] [blame] | 191 | 	Py_AddPendingCall(PyErr_CheckSignals, NULL); | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 192 | } | 
 | 193 |  | 
| Guido van Rossum | aee094c | 1997-08-02 03:02:27 +0000 | [diff] [blame] | 194 | static RETSIGTYPE (*old_siginthandler)() = SIG_DFL; | 
 | 195 |  | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 196 | void | 
| Guido van Rossum | 86bea46 | 1997-04-29 21:03:06 +0000 | [diff] [blame] | 197 | PyOS_InitInterrupts() | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 198 | { | 
| Guido van Rossum | aee094c | 1997-08-02 03:02:27 +0000 | [diff] [blame] | 199 | 	if ((old_siginthandler = signal(SIGINT, SIG_IGN)) != SIG_IGN) | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 200 | 		signal(SIGINT, intcatcher); | 
| Guido van Rossum | 1d5735e | 1994-08-30 08:27:36 +0000 | [diff] [blame] | 201 | #ifdef HAVE_SIGINTERRUPT | 
| Guido van Rossum | acbe8da | 1993-04-15 15:33:52 +0000 | [diff] [blame] | 202 | 	/* This is for SunOS and other modern BSD derivatives. | 
 | 203 | 	   It means that system calls (like read()) are not restarted | 
 | 204 | 	   after an interrupt.  This is necessary so interrupting a | 
 | 205 | 	   read() or readline() call works as expected. | 
 | 206 | 	   XXX On old BSD (pure 4.2 or older) you may have to do this | 
 | 207 | 	   differently! */ | 
 | 208 | 	siginterrupt(SIGINT, 1); | 
| Guido van Rossum | 1d5735e | 1994-08-30 08:27:36 +0000 | [diff] [blame] | 209 | #endif /* HAVE_SIGINTERRUPT */ | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 210 | } | 
 | 211 |  | 
| Guido van Rossum | aee094c | 1997-08-02 03:02:27 +0000 | [diff] [blame] | 212 | void | 
 | 213 | PyOS_FiniInterrupts() | 
 | 214 | { | 
 | 215 | 	signal(SIGINT, old_siginthandler); | 
 | 216 | } | 
 | 217 |  | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 218 | int | 
| Guido van Rossum | 86bea46 | 1997-04-29 21:03:06 +0000 | [diff] [blame] | 219 | PyOS_InterruptOccurred() | 
| Guido van Rossum | 85a5fbb | 1990-10-14 12:07:46 +0000 | [diff] [blame] | 220 | { | 
 | 221 | 	if (!interrupted) | 
 | 222 | 		return 0; | 
 | 223 | 	interrupted = 0; | 
 | 224 | 	return 1; | 
 | 225 | } | 
 | 226 |  | 
 | 227 | #endif /* !OK */ | 
| Guido van Rossum | 359bcaa | 1997-11-14 22:24:28 +0000 | [diff] [blame] | 228 |  | 
 | 229 | void | 
 | 230 | PyOS_AfterFork() | 
 | 231 | { | 
 | 232 | } |