blob: 2a6f16c87f119175ab1780211f7c671a07dd4a02 [file] [log] [blame]
Guido van Rossuma027efa1997-05-05 20:56:21 +00001
2/* Thread and interpreter state structures and their interfaces */
3
4#include "Python.h"
5
Tim Peters84705582004-10-10 02:47:33 +00006/* --------------------------------------------------------------------------
7CAUTION
8
9Always use malloc() and free() directly in this file. A number of these
10functions are advertised as safe to call when the GIL isn't held, and in
11a debug build Python redirects (e.g.) PyMem_NEW (etc) to Python's debugging
12obmalloc functions. Those aren't thread-safe (they rely on the GIL to avoid
13the expense of doing their own locking).
14-------------------------------------------------------------------------- */
15
Martin v. Löwisf0473d52001-07-18 16:17:16 +000016#ifdef HAVE_DLOPEN
17#ifdef HAVE_DLFCN_H
18#include <dlfcn.h>
19#endif
20#ifndef RTLD_LAZY
21#define RTLD_LAZY 1
22#endif
23#endif
24
Benjamin Peterson43162b82012-04-13 11:58:27 -040025#ifdef __cplusplus
26extern "C" {
27#endif
Martin v. Löwisf0473d52001-07-18 16:17:16 +000028
Guido van Rossum1d5ad901999-06-18 14:22:24 +000029#ifdef WITH_THREAD
30#include "pythread.h"
31static PyThread_type_lock head_mutex = NULL; /* Protects interp->tstate_head */
Moshe Zadka9fb6af92000-08-04 21:27:47 +000032#define HEAD_INIT() (void)(head_mutex || (head_mutex = PyThread_allocate_lock()))
Guido van Rossum1d5ad901999-06-18 14:22:24 +000033#define HEAD_LOCK() PyThread_acquire_lock(head_mutex, WAIT_LOCK)
34#define HEAD_UNLOCK() PyThread_release_lock(head_mutex)
Michael W. Hudson188d4362005-06-20 16:52:57 +000035
36/* The single PyInterpreterState used by this process'
37 GILState implementation
38*/
39static PyInterpreterState *autoInterpreterState = NULL;
40static int autoTLSkey = 0;
Guido van Rossum1d5ad901999-06-18 14:22:24 +000041#else
42#define HEAD_INIT() /* Nothing */
43#define HEAD_LOCK() /* Nothing */
44#define HEAD_UNLOCK() /* Nothing */
45#endif
46
Guido van Rossum25ce5661997-08-02 03:10:38 +000047static PyInterpreterState *interp_head = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +000048
Jeffrey Yasskin39370832010-05-03 19:29:34 +000049/* Assuming the current thread holds the GIL, this is the
50 PyThreadState for the current thread. */
51_Py_atomic_address _PyThreadState_Current = {NULL};
Guido van Rossum6297a7a2003-02-19 15:53:17 +000052PyThreadFrameGetter _PyThreadState_GetFrame = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +000053
Michael W. Hudsonce7da6c2005-09-30 08:20:24 +000054#ifdef WITH_THREAD
Michael W. Hudson188d4362005-06-20 16:52:57 +000055static void _PyGILState_NoteThreadState(PyThreadState* tstate);
Michael W. Hudsonce7da6c2005-09-30 08:20:24 +000056#endif
Michael W. Hudson188d4362005-06-20 16:52:57 +000057
Guido van Rossuma027efa1997-05-05 20:56:21 +000058
59PyInterpreterState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000060PyInterpreterState_New(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +000061{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 PyInterpreterState *interp = (PyInterpreterState *)
63 malloc(sizeof(PyInterpreterState));
Guido van Rossum25ce5661997-08-02 03:10:38 +000064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 if (interp != NULL) {
66 HEAD_INIT();
Thomas Wouters0e3f5912006-08-11 14:57:12 +000067#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000068 if (head_mutex == NULL)
69 Py_FatalError("Can't initialize threads for interpreter");
Thomas Wouters0e3f5912006-08-11 14:57:12 +000070#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000071 interp->modules = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 interp->modules_by_index = NULL;
73 interp->sysdict = NULL;
74 interp->builtins = NULL;
75 interp->tstate_head = NULL;
76 interp->codec_search_path = NULL;
77 interp->codec_search_cache = NULL;
78 interp->codec_error_registry = NULL;
79 interp->codecs_initialized = 0;
Victor Stinner3cbf14b2011-04-27 00:24:21 +020080 interp->fscodec_initialized = 0;
Brett Cannonfd074152012-04-14 14:10:13 -040081 interp->importlib = NULL;
Martin v. Löwisf0473d52001-07-18 16:17:16 +000082#ifdef HAVE_DLOPEN
83#ifdef RTLD_NOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000084 interp->dlopenflags = RTLD_NOW;
Martin v. Löwisf0473d52001-07-18 16:17:16 +000085#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000086 interp->dlopenflags = RTLD_LAZY;
Martin v. Löwisf0473d52001-07-18 16:17:16 +000087#endif
88#endif
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000089#ifdef WITH_TSC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000090 interp->tscdump = 0;
Martin v. Löwisf30d60e2004-06-08 08:17:44 +000091#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +000092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000093 HEAD_LOCK();
94 interp->next = interp_head;
95 interp_head = interp;
96 HEAD_UNLOCK();
97 }
Guido van Rossum25ce5661997-08-02 03:10:38 +000098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000099 return interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000100}
101
102
103void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000104PyInterpreterState_Clear(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000105{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000106 PyThreadState *p;
107 HEAD_LOCK();
108 for (p = interp->tstate_head; p != NULL; p = p->next)
109 PyThreadState_Clear(p);
110 HEAD_UNLOCK();
111 Py_CLEAR(interp->codec_search_path);
112 Py_CLEAR(interp->codec_search_cache);
113 Py_CLEAR(interp->codec_error_registry);
114 Py_CLEAR(interp->modules);
115 Py_CLEAR(interp->modules_by_index);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 Py_CLEAR(interp->sysdict);
117 Py_CLEAR(interp->builtins);
Brett Cannonfd074152012-04-14 14:10:13 -0400118 Py_CLEAR(interp->importlib);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000119}
120
121
122static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000123zapthreads(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 PyThreadState *p;
126 /* No need to lock the mutex here because this should only happen
127 when the threads are all really dead (XXX famous last words). */
128 while ((p = interp->tstate_head) != NULL) {
129 PyThreadState_Delete(p);
130 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000131}
132
133
134void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000135PyInterpreterState_Delete(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 PyInterpreterState **p;
138 zapthreads(interp);
139 HEAD_LOCK();
140 for (p = &interp_head; ; p = &(*p)->next) {
141 if (*p == NULL)
142 Py_FatalError(
143 "PyInterpreterState_Delete: invalid interp");
144 if (*p == interp)
145 break;
146 }
147 if (interp->tstate_head != NULL)
148 Py_FatalError("PyInterpreterState_Delete: remaining threads");
149 *p = interp->next;
150 HEAD_UNLOCK();
151 free(interp);
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100152#ifdef WITH_THREAD
153 if (interp_head == NULL && head_mutex != NULL) {
154 PyThread_free_lock(head_mutex);
155 head_mutex = NULL;
156 }
157#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000158}
159
160
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000161/* Default implementation for _PyThreadState_GetFrame */
162static struct _frame *
163threadstate_getframe(PyThreadState *self)
164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 return self->frame;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000166}
167
Victor Stinner45b9be52010-03-03 23:28:07 +0000168static PyThreadState *
169new_threadstate(PyInterpreterState *interp, int init)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000171 PyThreadState *tstate = (PyThreadState *)malloc(sizeof(PyThreadState));
Tim Peters84705582004-10-10 02:47:33 +0000172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000173 if (_PyThreadState_GetFrame == NULL)
174 _PyThreadState_GetFrame = threadstate_getframe;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000176 if (tstate != NULL) {
177 tstate->interp = interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000179 tstate->frame = NULL;
180 tstate->recursion_depth = 0;
181 tstate->overflowed = 0;
182 tstate->recursion_critical = 0;
183 tstate->tracing = 0;
184 tstate->use_tracing = 0;
185 tstate->tick_counter = 0;
186 tstate->gilstate_counter = 0;
187 tstate->async_exc = NULL;
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000188#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000189 tstate->thread_id = PyThread_get_thread_ident();
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000190#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 tstate->thread_id = 0;
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000192#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 tstate->dict = NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000196 tstate->curexc_type = NULL;
197 tstate->curexc_value = NULL;
198 tstate->curexc_traceback = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 tstate->exc_type = NULL;
201 tstate->exc_value = NULL;
202 tstate->exc_traceback = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 tstate->c_profilefunc = NULL;
205 tstate->c_tracefunc = NULL;
206 tstate->c_profileobj = NULL;
207 tstate->c_traceobj = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000208
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200209 tstate->trash_delete_nesting = 0;
210 tstate->trash_delete_later = NULL;
211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000212 if (init)
213 _PyThreadState_Init(tstate);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 HEAD_LOCK();
216 tstate->next = interp->tstate_head;
217 interp->tstate_head = tstate;
218 HEAD_UNLOCK();
219 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000221 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000222}
223
Victor Stinner45b9be52010-03-03 23:28:07 +0000224PyThreadState *
225PyThreadState_New(PyInterpreterState *interp)
226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 return new_threadstate(interp, 1);
Victor Stinner45b9be52010-03-03 23:28:07 +0000228}
229
230PyThreadState *
231_PyThreadState_Prealloc(PyInterpreterState *interp)
232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 return new_threadstate(interp, 0);
Victor Stinner45b9be52010-03-03 23:28:07 +0000234}
235
236void
237_PyThreadState_Init(PyThreadState *tstate)
238{
239#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000240 _PyGILState_NoteThreadState(tstate);
Victor Stinner45b9be52010-03-03 23:28:07 +0000241#endif
242}
243
Martin v. Löwis1a214512008-06-11 05:26:20 +0000244PyObject*
Martin v. Löwis7800f752012-06-22 12:20:55 +0200245PyState_FindModule(struct PyModuleDef* module)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000246{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200247 Py_ssize_t index = module->m_base.m_index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000248 PyInterpreterState *state = PyThreadState_GET()->interp;
249 PyObject *res;
250 if (index == 0)
251 return NULL;
252 if (state->modules_by_index == NULL)
253 return NULL;
Antoine Pitrou75506e82012-08-20 19:30:46 +0200254 if (index >= PyList_GET_SIZE(state->modules_by_index))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000255 return NULL;
256 res = PyList_GET_ITEM(state->modules_by_index, index);
257 return res==Py_None ? NULL : res;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000258}
259
260int
261_PyState_AddModule(PyObject* module, struct PyModuleDef* def)
262{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 PyInterpreterState *state = PyThreadState_GET()->interp;
264 if (!def)
265 return -1;
266 if (!state->modules_by_index) {
267 state->modules_by_index = PyList_New(0);
268 if (!state->modules_by_index)
269 return -1;
270 }
271 while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
272 if (PyList_Append(state->modules_by_index, Py_None) < 0)
273 return -1;
274 Py_INCREF(module);
275 return PyList_SetItem(state->modules_by_index,
276 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000277}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000278
Martin v. Löwis7800f752012-06-22 12:20:55 +0200279int
280PyState_AddModule(PyObject* module, struct PyModuleDef* def)
281{
282 Py_ssize_t index;
283 PyInterpreterState *state = PyThreadState_GET()->interp;
284 if (!def) {
285 Py_FatalError("PyState_AddModule: Module Definition is NULL");
286 return -1;
287 }
288 index = def->m_base.m_index;
289 if (state->modules_by_index) {
290 if(PyList_GET_SIZE(state->modules_by_index) >= index) {
291 if(module == PyList_GET_ITEM(state->modules_by_index, index)) {
292 Py_FatalError("PyState_AddModule: Module already added!");
293 return -1;
294 }
295 }
296 }
297 return _PyState_AddModule(module, def);
298}
299
300int
301PyState_RemoveModule(struct PyModuleDef* def)
302{
303 Py_ssize_t index = def->m_base.m_index;
304 PyInterpreterState *state = PyThreadState_GET()->interp;
305 if (index == 0) {
306 Py_FatalError("PyState_RemoveModule: Module index invalid.");
307 return -1;
308 }
309 if (state->modules_by_index == NULL) {
310 Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible.");
311 return -1;
312 }
313 if (index > PyList_GET_SIZE(state->modules_by_index)) {
314 Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
315 return -1;
316 }
317 return PyList_SetItem(state->modules_by_index, index, Py_None);
318}
319
Guido van Rossuma027efa1997-05-05 20:56:21 +0000320void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000321PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000322{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000323 if (Py_VerboseFlag && tstate->frame != NULL)
324 fprintf(stderr,
325 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327 Py_CLEAR(tstate->frame);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000329 Py_CLEAR(tstate->dict);
330 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 Py_CLEAR(tstate->curexc_type);
333 Py_CLEAR(tstate->curexc_value);
334 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 Py_CLEAR(tstate->exc_type);
337 Py_CLEAR(tstate->exc_value);
338 Py_CLEAR(tstate->exc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 tstate->c_profilefunc = NULL;
341 tstate->c_tracefunc = NULL;
342 Py_CLEAR(tstate->c_profileobj);
343 Py_CLEAR(tstate->c_traceobj);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000344}
345
346
Guido van Rossum29757862001-01-23 01:46:06 +0000347/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
348static void
349tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000351 PyInterpreterState *interp;
352 PyThreadState **p;
353 PyThreadState *prev_p = NULL;
354 if (tstate == NULL)
355 Py_FatalError("PyThreadState_Delete: NULL tstate");
356 interp = tstate->interp;
357 if (interp == NULL)
358 Py_FatalError("PyThreadState_Delete: NULL interp");
359 HEAD_LOCK();
360 for (p = &interp->tstate_head; ; p = &(*p)->next) {
361 if (*p == NULL)
362 Py_FatalError(
363 "PyThreadState_Delete: invalid tstate");
364 if (*p == tstate)
365 break;
366 /* Sanity check. These states should never happen but if
367 * they do we must abort. Otherwise we'll end up spinning in
368 * in a tight loop with the lock held. A similar check is done
369 * in thread.c find_key(). */
370 if (*p == prev_p)
371 Py_FatalError(
372 "PyThreadState_Delete: small circular list(!)"
373 " and tstate not found.");
374 prev_p = *p;
375 if ((*p)->next == interp->tstate_head)
376 Py_FatalError(
377 "PyThreadState_Delete: circular list(!) and"
378 " tstate not found.");
379 }
380 *p = tstate->next;
381 HEAD_UNLOCK();
382 free(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000383}
384
385
Guido van Rossum29757862001-01-23 01:46:06 +0000386void
387PyThreadState_Delete(PyThreadState *tstate)
388{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 if (tstate == _Py_atomic_load_relaxed(&_PyThreadState_Current))
390 Py_FatalError("PyThreadState_Delete: tstate is still current");
391 tstate_delete_common(tstate);
Tim Petersf4e69282006-02-27 17:15:31 +0000392#ifdef WITH_THREAD
Antoine Pitrou079ce542010-09-08 12:37:10 +0000393 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 PyThread_delete_key_value(autoTLSkey);
Tim Petersf4e69282006-02-27 17:15:31 +0000395#endif /* WITH_THREAD */
Guido van Rossum29757862001-01-23 01:46:06 +0000396}
397
398
399#ifdef WITH_THREAD
400void
401PyThreadState_DeleteCurrent()
402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000403 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
404 &_PyThreadState_Current);
405 if (tstate == NULL)
406 Py_FatalError(
407 "PyThreadState_DeleteCurrent: no current tstate");
408 _Py_atomic_store_relaxed(&_PyThreadState_Current, NULL);
409 tstate_delete_common(tstate);
Antoine Pitrou079ce542010-09-08 12:37:10 +0000410 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000411 PyThread_delete_key_value(autoTLSkey);
412 PyEval_ReleaseLock();
Guido van Rossum29757862001-01-23 01:46:06 +0000413}
414#endif /* WITH_THREAD */
415
416
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200417/*
418 * Delete all thread states except the one passed as argument.
419 * Note that, if there is a current thread state, it *must* be the one
420 * passed as argument. Also, this won't touch any other interpreters
421 * than the current one, since we don't know which thread state should
422 * be kept in those other interpreteres.
423 */
424void
425_PyThreadState_DeleteExcept(PyThreadState *tstate)
426{
427 PyInterpreterState *interp = tstate->interp;
428 PyThreadState *p, *next, *garbage;
429 HEAD_LOCK();
430 /* Remove all thread states, except tstate, from the linked list of
431 thread states. This will allow calling PyThreadState_Clear()
432 without holding the lock.
433 XXX This would be simpler with a doubly-linked list. */
434 garbage = interp->tstate_head;
435 interp->tstate_head = tstate;
436 if (garbage == tstate) {
437 garbage = garbage->next;
438 tstate->next = NULL;
439 }
440 else {
441 for (p = garbage; p; p = p->next) {
442 if (p->next == tstate) {
443 p->next = tstate->next;
444 tstate->next = NULL;
445 break;
446 }
447 }
448 }
449 if (tstate->next != NULL)
450 Py_FatalError("_PyThreadState_DeleteExcept: tstate not found "
451 "in interpreter thread states");
452 HEAD_UNLOCK();
453 /* Clear and deallocate all stale thread states. Even if this
454 executes Python code, we should be safe since it executes
455 in the current thread, not one of the stale threads. */
456 for (p = garbage; p; p = next) {
457 next = p->next;
458 PyThreadState_Clear(p);
459 free(p);
460 }
461}
462
463
Guido van Rossuma027efa1997-05-05 20:56:21 +0000464PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000465PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000466{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
468 &_PyThreadState_Current);
469 if (tstate == NULL)
470 Py_FatalError("PyThreadState_Get: no current thread");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000472 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000473}
474
475
476PyThreadState *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000477PyThreadState_Swap(PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000478{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 PyThreadState *oldts = (PyThreadState*)_Py_atomic_load_relaxed(
480 &_PyThreadState_Current);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 _Py_atomic_store_relaxed(&_PyThreadState_Current, newts);
483 /* It should not be possible for more than one thread state
484 to be used for a thread. Check this the best we can in debug
485 builds.
486 */
Martin v. Löwis9e296252003-05-01 05:25:29 +0000487#if defined(Py_DEBUG) && defined(WITH_THREAD)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 if (newts) {
489 /* This can be called from PyEval_RestoreThread(). Similar
490 to it, we need to ensure errno doesn't change.
491 */
492 int err = errno;
493 PyThreadState *check = PyGILState_GetThisThreadState();
494 if (check && check->interp == newts->interp && check != newts)
495 Py_FatalError("Invalid thread state for this thread");
496 errno = err;
497 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000498#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000500}
Guido van Rossumede04391998-04-10 20:18:25 +0000501
502/* An extension mechanism to store arbitrary additional per-thread state.
503 PyThreadState_GetDict() returns a dictionary that can be used to hold such
504 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +0000505 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
506 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +0000507
508PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000509PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
512 &_PyThreadState_Current);
513 if (tstate == NULL)
514 return NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 if (tstate->dict == NULL) {
517 PyObject *d;
518 tstate->dict = d = PyDict_New();
519 if (d == NULL)
520 PyErr_Clear();
521 }
522 return tstate->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000523}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000524
525
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000526/* Asynchronously raise an exception in a thread.
527 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +0000528 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000529 to call this, or use ctypes. Must be called with the GIL held.
530 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
531 match any known thread id). Can be called with exc=NULL to clear an
532 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000533
534int
535PyThreadState_SetAsyncExc(long id, PyObject *exc) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 PyThreadState *tstate = PyThreadState_GET();
537 PyInterpreterState *interp = tstate->interp;
538 PyThreadState *p;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 /* Although the GIL is held, a few C API functions can be called
541 * without the GIL held, and in particular some that create and
542 * destroy thread and interpreter states. Those can mutate the
543 * list of thread states we're traversing, so to prevent that we lock
544 * head_mutex for the duration.
545 */
546 HEAD_LOCK();
547 for (p = interp->tstate_head; p != NULL; p = p->next) {
548 if (p->thread_id == id) {
549 /* Tricky: we need to decref the current value
550 * (if any) in p->async_exc, but that can in turn
551 * allow arbitrary Python code to run, including
552 * perhaps calls to this function. To prevent
553 * deadlock, we need to release head_mutex before
554 * the decref.
555 */
556 PyObject *old_exc = p->async_exc;
557 Py_XINCREF(exc);
558 p->async_exc = exc;
559 HEAD_UNLOCK();
560 Py_XDECREF(old_exc);
561 _PyEval_SignalAsyncExc();
562 return 1;
563 }
564 }
565 HEAD_UNLOCK();
566 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000567}
568
569
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000570/* Routines for advanced debuggers, requested by David Beazley.
571 Don't use unless you know what you are doing! */
572
573PyInterpreterState *
574PyInterpreterState_Head(void)
575{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 return interp_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000577}
578
579PyInterpreterState *
580PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000582}
583
584PyThreadState *
585PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000587}
588
589PyThreadState *
590PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000592}
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000593
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000594/* The implementation of sys._current_frames(). This is intended to be
595 called with the GIL held, as it will be when called via
596 sys._current_frames(). It's possible it would work fine even without
597 the GIL held, but haven't thought enough about that.
598*/
599PyObject *
600_PyThread_CurrentFrames(void)
601{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 PyObject *result;
603 PyInterpreterState *i;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 result = PyDict_New();
606 if (result == NULL)
607 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 /* for i in all interpreters:
610 * for t in all of i's thread states:
611 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +0200612 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 * need to grab head_mutex for the duration.
614 */
615 HEAD_LOCK();
616 for (i = interp_head; i != NULL; i = i->next) {
617 PyThreadState *t;
618 for (t = i->tstate_head; t != NULL; t = t->next) {
619 PyObject *id;
620 int stat;
621 struct _frame *frame = t->frame;
622 if (frame == NULL)
623 continue;
624 id = PyLong_FromLong(t->thread_id);
625 if (id == NULL)
626 goto Fail;
627 stat = PyDict_SetItem(result, id, (PyObject *)frame);
628 Py_DECREF(id);
629 if (stat < 0)
630 goto Fail;
631 }
632 }
633 HEAD_UNLOCK();
634 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000635
636 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 HEAD_UNLOCK();
638 Py_DECREF(result);
639 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000640}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000641
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000642/* Python "auto thread state" API. */
643#ifdef WITH_THREAD
644
645/* Keep this as a static, as it is not reliable! It can only
646 ever be compared to the state for the *current* thread.
647 * If not equal, then it doesn't matter that the actual
648 value may change immediately after comparison, as it can't
649 possibly change to the current thread's state.
650 * If equal, then the current thread holds the lock, so the value can't
651 change until we yield the lock.
652*/
653static int
654PyThreadState_IsCurrent(PyThreadState *tstate)
655{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 /* Must be the tstate for this thread */
657 assert(PyGILState_GetThisThreadState()==tstate);
658 return tstate == _Py_atomic_load_relaxed(&_PyThreadState_Current);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000659}
660
Tim Peters4c1f5ec2004-10-09 17:25:05 +0000661/* Internal initialization/finalization functions called by
662 Py_Initialize/Py_Finalize
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000663*/
Tim Peters19717fa2004-10-09 17:38:29 +0000664void
665_PyGILState_Init(PyInterpreterState *i, PyThreadState *t)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000666{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 assert(i && t); /* must init with valid states */
668 autoTLSkey = PyThread_create_key();
Kristján Valur Jónsson2fea9b92010-09-20 02:11:49 +0000669 if (autoTLSkey == -1)
670 Py_FatalError("Could not allocate TLS entry");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 autoInterpreterState = i;
672 assert(PyThread_get_key_value(autoTLSkey) == NULL);
673 assert(t->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 _PyGILState_NoteThreadState(t);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000676}
677
Tim Peters19717fa2004-10-09 17:38:29 +0000678void
679_PyGILState_Fini(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000680{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 PyThread_delete_key(autoTLSkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000683}
684
Charles-François Natalia233df82011-11-22 19:49:51 +0100685/* Reset the TLS key - called by PyOS_AfterFork().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200686 * This should not be necessary, but some - buggy - pthread implementations
Charles-François Natalia233df82011-11-22 19:49:51 +0100687 * don't reset TLS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200688 */
689void
690_PyGILState_Reinit(void)
691{
692 PyThreadState *tstate = PyGILState_GetThisThreadState();
693 PyThread_delete_key(autoTLSkey);
694 if ((autoTLSkey = PyThread_create_key()) == -1)
695 Py_FatalError("Could not allocate TLS entry");
696
Charles-François Natalia233df82011-11-22 19:49:51 +0100697 /* If the thread had an associated auto thread state, reassociate it with
698 * the new key. */
699 if (tstate && PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200700 Py_FatalError("Couldn't create autoTLSkey mapping");
701}
702
Michael W. Hudson188d4362005-06-20 16:52:57 +0000703/* When a thread state is created for a thread by some mechanism other than
704 PyGILState_Ensure, it's important that the GILState machinery knows about
705 it so it doesn't try to create another thread state for the thread (this is
706 a better fix for SF bug #1010677 than the first one attempted).
707*/
Thomas Wouters89f507f2006-12-13 04:49:30 +0000708static void
Michael W. Hudson188d4362005-06-20 16:52:57 +0000709_PyGILState_NoteThreadState(PyThreadState* tstate)
710{
Antoine Pitrou079ce542010-09-08 12:37:10 +0000711 /* If autoTLSkey isn't initialized, this must be the very first
712 threadstate created in Py_Initialize(). Don't do anything for now
713 (we'll be back here when _PyGILState_Init is called). */
714 if (!autoInterpreterState)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 return;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 /* Stick the thread state for this thread in thread local storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +0000718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 The only situation where you can legitimately have more than one
720 thread state for an OS level thread is when there are multiple
721 interpreters, when:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 a) You shouldn't really be using the PyGILState_ APIs anyway,
724 and:
Michael W. Hudson188d4362005-06-20 16:52:57 +0000725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 b) The slightly odd way PyThread_set_key_value works (see
727 comments by its implementation) means that the first thread
728 state created for that given OS level thread will "win",
729 which seems reasonable behaviour.
730 */
731 if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
732 Py_FatalError("Couldn't create autoTLSkey mapping");
Michael W. Hudson188d4362005-06-20 16:52:57 +0000733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 /* PyGILState_Release must not try to delete this thread state. */
735 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +0000736}
737
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000738/* The public functions */
Tim Peters19717fa2004-10-09 17:38:29 +0000739PyThreadState *
740PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000741{
Antoine Pitrou079ce542010-09-08 12:37:10 +0000742 if (autoInterpreterState == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 return NULL;
744 return (PyThreadState *)PyThread_get_key_value(autoTLSkey);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000745}
746
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700747int
748PyGILState_Check(void)
749{
750 /* can't use PyThreadState_Get() since it will assert that it has the GIL */
751 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
752 &_PyThreadState_Current);
753 return tstate && (tstate == PyGILState_GetThisThreadState());
754}
755
Tim Peters19717fa2004-10-09 17:38:29 +0000756PyGILState_STATE
757PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000758{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000759 int current;
760 PyThreadState *tcur;
761 /* Note that we do not auto-init Python here - apart from
762 potential races with 2 threads auto-initializing, pep-311
763 spells out other issues. Embedders are expected to have
764 called Py_Initialize() and usually PyEval_InitThreads().
765 */
766 assert(autoInterpreterState); /* Py_Initialize() hasn't been called! */
767 tcur = (PyThreadState *)PyThread_get_key_value(autoTLSkey);
768 if (tcur == NULL) {
769 /* Create a new thread state for this thread */
770 tcur = PyThreadState_New(autoInterpreterState);
771 if (tcur == NULL)
772 Py_FatalError("Couldn't create thread-state for new thread");
773 /* This is our thread state! We'll need to delete it in the
774 matching call to PyGILState_Release(). */
775 tcur->gilstate_counter = 0;
776 current = 0; /* new thread state is never current */
777 }
778 else
779 current = PyThreadState_IsCurrent(tcur);
780 if (current == 0)
781 PyEval_RestoreThread(tcur);
782 /* Update our counter in the thread-state - no need for locks:
783 - tcur will remain valid as we hold the GIL.
784 - the counter is safe as we are the only thread "allowed"
785 to modify this value
786 */
787 ++tcur->gilstate_counter;
788 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000789}
790
Tim Peters19717fa2004-10-09 17:38:29 +0000791void
792PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000793{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 PyThreadState *tcur = (PyThreadState *)PyThread_get_key_value(
795 autoTLSkey);
796 if (tcur == NULL)
797 Py_FatalError("auto-releasing thread-state, "
798 "but no thread-state for this thread");
799 /* We must hold the GIL and have our thread state current */
800 /* XXX - remove the check - the assert should be fine,
801 but while this is very new (April 2003), the extra check
802 by release-only users can't hurt.
803 */
804 if (! PyThreadState_IsCurrent(tcur))
805 Py_FatalError("This thread state must be current when releasing");
806 assert(PyThreadState_IsCurrent(tcur));
807 --tcur->gilstate_counter;
808 assert(tcur->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 /* If we're going to destroy this thread-state, we must
811 * clear it while the GIL is held, as destructors may run.
812 */
813 if (tcur->gilstate_counter == 0) {
814 /* can't have been locked when we created it */
815 assert(oldstate == PyGILState_UNLOCKED);
816 PyThreadState_Clear(tcur);
817 /* Delete the thread-state. Note this releases the GIL too!
818 * It's vital that the GIL be held here, to avoid shutdown
819 * races; see bugs 225673 and 1061968 (that nasty bug has a
820 * habit of coming back).
821 */
822 PyThreadState_DeleteCurrent();
823 }
824 /* Release the lock if necessary */
825 else if (oldstate == PyGILState_UNLOCKED)
826 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000827}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000828
Benjamin Peterson3bf01752012-04-13 18:06:36 -0400829#endif /* WITH_THREAD */
830
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000831#ifdef __cplusplus
832}
833#endif
834
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000835