| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 1 |  | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 2 | /* Signal module -- many thanks to Lance Ellinghaus */ | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 3 |  | 
| Guido van Rossum | 644a12b | 1997-04-09 19:24:53 +0000 | [diff] [blame] | 4 | /* XXX Signals should be recorded per thread, now we have thread state. */ | 
 | 5 |  | 
| Guido van Rossum | 602099a | 1994-09-14 13:32:22 +0000 | [diff] [blame] | 6 | #include "Python.h" | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 7 | #include "intrcheck.h" | 
 | 8 |  | 
| Martin v. Löwis | 6238d2b | 2002-06-30 15:26:10 +0000 | [diff] [blame] | 9 | #ifdef MS_WINDOWS | 
| Guido van Rossum | 644a12b | 1997-04-09 19:24:53 +0000 | [diff] [blame] | 10 | #include <process.h> | 
 | 11 | #endif | 
 | 12 |  | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 13 | #include <signal.h> | 
 | 14 |  | 
| Guido van Rossum | bb4ba12 | 1994-06-23 11:25:45 +0000 | [diff] [blame] | 15 | #ifndef SIG_ERR | 
| Guido van Rossum | d2cd7ad | 2000-09-16 16:35:28 +0000 | [diff] [blame] | 16 | #define SIG_ERR ((PyOS_sighandler_t)(-1)) | 
| Guido van Rossum | bb4ba12 | 1994-06-23 11:25:45 +0000 | [diff] [blame] | 17 | #endif | 
 | 18 |  | 
| Andrew MacIntyre | 7bf6833 | 2002-03-03 02:59:16 +0000 | [diff] [blame] | 19 | #if defined(PYOS_OS2) && !defined(PYCC_GCC) | 
| Guido van Rossum | 8e9ebfd | 1997-11-22 21:53:48 +0000 | [diff] [blame] | 20 | #define NSIG 12 | 
 | 21 | #include <process.h> | 
 | 22 | #endif | 
 | 23 |  | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 24 | #ifndef NSIG | 
| Marc-André Lemburg | 8bcfb8a | 2000-07-04 14:17:33 +0000 | [diff] [blame] | 25 | # if defined(_NSIG) | 
 | 26 | #  define NSIG _NSIG		/* For BSD/SysV */ | 
 | 27 | # elif defined(_SIGMAX) | 
 | 28 | #  define NSIG (_SIGMAX + 1)	/* For QNX */ | 
 | 29 | # elif defined(SIGMAX) | 
 | 30 | #  define NSIG (SIGMAX + 1)	/* For djgpp */ | 
 | 31 | # else | 
 | 32 | #  define NSIG 64		/* Use a reasonable default value */ | 
 | 33 | # endif | 
| Guido van Rossum | 3bbc62e | 1995-01-02 19:30:30 +0000 | [diff] [blame] | 34 | #endif | 
 | 35 |  | 
 | 36 |  | 
| Guido van Rossum | bb4ba12 | 1994-06-23 11:25:45 +0000 | [diff] [blame] | 37 | /* | 
 | 38 |    NOTES ON THE INTERACTION BETWEEN SIGNALS AND THREADS | 
 | 39 |  | 
 | 40 |    When threads are supported, we want the following semantics: | 
 | 41 |  | 
 | 42 |    - only the main thread can set a signal handler | 
 | 43 |    - any thread can get a signal handler | 
 | 44 |    - signals are only delivered to the main thread | 
 | 45 |  | 
 | 46 |    I.e. we don't support "synchronous signals" like SIGFPE (catching | 
 | 47 |    this doesn't make much sense in Python anyway) nor do we support | 
 | 48 |    signals as a means of inter-thread communication, since not all | 
 | 49 |    thread implementations support that (at least our thread library | 
 | 50 |    doesn't). | 
 | 51 |  | 
 | 52 |    We still have the problem that in some implementations signals | 
 | 53 |    generated by the keyboard (e.g. SIGINT) are delivered to all | 
 | 54 |    threads (e.g. SGI), while in others (e.g. Solaris) such signals are | 
 | 55 |    delivered to one random thread (an intermediate possibility would | 
| Guido van Rossum | a3c04b0 | 1995-01-12 11:29:01 +0000 | [diff] [blame] | 56 |    be to deliver it to the main thread -- POSIX?).  For now, we have | 
| Guido van Rossum | bb4ba12 | 1994-06-23 11:25:45 +0000 | [diff] [blame] | 57 |    a working implementation that works in all three cases -- the | 
 | 58 |    handler ignores signals if getpid() isn't the same as in the main | 
 | 59 |    thread.  XXX This is a hack. | 
 | 60 |  | 
| Guido van Rossum | 9e8181b | 2000-09-19 00:46:46 +0000 | [diff] [blame] | 61 |    GNU pth is a user-space threading library, and as such, all threads | 
 | 62 |    run within the same process. In this case, if the currently running | 
 | 63 |    thread is not the main_thread, send the signal to the main_thread. | 
| Guido van Rossum | bb4ba12 | 1994-06-23 11:25:45 +0000 | [diff] [blame] | 64 | */ | 
 | 65 |  | 
 | 66 | #ifdef WITH_THREAD | 
| Guido van Rossum | 295b8e5 | 1997-06-06 21:16:41 +0000 | [diff] [blame] | 67 | #include <sys/types.h> /* For pid_t */ | 
| Guido van Rossum | 49b5606 | 1998-10-01 20:42:43 +0000 | [diff] [blame] | 68 | #include "pythread.h" | 
| Guido van Rossum | bb4ba12 | 1994-06-23 11:25:45 +0000 | [diff] [blame] | 69 | static long main_thread; | 
 | 70 | static pid_t main_pid; | 
 | 71 | #endif | 
 | 72 |  | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 73 | static struct { | 
 | 74 |         int tripped; | 
 | 75 |         PyObject *func; | 
 | 76 | } Handlers[NSIG]; | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 77 |  | 
| Guido van Rossum | 47485a4 | 2007-12-10 23:03:55 +0000 | [diff] [blame] | 78 | /* Speed up sigcheck() when none tripped */ | 
 | 79 | static volatile sig_atomic_t is_tripped = 0; | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 80 |  | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 81 | static PyObject *DefaultHandler; | 
 | 82 | static PyObject *IgnoreHandler; | 
 | 83 | static PyObject *IntHandler; | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 84 |  | 
| Martin v. Löwis | f58de1b | 2001-03-06 12:13:56 +0000 | [diff] [blame] | 85 | /* On Solaris 8, gcc will produce a warning that the function | 
 | 86 |    declaration is not a prototype. This is caused by the definition of | 
 | 87 |    SIG_DFL as (void (*)())0; the correct declaration would have been | 
 | 88 |    (void (*)(int))0. */ | 
 | 89 |  | 
| Guido van Rossum | d2cd7ad | 2000-09-16 16:35:28 +0000 | [diff] [blame] | 90 | static PyOS_sighandler_t old_siginthandler = SIG_DFL; | 
| Guido van Rossum | 08c1661 | 1997-08-02 03:01:42 +0000 | [diff] [blame] | 91 |  | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 92 |  | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 93 | static PyObject * | 
| Peter Schneider-Kamp | e89b156 | 2000-07-10 12:04:18 +0000 | [diff] [blame] | 94 | signal_default_int_handler(PyObject *self, PyObject *args) | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 95 | { | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 96 | 	PyErr_SetNone(PyExc_KeyboardInterrupt); | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 97 | 	return NULL; | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 98 | } | 
 | 99 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 100 | PyDoc_STRVAR(default_int_handler_doc, | 
| Guido van Rossum | 1d8fb2d | 1998-06-28 16:54:49 +0000 | [diff] [blame] | 101 | "default_int_handler(...)\n\ | 
 | 102 | \n\ | 
| Michael W. Hudson | 24ec211 | 2004-06-17 15:55:53 +0000 | [diff] [blame] | 103 | The default handler for SIGINT installed by Python.\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 104 | It raises KeyboardInterrupt."); | 
| Guido van Rossum | 1d8fb2d | 1998-06-28 16:54:49 +0000 | [diff] [blame] | 105 |  | 
| Thomas Wouters | 0796b00 | 2000-07-22 23:49:30 +0000 | [diff] [blame] | 106 |  | 
 | 107 | static int | 
 | 108 | checksignals_witharg(void * unused) | 
 | 109 | { | 
 | 110 | 	return PyErr_CheckSignals(); | 
 | 111 | } | 
 | 112 |  | 
| Tim Peters | 4f1b208 | 2000-07-23 21:18:09 +0000 | [diff] [blame] | 113 | static void | 
| Peter Schneider-Kamp | e89b156 | 2000-07-10 12:04:18 +0000 | [diff] [blame] | 114 | signal_handler(int sig_num) | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 115 | { | 
| Guido van Rossum | bb4ba12 | 1994-06-23 11:25:45 +0000 | [diff] [blame] | 116 | #ifdef WITH_THREAD | 
| Guido van Rossum | 9e8181b | 2000-09-19 00:46:46 +0000 | [diff] [blame] | 117 | #ifdef WITH_PTH | 
 | 118 | 	if (PyThread_get_thread_ident() != main_thread) { | 
 | 119 | 		pth_raise(*(pth_t *) main_thread, sig_num); | 
 | 120 | 		return; | 
 | 121 | 	} | 
 | 122 | #endif | 
| Guido van Rossum | bb4ba12 | 1994-06-23 11:25:45 +0000 | [diff] [blame] | 123 | 	/* See NOTES section above */ | 
 | 124 | 	if (getpid() == main_pid) { | 
 | 125 | #endif | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 126 | 		Handlers[sig_num].tripped = 1; | 
| Guido van Rossum | 47485a4 | 2007-12-10 23:03:55 +0000 | [diff] [blame] | 127 |                 /* Set is_tripped after setting .tripped, as it gets | 
 | 128 |                    cleared in PyErr_CheckSignals() before .tripped. */ | 
 | 129 | 		is_tripped = 1; | 
| Thomas Wouters | 0796b00 | 2000-07-22 23:49:30 +0000 | [diff] [blame] | 130 | 		Py_AddPendingCall(checksignals_witharg, NULL); | 
| Guido van Rossum | bb4ba12 | 1994-06-23 11:25:45 +0000 | [diff] [blame] | 131 | #ifdef WITH_THREAD | 
 | 132 | 	} | 
 | 133 | #endif | 
| Guido van Rossum | 602099a | 1994-09-14 13:32:22 +0000 | [diff] [blame] | 134 | #ifdef SIGCHLD | 
 | 135 | 	if (sig_num == SIGCHLD) { | 
 | 136 | 		/* To avoid infinite recursion, this signal remains | 
 | 137 | 		   reset until explicit re-instated. | 
 | 138 | 		   Don't clear the 'func' field as it is our pointer | 
 | 139 | 		   to the Python handler... */ | 
| Tim Peters | 4f1b208 | 2000-07-23 21:18:09 +0000 | [diff] [blame] | 140 | 		return; | 
| Guido van Rossum | 602099a | 1994-09-14 13:32:22 +0000 | [diff] [blame] | 141 | 	} | 
 | 142 | #endif | 
| Guido van Rossum | d2cd7ad | 2000-09-16 16:35:28 +0000 | [diff] [blame] | 143 | 	PyOS_setsig(sig_num, signal_handler); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 144 | } | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 145 |  | 
| Guido van Rossum | 06d511d | 1995-03-10 15:13:48 +0000 | [diff] [blame] | 146 |  | 
| Guido van Rossum | 1171ee6 | 1997-08-22 20:42:00 +0000 | [diff] [blame] | 147 | #ifdef HAVE_ALARM | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 148 | static PyObject * | 
| Peter Schneider-Kamp | e89b156 | 2000-07-10 12:04:18 +0000 | [diff] [blame] | 149 | signal_alarm(PyObject *self, PyObject *args) | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 150 | { | 
 | 151 | 	int t; | 
| Neal Norwitz | ba3a16c | 2002-03-31 15:27:00 +0000 | [diff] [blame] | 152 | 	if (!PyArg_ParseTuple(args, "i:alarm", &t)) | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 153 | 		return NULL; | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 154 | 	/* alarm() returns the number of seconds remaining */ | 
| Fred Drake | dff3a37 | 2001-07-19 21:29:49 +0000 | [diff] [blame] | 155 | 	return PyInt_FromLong((long)alarm(t)); | 
| Guido van Rossum | aa0f4c7 | 1994-08-23 13:49:37 +0000 | [diff] [blame] | 156 | } | 
| Guido van Rossum | 1d8fb2d | 1998-06-28 16:54:49 +0000 | [diff] [blame] | 157 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 158 | PyDoc_STRVAR(alarm_doc, | 
| Guido van Rossum | 1d8fb2d | 1998-06-28 16:54:49 +0000 | [diff] [blame] | 159 | "alarm(seconds)\n\ | 
 | 160 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 161 | Arrange for SIGALRM to arrive after the given number of seconds."); | 
| Guido van Rossum | 06d511d | 1995-03-10 15:13:48 +0000 | [diff] [blame] | 162 | #endif | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 163 |  | 
| Guido van Rossum | 1171ee6 | 1997-08-22 20:42:00 +0000 | [diff] [blame] | 164 | #ifdef HAVE_PAUSE | 
| Guido van Rossum | a597dde | 1995-01-10 20:56:29 +0000 | [diff] [blame] | 165 | static PyObject * | 
| Neal Norwitz | 3a6f978 | 2002-03-25 20:46:46 +0000 | [diff] [blame] | 166 | signal_pause(PyObject *self) | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 167 | { | 
| Guido van Rossum | a597dde | 1995-01-10 20:56:29 +0000 | [diff] [blame] | 168 | 	Py_BEGIN_ALLOW_THREADS | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 169 | 	(void)pause(); | 
| Guido van Rossum | a597dde | 1995-01-10 20:56:29 +0000 | [diff] [blame] | 170 | 	Py_END_ALLOW_THREADS | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 171 | 	/* make sure that any exceptions that got raised are propagated | 
 | 172 | 	 * back into Python | 
 | 173 | 	 */ | 
 | 174 | 	if (PyErr_CheckSignals()) | 
 | 175 | 		return NULL; | 
 | 176 |  | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 177 | 	Py_INCREF(Py_None); | 
 | 178 | 	return Py_None; | 
 | 179 | } | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 180 | PyDoc_STRVAR(pause_doc, | 
| Barry Warsaw | 1ee36ff | 1998-07-21 22:41:18 +0000 | [diff] [blame] | 181 | "pause()\n\ | 
 | 182 | \n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 183 | Wait until a signal arrives."); | 
| Guido van Rossum | 1d8fb2d | 1998-06-28 16:54:49 +0000 | [diff] [blame] | 184 |  | 
| Guido van Rossum | 06d511d | 1995-03-10 15:13:48 +0000 | [diff] [blame] | 185 | #endif | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 186 |  | 
| Guido van Rossum | d2cd7ad | 2000-09-16 16:35:28 +0000 | [diff] [blame] | 187 |  | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 188 | static PyObject * | 
| Peter Schneider-Kamp | e89b156 | 2000-07-10 12:04:18 +0000 | [diff] [blame] | 189 | signal_signal(PyObject *self, PyObject *args) | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 190 | { | 
 | 191 | 	PyObject *obj; | 
 | 192 | 	int sig_num; | 
 | 193 | 	PyObject *old_handler; | 
| Tim Peters | 4f1b208 | 2000-07-23 21:18:09 +0000 | [diff] [blame] | 194 | 	void (*func)(int); | 
| Neal Norwitz | ba3a16c | 2002-03-31 15:27:00 +0000 | [diff] [blame] | 195 | 	if (!PyArg_ParseTuple(args, "iO:signal", &sig_num, &obj)) | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 196 | 		return NULL; | 
| Guido van Rossum | bb4ba12 | 1994-06-23 11:25:45 +0000 | [diff] [blame] | 197 | #ifdef WITH_THREAD | 
| Guido van Rossum | 65d5b57 | 1998-12-21 19:32:43 +0000 | [diff] [blame] | 198 | 	if (PyThread_get_thread_ident() != main_thread) { | 
| Guido van Rossum | f4b012a | 1995-03-16 15:43:29 +0000 | [diff] [blame] | 199 | 		PyErr_SetString(PyExc_ValueError, | 
 | 200 | 				"signal only works in main thread"); | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 201 | 		return NULL; | 
| Guido van Rossum | bb4ba12 | 1994-06-23 11:25:45 +0000 | [diff] [blame] | 202 | 	} | 
 | 203 | #endif | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 204 | 	if (sig_num < 1 || sig_num >= NSIG) { | 
| Guido van Rossum | f4b012a | 1995-03-16 15:43:29 +0000 | [diff] [blame] | 205 | 		PyErr_SetString(PyExc_ValueError, | 
 | 206 | 				"signal number out of range"); | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 207 | 		return NULL; | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 208 | 	} | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 209 | 	if (obj == IgnoreHandler) | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 210 | 		func = SIG_IGN; | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 211 | 	else if (obj == DefaultHandler) | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 212 | 		func = SIG_DFL; | 
| Guido van Rossum | f4b012a | 1995-03-16 15:43:29 +0000 | [diff] [blame] | 213 | 	else if (!PyCallable_Check(obj)) { | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 214 | 		PyErr_SetString(PyExc_TypeError, | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 215 | "signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object"); | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 216 | 		return NULL; | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 217 | 	} | 
 | 218 | 	else | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 219 | 		func = signal_handler; | 
| Guido van Rossum | d2cd7ad | 2000-09-16 16:35:28 +0000 | [diff] [blame] | 220 | 	if (PyOS_setsig(sig_num, func) == SIG_ERR) { | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 221 | 		PyErr_SetFromErrno(PyExc_RuntimeError); | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 222 | 		return NULL; | 
| Guido van Rossum | bb4ba12 | 1994-06-23 11:25:45 +0000 | [diff] [blame] | 223 | 	} | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 224 | 	old_handler = Handlers[sig_num].func; | 
 | 225 | 	Handlers[sig_num].tripped = 0; | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 226 | 	Py_INCREF(obj); | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 227 | 	Handlers[sig_num].func = obj; | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 228 | 	return old_handler; | 
 | 229 | } | 
 | 230 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 231 | PyDoc_STRVAR(signal_doc, | 
| Guido van Rossum | 1d8fb2d | 1998-06-28 16:54:49 +0000 | [diff] [blame] | 232 | "signal(sig, action) -> action\n\ | 
 | 233 | \n\ | 
 | 234 | Set the action for the given signal.  The action can be SIG_DFL,\n\ | 
 | 235 | SIG_IGN, or a callable Python object.  The previous action is\n\ | 
 | 236 | returned.  See getsignal() for possible return values.\n\ | 
 | 237 | \n\ | 
 | 238 | *** IMPORTANT NOTICE ***\n\ | 
 | 239 | A signal handler function is called with two arguments:\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 240 | the first is the signal number, the second is the interrupted stack frame."); | 
| Guido van Rossum | 1d8fb2d | 1998-06-28 16:54:49 +0000 | [diff] [blame] | 241 |  | 
| Guido van Rossum | d2cd7ad | 2000-09-16 16:35:28 +0000 | [diff] [blame] | 242 |  | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 243 | static PyObject * | 
| Peter Schneider-Kamp | e89b156 | 2000-07-10 12:04:18 +0000 | [diff] [blame] | 244 | signal_getsignal(PyObject *self, PyObject *args) | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 245 | { | 
 | 246 | 	int sig_num; | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 247 | 	PyObject *old_handler; | 
| Neal Norwitz | ba3a16c | 2002-03-31 15:27:00 +0000 | [diff] [blame] | 248 | 	if (!PyArg_ParseTuple(args, "i:getsignal", &sig_num)) | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 249 | 		return NULL; | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 250 | 	if (sig_num < 1 || sig_num >= NSIG) { | 
| Guido van Rossum | f4b012a | 1995-03-16 15:43:29 +0000 | [diff] [blame] | 251 | 		PyErr_SetString(PyExc_ValueError, | 
 | 252 | 				"signal number out of range"); | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 253 | 		return NULL; | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 254 | 	} | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 255 | 	old_handler = Handlers[sig_num].func; | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 256 | 	Py_INCREF(old_handler); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 257 | 	return old_handler; | 
 | 258 | } | 
 | 259 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 260 | PyDoc_STRVAR(getsignal_doc, | 
| Guido van Rossum | 1d8fb2d | 1998-06-28 16:54:49 +0000 | [diff] [blame] | 261 | "getsignal(sig) -> action\n\ | 
 | 262 | \n\ | 
 | 263 | Return the current action for the given signal.  The return value can be:\n\ | 
 | 264 | SIG_IGN -- if the signal is being ignored\n\ | 
 | 265 | SIG_DFL -- if the default action for the signal is in effect\n\ | 
 | 266 | None -- if an unknown handler is in effect\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 267 | anything else -- the callable Python object used as a handler"); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 268 |  | 
| Guido van Rossum | d2cd7ad | 2000-09-16 16:35:28 +0000 | [diff] [blame] | 269 |  | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 270 | /* List of functions defined in the module */ | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 271 | static PyMethodDef signal_methods[] = { | 
| Guido van Rossum | 1171ee6 | 1997-08-22 20:42:00 +0000 | [diff] [blame] | 272 | #ifdef HAVE_ALARM | 
| Neal Norwitz | ba3a16c | 2002-03-31 15:27:00 +0000 | [diff] [blame] | 273 | 	{"alarm",	        signal_alarm, METH_VARARGS, alarm_doc}, | 
| Guido van Rossum | 06d511d | 1995-03-10 15:13:48 +0000 | [diff] [blame] | 274 | #endif | 
| Neal Norwitz | ba3a16c | 2002-03-31 15:27:00 +0000 | [diff] [blame] | 275 | 	{"signal",	        signal_signal, METH_VARARGS, signal_doc}, | 
 | 276 | 	{"getsignal",	        signal_getsignal, METH_VARARGS, getsignal_doc}, | 
| Guido van Rossum | 1171ee6 | 1997-08-22 20:42:00 +0000 | [diff] [blame] | 277 | #ifdef HAVE_PAUSE | 
| Neil Schemenauer | 78662cf | 2002-03-28 21:04:14 +0000 | [diff] [blame] | 278 | 	{"pause",	        (PyCFunction)signal_pause, | 
 | 279 | 	 METH_NOARGS,pause_doc}, | 
| Guido van Rossum | 06d511d | 1995-03-10 15:13:48 +0000 | [diff] [blame] | 280 | #endif | 
| Andrew M. Kuchling | a1abb72 | 2000-08-03 02:34:44 +0000 | [diff] [blame] | 281 | 	{"default_int_handler", signal_default_int_handler,  | 
| Neal Norwitz | ba3a16c | 2002-03-31 15:27:00 +0000 | [diff] [blame] | 282 | 	 METH_VARARGS, default_int_handler_doc}, | 
| Guido van Rossum | 1d8fb2d | 1998-06-28 16:54:49 +0000 | [diff] [blame] | 283 | 	{NULL,			NULL}		/* sentinel */ | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 284 | }; | 
 | 285 |  | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 286 |  | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 287 | PyDoc_STRVAR(module_doc, | 
| Guido van Rossum | 1d8fb2d | 1998-06-28 16:54:49 +0000 | [diff] [blame] | 288 | "This module provides mechanisms to use signal handlers in Python.\n\ | 
 | 289 | \n\ | 
 | 290 | Functions:\n\ | 
 | 291 | \n\ | 
 | 292 | alarm() -- cause SIGALRM after a specified time [Unix only]\n\ | 
 | 293 | signal() -- set the action for a given signal\n\ | 
 | 294 | getsignal() -- get the signal action for a given signal\n\ | 
 | 295 | pause() -- wait until a signal arrives [Unix only]\n\ | 
 | 296 | default_int_handler() -- default SIGINT handler\n\ | 
 | 297 | \n\ | 
 | 298 | Constants:\n\ | 
 | 299 | \n\ | 
 | 300 | SIG_DFL -- used to refer to the system default handler\n\ | 
 | 301 | SIG_IGN -- used to ignore the signal\n\ | 
 | 302 | NSIG -- number of defined signals\n\ | 
 | 303 | \n\ | 
 | 304 | SIGINT, SIGTERM, etc. -- signal numbers\n\ | 
 | 305 | \n\ | 
 | 306 | *** IMPORTANT NOTICE ***\n\ | 
 | 307 | A signal handler function is called with two arguments:\n\ | 
| Martin v. Löwis | 14f8b4c | 2002-06-13 20:33:02 +0000 | [diff] [blame] | 308 | the first is the signal number, the second is the interrupted stack frame."); | 
| Guido van Rossum | 1d8fb2d | 1998-06-28 16:54:49 +0000 | [diff] [blame] | 309 |  | 
| Mark Hammond | fe51c6d | 2002-08-02 02:27:13 +0000 | [diff] [blame] | 310 | PyMODINIT_FUNC | 
| Thomas Wouters | f3f33dc | 2000-07-21 06:00:07 +0000 | [diff] [blame] | 311 | initsignal(void) | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 312 | { | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 313 | 	PyObject *m, *d, *x; | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 314 | 	int i; | 
| Guido van Rossum | bb4ba12 | 1994-06-23 11:25:45 +0000 | [diff] [blame] | 315 |  | 
 | 316 | #ifdef WITH_THREAD | 
| Guido van Rossum | 65d5b57 | 1998-12-21 19:32:43 +0000 | [diff] [blame] | 317 | 	main_thread = PyThread_get_thread_ident(); | 
| Guido van Rossum | bb4ba12 | 1994-06-23 11:25:45 +0000 | [diff] [blame] | 318 | 	main_pid = getpid(); | 
 | 319 | #endif | 
 | 320 |  | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 321 | 	/* Create the module and add the functions */ | 
| Guido van Rossum | 1d8fb2d | 1998-06-28 16:54:49 +0000 | [diff] [blame] | 322 | 	m = Py_InitModule3("signal", signal_methods, module_doc); | 
| Neal Norwitz | 1ac754f | 2006-01-19 06:09:39 +0000 | [diff] [blame] | 323 | 	if (m == NULL) | 
 | 324 | 		return; | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 325 |  | 
 | 326 | 	/* Add some symbolic constants to the module */ | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 327 | 	d = PyModule_GetDict(m); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 328 |  | 
| Guido van Rossum | 276fa43 | 2000-06-30 23:04:18 +0000 | [diff] [blame] | 329 | 	x = DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL); | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 330 |         if (!x || PyDict_SetItemString(d, "SIG_DFL", x) < 0) | 
 | 331 |                 goto finally; | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 332 |  | 
| Guido van Rossum | 276fa43 | 2000-06-30 23:04:18 +0000 | [diff] [blame] | 333 | 	x = IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN); | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 334 |         if (!x || PyDict_SetItemString(d, "SIG_IGN", x) < 0) | 
 | 335 |                 goto finally; | 
 | 336 |  | 
 | 337 |         x = PyInt_FromLong((long)NSIG); | 
 | 338 |         if (!x || PyDict_SetItemString(d, "NSIG", x) < 0) | 
 | 339 |                 goto finally; | 
| Guido van Rossum | 08c1661 | 1997-08-02 03:01:42 +0000 | [diff] [blame] | 340 |         Py_DECREF(x); | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 341 |  | 
 | 342 | 	x = IntHandler = PyDict_GetItemString(d, "default_int_handler"); | 
 | 343 |         if (!x) | 
 | 344 |                 goto finally; | 
| Guido van Rossum | 08c1661 | 1997-08-02 03:01:42 +0000 | [diff] [blame] | 345 | 	Py_INCREF(IntHandler); | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 346 |  | 
 | 347 | 	Handlers[0].tripped = 0; | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 348 | 	for (i = 1; i < NSIG; i++) { | 
| Tim Peters | 4f1b208 | 2000-07-23 21:18:09 +0000 | [diff] [blame] | 349 | 		void (*t)(int); | 
| Guido van Rossum | d2cd7ad | 2000-09-16 16:35:28 +0000 | [diff] [blame] | 350 | 		t = PyOS_getsig(i); | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 351 | 		Handlers[i].tripped = 0; | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 352 | 		if (t == SIG_DFL) | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 353 | 			Handlers[i].func = DefaultHandler; | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 354 | 		else if (t == SIG_IGN) | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 355 | 			Handlers[i].func = IgnoreHandler; | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 356 | 		else | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 357 | 			Handlers[i].func = Py_None; /* None of our business */ | 
 | 358 | 		Py_INCREF(Handlers[i].func); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 359 | 	} | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 360 | 	if (Handlers[SIGINT].func == DefaultHandler) { | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 361 | 		/* Install default int handler */ | 
| Guido van Rossum | 08c1661 | 1997-08-02 03:01:42 +0000 | [diff] [blame] | 362 | 		Py_INCREF(IntHandler); | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 363 | 		Py_DECREF(Handlers[SIGINT].func); | 
 | 364 | 		Handlers[SIGINT].func = IntHandler; | 
| Neal Norwitz | 4178515 | 2002-06-13 21:42:51 +0000 | [diff] [blame] | 365 | 		old_siginthandler = PyOS_setsig(SIGINT, signal_handler); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 366 | 	} | 
 | 367 |  | 
 | 368 | #ifdef SIGHUP | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 369 | 	x = PyInt_FromLong(SIGHUP); | 
 | 370 | 	PyDict_SetItemString(d, "SIGHUP", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 371 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 372 | #endif | 
 | 373 | #ifdef SIGINT | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 374 | 	x = PyInt_FromLong(SIGINT); | 
 | 375 | 	PyDict_SetItemString(d, "SIGINT", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 376 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 377 | #endif | 
| Tim Peters | 1ce3cf7 | 2001-10-01 17:58:40 +0000 | [diff] [blame] | 378 | #ifdef SIGBREAK | 
 | 379 | 	x = PyInt_FromLong(SIGBREAK); | 
 | 380 | 	PyDict_SetItemString(d, "SIGBREAK", x); | 
 | 381 |         Py_XDECREF(x); | 
 | 382 | #endif | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 383 | #ifdef SIGQUIT | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 384 | 	x = PyInt_FromLong(SIGQUIT); | 
 | 385 | 	PyDict_SetItemString(d, "SIGQUIT", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 386 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 387 | #endif | 
 | 388 | #ifdef SIGILL | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 389 | 	x = PyInt_FromLong(SIGILL); | 
 | 390 | 	PyDict_SetItemString(d, "SIGILL", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 391 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 392 | #endif | 
 | 393 | #ifdef SIGTRAP | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 394 | 	x = PyInt_FromLong(SIGTRAP); | 
 | 395 | 	PyDict_SetItemString(d, "SIGTRAP", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 396 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 397 | #endif | 
 | 398 | #ifdef SIGIOT | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 399 | 	x = PyInt_FromLong(SIGIOT); | 
 | 400 | 	PyDict_SetItemString(d, "SIGIOT", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 401 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 402 | #endif | 
 | 403 | #ifdef SIGABRT | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 404 | 	x = PyInt_FromLong(SIGABRT); | 
 | 405 | 	PyDict_SetItemString(d, "SIGABRT", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 406 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 407 | #endif | 
 | 408 | #ifdef SIGEMT | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 409 | 	x = PyInt_FromLong(SIGEMT); | 
 | 410 | 	PyDict_SetItemString(d, "SIGEMT", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 411 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 412 | #endif | 
 | 413 | #ifdef SIGFPE | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 414 | 	x = PyInt_FromLong(SIGFPE); | 
 | 415 | 	PyDict_SetItemString(d, "SIGFPE", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 416 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 417 | #endif | 
 | 418 | #ifdef SIGKILL | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 419 | 	x = PyInt_FromLong(SIGKILL); | 
 | 420 | 	PyDict_SetItemString(d, "SIGKILL", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 421 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 422 | #endif | 
 | 423 | #ifdef SIGBUS | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 424 | 	x = PyInt_FromLong(SIGBUS); | 
 | 425 | 	PyDict_SetItemString(d, "SIGBUS", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 426 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 427 | #endif | 
 | 428 | #ifdef SIGSEGV | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 429 | 	x = PyInt_FromLong(SIGSEGV); | 
 | 430 | 	PyDict_SetItemString(d, "SIGSEGV", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 431 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 432 | #endif | 
 | 433 | #ifdef SIGSYS | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 434 | 	x = PyInt_FromLong(SIGSYS); | 
 | 435 | 	PyDict_SetItemString(d, "SIGSYS", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 436 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 437 | #endif | 
 | 438 | #ifdef SIGPIPE | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 439 | 	x = PyInt_FromLong(SIGPIPE); | 
 | 440 | 	PyDict_SetItemString(d, "SIGPIPE", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 441 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 442 | #endif | 
 | 443 | #ifdef SIGALRM | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 444 | 	x = PyInt_FromLong(SIGALRM); | 
 | 445 | 	PyDict_SetItemString(d, "SIGALRM", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 446 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 447 | #endif | 
 | 448 | #ifdef SIGTERM | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 449 | 	x = PyInt_FromLong(SIGTERM); | 
 | 450 | 	PyDict_SetItemString(d, "SIGTERM", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 451 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 452 | #endif | 
 | 453 | #ifdef SIGUSR1 | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 454 | 	x = PyInt_FromLong(SIGUSR1); | 
 | 455 | 	PyDict_SetItemString(d, "SIGUSR1", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 456 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 457 | #endif | 
 | 458 | #ifdef SIGUSR2 | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 459 | 	x = PyInt_FromLong(SIGUSR2); | 
 | 460 | 	PyDict_SetItemString(d, "SIGUSR2", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 461 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 462 | #endif | 
 | 463 | #ifdef SIGCLD | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 464 | 	x = PyInt_FromLong(SIGCLD); | 
 | 465 | 	PyDict_SetItemString(d, "SIGCLD", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 466 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 467 | #endif | 
 | 468 | #ifdef SIGCHLD | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 469 | 	x = PyInt_FromLong(SIGCHLD); | 
 | 470 | 	PyDict_SetItemString(d, "SIGCHLD", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 471 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 472 | #endif | 
 | 473 | #ifdef SIGPWR | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 474 | 	x = PyInt_FromLong(SIGPWR); | 
 | 475 | 	PyDict_SetItemString(d, "SIGPWR", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 476 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 477 | #endif | 
 | 478 | #ifdef SIGIO | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 479 | 	x = PyInt_FromLong(SIGIO); | 
 | 480 | 	PyDict_SetItemString(d, "SIGIO", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 481 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 482 | #endif | 
 | 483 | #ifdef SIGURG | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 484 | 	x = PyInt_FromLong(SIGURG); | 
 | 485 | 	PyDict_SetItemString(d, "SIGURG", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 486 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 487 | #endif | 
 | 488 | #ifdef SIGWINCH | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 489 | 	x = PyInt_FromLong(SIGWINCH); | 
 | 490 | 	PyDict_SetItemString(d, "SIGWINCH", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 491 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 492 | #endif | 
 | 493 | #ifdef SIGPOLL | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 494 | 	x = PyInt_FromLong(SIGPOLL); | 
 | 495 | 	PyDict_SetItemString(d, "SIGPOLL", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 496 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 497 | #endif | 
 | 498 | #ifdef SIGSTOP | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 499 | 	x = PyInt_FromLong(SIGSTOP); | 
 | 500 | 	PyDict_SetItemString(d, "SIGSTOP", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 501 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 502 | #endif | 
 | 503 | #ifdef SIGTSTP | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 504 | 	x = PyInt_FromLong(SIGTSTP); | 
 | 505 | 	PyDict_SetItemString(d, "SIGTSTP", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 506 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 507 | #endif | 
 | 508 | #ifdef SIGCONT | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 509 | 	x = PyInt_FromLong(SIGCONT); | 
 | 510 | 	PyDict_SetItemString(d, "SIGCONT", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 511 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 512 | #endif | 
 | 513 | #ifdef SIGTTIN | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 514 | 	x = PyInt_FromLong(SIGTTIN); | 
 | 515 | 	PyDict_SetItemString(d, "SIGTTIN", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 516 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 517 | #endif | 
 | 518 | #ifdef SIGTTOU | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 519 | 	x = PyInt_FromLong(SIGTTOU); | 
 | 520 | 	PyDict_SetItemString(d, "SIGTTOU", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 521 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 522 | #endif | 
 | 523 | #ifdef SIGVTALRM | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 524 | 	x = PyInt_FromLong(SIGVTALRM); | 
 | 525 | 	PyDict_SetItemString(d, "SIGVTALRM", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 526 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 527 | #endif | 
 | 528 | #ifdef SIGPROF | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 529 | 	x = PyInt_FromLong(SIGPROF); | 
 | 530 | 	PyDict_SetItemString(d, "SIGPROF", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 531 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 532 | #endif | 
| Barry Warsaw | 14ed5fb | 1996-12-16 20:24:22 +0000 | [diff] [blame] | 533 | #ifdef SIGXCPU | 
 | 534 | 	x = PyInt_FromLong(SIGXCPU); | 
 | 535 | 	PyDict_SetItemString(d, "SIGXCPU", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 536 |         Py_XDECREF(x); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 537 | #endif | 
| Barry Warsaw | 14ed5fb | 1996-12-16 20:24:22 +0000 | [diff] [blame] | 538 | #ifdef SIGXFSZ | 
 | 539 | 	x = PyInt_FromLong(SIGXFSZ); | 
 | 540 | 	PyDict_SetItemString(d, "SIGXFSZ", x); | 
| Barry Warsaw | 73a75eb | 1997-01-09 23:50:28 +0000 | [diff] [blame] | 541 |         Py_XDECREF(x); | 
| Barry Warsaw | 14ed5fb | 1996-12-16 20:24:22 +0000 | [diff] [blame] | 542 | #endif | 
| Anthony Baxter | f37f37d | 2003-07-31 10:35:29 +0000 | [diff] [blame] | 543 | #ifdef SIGRTMIN | 
 | 544 |         x = PyInt_FromLong(SIGRTMIN); | 
 | 545 |         PyDict_SetItemString(d, "SIGRTMIN", x); | 
 | 546 |         Py_XDECREF(x); | 
 | 547 | #endif | 
 | 548 | #ifdef SIGRTMAX | 
 | 549 |         x = PyInt_FromLong(SIGRTMAX); | 
 | 550 |         PyDict_SetItemString(d, "SIGRTMAX", x); | 
 | 551 |         Py_XDECREF(x); | 
 | 552 | #endif | 
| Martin v. Löwis | 175af25 | 2002-01-12 11:43:25 +0000 | [diff] [blame] | 553 | #ifdef SIGINFO | 
 | 554 | 	x = PyInt_FromLong(SIGINFO); | 
 | 555 | 	PyDict_SetItemString(d, "SIGINFO", x); | 
 | 556 |         Py_XDECREF(x); | 
 | 557 | #endif | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 558 |         if (!PyErr_Occurred()) | 
 | 559 |                 return; | 
 | 560 |  | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 561 | 	/* Check for errors */ | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 562 |   finally: | 
| Guido van Rossum | 08c1661 | 1997-08-02 03:01:42 +0000 | [diff] [blame] | 563 |         return; | 
 | 564 | } | 
 | 565 |  | 
 | 566 | static void | 
| Thomas Wouters | f3f33dc | 2000-07-21 06:00:07 +0000 | [diff] [blame] | 567 | finisignal(void) | 
| Guido van Rossum | 08c1661 | 1997-08-02 03:01:42 +0000 | [diff] [blame] | 568 | { | 
 | 569 | 	int i; | 
| Guido van Rossum | 7ff20ac | 1997-11-03 21:53:55 +0000 | [diff] [blame] | 570 | 	PyObject *func; | 
| Guido van Rossum | 08c1661 | 1997-08-02 03:01:42 +0000 | [diff] [blame] | 571 |  | 
| Guido van Rossum | d2cd7ad | 2000-09-16 16:35:28 +0000 | [diff] [blame] | 572 | 	PyOS_setsig(SIGINT, old_siginthandler); | 
| Guido van Rossum | 7ff20ac | 1997-11-03 21:53:55 +0000 | [diff] [blame] | 573 | 	old_siginthandler = SIG_DFL; | 
| Guido van Rossum | 08c1661 | 1997-08-02 03:01:42 +0000 | [diff] [blame] | 574 |  | 
 | 575 | 	for (i = 1; i < NSIG; i++) { | 
| Guido van Rossum | 7ff20ac | 1997-11-03 21:53:55 +0000 | [diff] [blame] | 576 | 		func = Handlers[i].func; | 
| Guido van Rossum | 08c1661 | 1997-08-02 03:01:42 +0000 | [diff] [blame] | 577 | 		Handlers[i].tripped = 0; | 
| Guido van Rossum | 08c1661 | 1997-08-02 03:01:42 +0000 | [diff] [blame] | 578 | 		Handlers[i].func = NULL; | 
| Guido van Rossum | 7ff20ac | 1997-11-03 21:53:55 +0000 | [diff] [blame] | 579 | 		if (i != SIGINT && func != NULL && func != Py_None && | 
 | 580 | 		    func != DefaultHandler && func != IgnoreHandler) | 
| Guido van Rossum | d2cd7ad | 2000-09-16 16:35:28 +0000 | [diff] [blame] | 581 | 			PyOS_setsig(i, SIG_DFL); | 
| Guido van Rossum | 7ff20ac | 1997-11-03 21:53:55 +0000 | [diff] [blame] | 582 | 		Py_XDECREF(func); | 
| Guido van Rossum | 08c1661 | 1997-08-02 03:01:42 +0000 | [diff] [blame] | 583 | 	} | 
 | 584 |  | 
 | 585 | 	Py_XDECREF(IntHandler); | 
 | 586 | 	IntHandler = NULL; | 
 | 587 | 	Py_XDECREF(DefaultHandler); | 
 | 588 | 	DefaultHandler = NULL; | 
 | 589 | 	Py_XDECREF(IgnoreHandler); | 
 | 590 | 	IgnoreHandler = NULL; | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 591 | } | 
 | 592 |  | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 593 |  | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 594 | /* Declared in pyerrors.h */ | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 595 | int | 
| Thomas Wouters | f3f33dc | 2000-07-21 06:00:07 +0000 | [diff] [blame] | 596 | PyErr_CheckSignals(void) | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 597 | { | 
 | 598 | 	int i; | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 599 | 	PyObject *f; | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 600 |  | 
 | 601 | 	if (!is_tripped) | 
| Guido van Rossum | 6299d1e | 1994-05-31 12:51:13 +0000 | [diff] [blame] | 602 | 		return 0; | 
| Guido van Rossum | 47485a4 | 2007-12-10 23:03:55 +0000 | [diff] [blame] | 603 |  | 
| Guido van Rossum | bb4ba12 | 1994-06-23 11:25:45 +0000 | [diff] [blame] | 604 | #ifdef WITH_THREAD | 
| Guido van Rossum | 65d5b57 | 1998-12-21 19:32:43 +0000 | [diff] [blame] | 605 | 	if (PyThread_get_thread_ident() != main_thread) | 
| Guido van Rossum | bb4ba12 | 1994-06-23 11:25:45 +0000 | [diff] [blame] | 606 | 		return 0; | 
 | 607 | #endif | 
| Guido van Rossum | 47485a4 | 2007-12-10 23:03:55 +0000 | [diff] [blame] | 608 |  | 
 | 609 | 	/* | 
 | 610 | 	 * The is_stripped variable is meant to speed up the calls to | 
 | 611 | 	 * PyErr_CheckSignals (both directly or via pending calls) when no | 
 | 612 | 	 * signal has arrived. This variable is set to 1 when a signal arrives | 
 | 613 | 	 * and it is set to 0 here, when we know some signals arrived. This way | 
 | 614 | 	 * we can run the registered handlers with no signals blocked. | 
 | 615 | 	 * | 
 | 616 | 	 * NOTE: with this approach we can have a situation where is_tripped is | 
 | 617 | 	 *       1 but we have no more signals to handle (Handlers[i].tripped | 
 | 618 | 	 *       is 0 for every signal i). This won't do us any harm (except | 
 | 619 | 	 *       we're gonna spent some cycles for nothing). This happens when | 
 | 620 | 	 *       we receive a signal i after we zero is_tripped and before we | 
 | 621 | 	 *       check Handlers[i].tripped. | 
 | 622 | 	 */ | 
 | 623 | 	is_tripped = 0; | 
 | 624 |  | 
| Guido van Rossum | 6297a7a | 2003-02-19 15:53:17 +0000 | [diff] [blame] | 625 | 	if (!(f = (PyObject *)PyEval_GetFrame())) | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 626 | 		f = Py_None; | 
| Guido van Rossum | 47485a4 | 2007-12-10 23:03:55 +0000 | [diff] [blame] | 627 |  | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 628 | 	for (i = 1; i < NSIG; i++) { | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 629 | 		if (Handlers[i].tripped) { | 
 | 630 | 			PyObject *result = NULL; | 
 | 631 | 			PyObject *arglist = Py_BuildValue("(iO)", i, f); | 
 | 632 | 			Handlers[i].tripped = 0; | 
 | 633 |  | 
 | 634 | 			if (arglist) { | 
 | 635 | 				result = PyEval_CallObject(Handlers[i].func, | 
 | 636 | 							   arglist); | 
| Guido van Rossum | e4485b0 | 1994-09-07 14:32:49 +0000 | [diff] [blame] | 637 | 				Py_DECREF(arglist); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 638 | 			} | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 639 | 			if (!result) | 
| Guido van Rossum | fcdd0e4 | 1997-01-21 06:13:09 +0000 | [diff] [blame] | 640 | 				return -1; | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 641 |  | 
 | 642 | 			Py_DECREF(result); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 643 | 		} | 
 | 644 | 	} | 
| Guido van Rossum | 47485a4 | 2007-12-10 23:03:55 +0000 | [diff] [blame] | 645 |  | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 646 | 	return 0; | 
 | 647 | } | 
 | 648 |  | 
| Guido van Rossum | d2cd7ad | 2000-09-16 16:35:28 +0000 | [diff] [blame] | 649 |  | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 650 | /* Replacements for intrcheck.c functionality | 
 | 651 |  * Declared in pyerrors.h | 
 | 652 |  */ | 
 | 653 | void | 
| Thomas Wouters | f3f33dc | 2000-07-21 06:00:07 +0000 | [diff] [blame] | 654 | PyErr_SetInterrupt(void) | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 655 | { | 
| Guido van Rossum | 47485a4 | 2007-12-10 23:03:55 +0000 | [diff] [blame] | 656 | 	is_tripped = 1; | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 657 | 	Handlers[SIGINT].tripped = 1; | 
| Thomas Wouters | 334fb89 | 2000-07-25 12:56:38 +0000 | [diff] [blame] | 658 | 	Py_AddPendingCall((int (*)(void *))PyErr_CheckSignals, NULL); | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 659 | } | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 660 |  | 
 | 661 | void | 
| Thomas Wouters | f3f33dc | 2000-07-21 06:00:07 +0000 | [diff] [blame] | 662 | PyOS_InitInterrupts(void) | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 663 | { | 
 | 664 | 	initsignal(); | 
| Guido van Rossum | 08c1661 | 1997-08-02 03:01:42 +0000 | [diff] [blame] | 665 | 	_PyImport_FixupExtension("signal", "signal"); | 
 | 666 | } | 
 | 667 |  | 
 | 668 | void | 
| Thomas Wouters | f3f33dc | 2000-07-21 06:00:07 +0000 | [diff] [blame] | 669 | PyOS_FiniInterrupts(void) | 
| Guido van Rossum | 08c1661 | 1997-08-02 03:01:42 +0000 | [diff] [blame] | 670 | { | 
 | 671 | 	finisignal(); | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 672 | } | 
 | 673 |  | 
 | 674 | int | 
| Thomas Wouters | f3f33dc | 2000-07-21 06:00:07 +0000 | [diff] [blame] | 675 | PyOS_InterruptOccurred(void) | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 676 | { | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 677 | 	if (Handlers[SIGINT].tripped) { | 
| Guido van Rossum | bb4ba12 | 1994-06-23 11:25:45 +0000 | [diff] [blame] | 678 | #ifdef WITH_THREAD | 
| Guido van Rossum | 65d5b57 | 1998-12-21 19:32:43 +0000 | [diff] [blame] | 679 | 		if (PyThread_get_thread_ident() != main_thread) | 
| Guido van Rossum | bb4ba12 | 1994-06-23 11:25:45 +0000 | [diff] [blame] | 680 | 			return 0; | 
 | 681 | #endif | 
| Barry Warsaw | 9297117 | 1997-01-03 00:14:25 +0000 | [diff] [blame] | 682 | 		Handlers[SIGINT].tripped = 0; | 
| Guido van Rossum | 6299d1e | 1994-05-31 12:51:13 +0000 | [diff] [blame] | 683 | 		return 1; | 
 | 684 | 	} | 
 | 685 | 	return 0; | 
| Guido van Rossum | 398d9fe | 1994-05-11 08:59:13 +0000 | [diff] [blame] | 686 | } | 
| Guido van Rossum | 359bcaa | 1997-11-14 22:24:28 +0000 | [diff] [blame] | 687 |  | 
 | 688 | void | 
| Thomas Wouters | f3f33dc | 2000-07-21 06:00:07 +0000 | [diff] [blame] | 689 | PyOS_AfterFork(void) | 
| Guido van Rossum | 359bcaa | 1997-11-14 22:24:28 +0000 | [diff] [blame] | 690 | { | 
 | 691 | #ifdef WITH_THREAD | 
| Guido van Rossum | fee3a2d | 2000-08-27 17:34:07 +0000 | [diff] [blame] | 692 | 	PyEval_ReInitThreads(); | 
| Guido van Rossum | 65d5b57 | 1998-12-21 19:32:43 +0000 | [diff] [blame] | 693 | 	main_thread = PyThread_get_thread_ident(); | 
| Guido van Rossum | 359bcaa | 1997-11-14 22:24:28 +0000 | [diff] [blame] | 694 | 	main_pid = getpid(); | 
| Guido van Rossum | 8ee3e5a | 2005-09-14 18:09:42 +0000 | [diff] [blame] | 695 | 	_PyImport_ReInitLock(); | 
| Guido van Rossum | 359bcaa | 1997-11-14 22:24:28 +0000 | [diff] [blame] | 696 | #endif | 
 | 697 | } |