blob: a8ed13867bbac812ac5348d67abc9684f1f0d347 [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();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200216 tstate->prev = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 tstate->next = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200218 if (tstate->next)
219 tstate->next->prev = tstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 interp->tstate_head = tstate;
221 HEAD_UNLOCK();
222 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000225}
226
Victor Stinner45b9be52010-03-03 23:28:07 +0000227PyThreadState *
228PyThreadState_New(PyInterpreterState *interp)
229{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000230 return new_threadstate(interp, 1);
Victor Stinner45b9be52010-03-03 23:28:07 +0000231}
232
233PyThreadState *
234_PyThreadState_Prealloc(PyInterpreterState *interp)
235{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 return new_threadstate(interp, 0);
Victor Stinner45b9be52010-03-03 23:28:07 +0000237}
238
239void
240_PyThreadState_Init(PyThreadState *tstate)
241{
242#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 _PyGILState_NoteThreadState(tstate);
Victor Stinner45b9be52010-03-03 23:28:07 +0000244#endif
245}
246
Martin v. Löwis1a214512008-06-11 05:26:20 +0000247PyObject*
Martin v. Löwis7800f752012-06-22 12:20:55 +0200248PyState_FindModule(struct PyModuleDef* module)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000249{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200250 Py_ssize_t index = module->m_base.m_index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000251 PyInterpreterState *state = PyThreadState_GET()->interp;
252 PyObject *res;
253 if (index == 0)
254 return NULL;
255 if (state->modules_by_index == NULL)
256 return NULL;
Antoine Pitrou75506e82012-08-20 19:30:46 +0200257 if (index >= PyList_GET_SIZE(state->modules_by_index))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000258 return NULL;
259 res = PyList_GET_ITEM(state->modules_by_index, index);
260 return res==Py_None ? NULL : res;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000261}
262
263int
264_PyState_AddModule(PyObject* module, struct PyModuleDef* def)
265{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 PyInterpreterState *state = PyThreadState_GET()->interp;
267 if (!def)
268 return -1;
269 if (!state->modules_by_index) {
270 state->modules_by_index = PyList_New(0);
271 if (!state->modules_by_index)
272 return -1;
273 }
274 while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
275 if (PyList_Append(state->modules_by_index, Py_None) < 0)
276 return -1;
277 Py_INCREF(module);
278 return PyList_SetItem(state->modules_by_index,
279 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000280}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000281
Martin v. Löwis7800f752012-06-22 12:20:55 +0200282int
283PyState_AddModule(PyObject* module, struct PyModuleDef* def)
284{
285 Py_ssize_t index;
286 PyInterpreterState *state = PyThreadState_GET()->interp;
287 if (!def) {
288 Py_FatalError("PyState_AddModule: Module Definition is NULL");
289 return -1;
290 }
291 index = def->m_base.m_index;
292 if (state->modules_by_index) {
293 if(PyList_GET_SIZE(state->modules_by_index) >= index) {
294 if(module == PyList_GET_ITEM(state->modules_by_index, index)) {
295 Py_FatalError("PyState_AddModule: Module already added!");
296 return -1;
297 }
298 }
299 }
300 return _PyState_AddModule(module, def);
301}
302
303int
304PyState_RemoveModule(struct PyModuleDef* def)
305{
306 Py_ssize_t index = def->m_base.m_index;
307 PyInterpreterState *state = PyThreadState_GET()->interp;
308 if (index == 0) {
309 Py_FatalError("PyState_RemoveModule: Module index invalid.");
310 return -1;
311 }
312 if (state->modules_by_index == NULL) {
313 Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible.");
314 return -1;
315 }
316 if (index > PyList_GET_SIZE(state->modules_by_index)) {
317 Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
318 return -1;
319 }
320 return PyList_SetItem(state->modules_by_index, index, Py_None);
321}
322
Guido van Rossuma027efa1997-05-05 20:56:21 +0000323void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000324PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000325{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 if (Py_VerboseFlag && tstate->frame != NULL)
327 fprintf(stderr,
328 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 Py_CLEAR(tstate->frame);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 Py_CLEAR(tstate->dict);
333 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 Py_CLEAR(tstate->curexc_type);
336 Py_CLEAR(tstate->curexc_value);
337 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 Py_CLEAR(tstate->exc_type);
340 Py_CLEAR(tstate->exc_value);
341 Py_CLEAR(tstate->exc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 tstate->c_profilefunc = NULL;
344 tstate->c_tracefunc = NULL;
345 Py_CLEAR(tstate->c_profileobj);
346 Py_CLEAR(tstate->c_traceobj);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000347}
348
349
Guido van Rossum29757862001-01-23 01:46:06 +0000350/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
351static void
352tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000353{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 PyInterpreterState *interp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000355 if (tstate == NULL)
356 Py_FatalError("PyThreadState_Delete: NULL tstate");
357 interp = tstate->interp;
358 if (interp == NULL)
359 Py_FatalError("PyThreadState_Delete: NULL interp");
360 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200361 if (tstate->prev)
362 tstate->prev->next = tstate->next;
363 else
364 interp->tstate_head = tstate->next;
365 if (tstate->next)
366 tstate->next->prev = tstate->prev;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000367 HEAD_UNLOCK();
368 free(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000369}
370
371
Guido van Rossum29757862001-01-23 01:46:06 +0000372void
373PyThreadState_Delete(PyThreadState *tstate)
374{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 if (tstate == _Py_atomic_load_relaxed(&_PyThreadState_Current))
376 Py_FatalError("PyThreadState_Delete: tstate is still current");
377 tstate_delete_common(tstate);
Tim Petersf4e69282006-02-27 17:15:31 +0000378#ifdef WITH_THREAD
Antoine Pitrou079ce542010-09-08 12:37:10 +0000379 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 PyThread_delete_key_value(autoTLSkey);
Tim Petersf4e69282006-02-27 17:15:31 +0000381#endif /* WITH_THREAD */
Guido van Rossum29757862001-01-23 01:46:06 +0000382}
383
384
385#ifdef WITH_THREAD
386void
387PyThreadState_DeleteCurrent()
388{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
390 &_PyThreadState_Current);
391 if (tstate == NULL)
392 Py_FatalError(
393 "PyThreadState_DeleteCurrent: no current tstate");
394 _Py_atomic_store_relaxed(&_PyThreadState_Current, NULL);
395 tstate_delete_common(tstate);
Antoine Pitrou079ce542010-09-08 12:37:10 +0000396 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000397 PyThread_delete_key_value(autoTLSkey);
398 PyEval_ReleaseLock();
Guido van Rossum29757862001-01-23 01:46:06 +0000399}
400#endif /* WITH_THREAD */
401
402
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200403/*
404 * Delete all thread states except the one passed as argument.
405 * Note that, if there is a current thread state, it *must* be the one
406 * passed as argument. Also, this won't touch any other interpreters
407 * than the current one, since we don't know which thread state should
408 * be kept in those other interpreteres.
409 */
410void
411_PyThreadState_DeleteExcept(PyThreadState *tstate)
412{
413 PyInterpreterState *interp = tstate->interp;
414 PyThreadState *p, *next, *garbage;
415 HEAD_LOCK();
416 /* Remove all thread states, except tstate, from the linked list of
417 thread states. This will allow calling PyThreadState_Clear()
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200418 without holding the lock. */
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200419 garbage = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200420 if (garbage == tstate)
421 garbage = tstate->next;
422 if (tstate->prev)
423 tstate->prev->next = tstate->next;
424 if (tstate->next)
425 tstate->next->prev = tstate->prev;
426 tstate->prev = tstate->next = NULL;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200427 interp->tstate_head = tstate;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200428 HEAD_UNLOCK();
429 /* Clear and deallocate all stale thread states. Even if this
430 executes Python code, we should be safe since it executes
431 in the current thread, not one of the stale threads. */
432 for (p = garbage; p; p = next) {
433 next = p->next;
434 PyThreadState_Clear(p);
435 free(p);
436 }
437}
438
439
Guido van Rossuma027efa1997-05-05 20:56:21 +0000440PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000441PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000442{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
444 &_PyThreadState_Current);
445 if (tstate == NULL)
446 Py_FatalError("PyThreadState_Get: no current thread");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000449}
450
451
452PyThreadState *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000453PyThreadState_Swap(PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000454{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 PyThreadState *oldts = (PyThreadState*)_Py_atomic_load_relaxed(
456 &_PyThreadState_Current);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 _Py_atomic_store_relaxed(&_PyThreadState_Current, newts);
459 /* It should not be possible for more than one thread state
460 to be used for a thread. Check this the best we can in debug
461 builds.
462 */
Martin v. Löwis9e296252003-05-01 05:25:29 +0000463#if defined(Py_DEBUG) && defined(WITH_THREAD)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 if (newts) {
465 /* This can be called from PyEval_RestoreThread(). Similar
466 to it, we need to ensure errno doesn't change.
467 */
468 int err = errno;
469 PyThreadState *check = PyGILState_GetThisThreadState();
470 if (check && check->interp == newts->interp && check != newts)
471 Py_FatalError("Invalid thread state for this thread");
472 errno = err;
473 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000474#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000475 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000476}
Guido van Rossumede04391998-04-10 20:18:25 +0000477
478/* An extension mechanism to store arbitrary additional per-thread state.
479 PyThreadState_GetDict() returns a dictionary that can be used to hold such
480 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +0000481 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
482 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +0000483
484PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000485PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000486{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000487 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
488 &_PyThreadState_Current);
489 if (tstate == NULL)
490 return NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 if (tstate->dict == NULL) {
493 PyObject *d;
494 tstate->dict = d = PyDict_New();
495 if (d == NULL)
496 PyErr_Clear();
497 }
498 return tstate->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000499}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000500
501
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000502/* Asynchronously raise an exception in a thread.
503 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +0000504 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000505 to call this, or use ctypes. Must be called with the GIL held.
506 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
507 match any known thread id). Can be called with exc=NULL to clear an
508 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000509
510int
511PyThreadState_SetAsyncExc(long id, PyObject *exc) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 PyThreadState *tstate = PyThreadState_GET();
513 PyInterpreterState *interp = tstate->interp;
514 PyThreadState *p;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 /* Although the GIL is held, a few C API functions can be called
517 * without the GIL held, and in particular some that create and
518 * destroy thread and interpreter states. Those can mutate the
519 * list of thread states we're traversing, so to prevent that we lock
520 * head_mutex for the duration.
521 */
522 HEAD_LOCK();
523 for (p = interp->tstate_head; p != NULL; p = p->next) {
524 if (p->thread_id == id) {
525 /* Tricky: we need to decref the current value
526 * (if any) in p->async_exc, but that can in turn
527 * allow arbitrary Python code to run, including
528 * perhaps calls to this function. To prevent
529 * deadlock, we need to release head_mutex before
530 * the decref.
531 */
532 PyObject *old_exc = p->async_exc;
533 Py_XINCREF(exc);
534 p->async_exc = exc;
535 HEAD_UNLOCK();
536 Py_XDECREF(old_exc);
537 _PyEval_SignalAsyncExc();
538 return 1;
539 }
540 }
541 HEAD_UNLOCK();
542 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000543}
544
545
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000546/* Routines for advanced debuggers, requested by David Beazley.
547 Don't use unless you know what you are doing! */
548
549PyInterpreterState *
550PyInterpreterState_Head(void)
551{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 return interp_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000553}
554
555PyInterpreterState *
556PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000558}
559
560PyThreadState *
561PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000563}
564
565PyThreadState *
566PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000568}
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000569
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000570/* The implementation of sys._current_frames(). This is intended to be
571 called with the GIL held, as it will be when called via
572 sys._current_frames(). It's possible it would work fine even without
573 the GIL held, but haven't thought enough about that.
574*/
575PyObject *
576_PyThread_CurrentFrames(void)
577{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 PyObject *result;
579 PyInterpreterState *i;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 result = PyDict_New();
582 if (result == NULL)
583 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 /* for i in all interpreters:
586 * for t in all of i's thread states:
587 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +0200588 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 * need to grab head_mutex for the duration.
590 */
591 HEAD_LOCK();
592 for (i = interp_head; i != NULL; i = i->next) {
593 PyThreadState *t;
594 for (t = i->tstate_head; t != NULL; t = t->next) {
595 PyObject *id;
596 int stat;
597 struct _frame *frame = t->frame;
598 if (frame == NULL)
599 continue;
600 id = PyLong_FromLong(t->thread_id);
601 if (id == NULL)
602 goto Fail;
603 stat = PyDict_SetItem(result, id, (PyObject *)frame);
604 Py_DECREF(id);
605 if (stat < 0)
606 goto Fail;
607 }
608 }
609 HEAD_UNLOCK();
610 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000611
612 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 HEAD_UNLOCK();
614 Py_DECREF(result);
615 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000616}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000617
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000618/* Python "auto thread state" API. */
619#ifdef WITH_THREAD
620
621/* Keep this as a static, as it is not reliable! It can only
622 ever be compared to the state for the *current* thread.
623 * If not equal, then it doesn't matter that the actual
624 value may change immediately after comparison, as it can't
625 possibly change to the current thread's state.
626 * If equal, then the current thread holds the lock, so the value can't
627 change until we yield the lock.
628*/
629static int
630PyThreadState_IsCurrent(PyThreadState *tstate)
631{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 /* Must be the tstate for this thread */
633 assert(PyGILState_GetThisThreadState()==tstate);
634 return tstate == _Py_atomic_load_relaxed(&_PyThreadState_Current);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000635}
636
Tim Peters4c1f5ec2004-10-09 17:25:05 +0000637/* Internal initialization/finalization functions called by
638 Py_Initialize/Py_Finalize
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000639*/
Tim Peters19717fa2004-10-09 17:38:29 +0000640void
641_PyGILState_Init(PyInterpreterState *i, PyThreadState *t)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000642{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 assert(i && t); /* must init with valid states */
644 autoTLSkey = PyThread_create_key();
Kristján Valur Jónsson2fea9b92010-09-20 02:11:49 +0000645 if (autoTLSkey == -1)
646 Py_FatalError("Could not allocate TLS entry");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 autoInterpreterState = i;
648 assert(PyThread_get_key_value(autoTLSkey) == NULL);
649 assert(t->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 _PyGILState_NoteThreadState(t);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000652}
653
Tim Peters19717fa2004-10-09 17:38:29 +0000654void
655_PyGILState_Fini(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000656{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 PyThread_delete_key(autoTLSkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000659}
660
Charles-François Natalia233df82011-11-22 19:49:51 +0100661/* Reset the TLS key - called by PyOS_AfterFork().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200662 * This should not be necessary, but some - buggy - pthread implementations
Charles-François Natalia233df82011-11-22 19:49:51 +0100663 * don't reset TLS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200664 */
665void
666_PyGILState_Reinit(void)
667{
668 PyThreadState *tstate = PyGILState_GetThisThreadState();
669 PyThread_delete_key(autoTLSkey);
670 if ((autoTLSkey = PyThread_create_key()) == -1)
671 Py_FatalError("Could not allocate TLS entry");
672
Charles-François Natalia233df82011-11-22 19:49:51 +0100673 /* If the thread had an associated auto thread state, reassociate it with
674 * the new key. */
675 if (tstate && PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200676 Py_FatalError("Couldn't create autoTLSkey mapping");
677}
678
Michael W. Hudson188d4362005-06-20 16:52:57 +0000679/* When a thread state is created for a thread by some mechanism other than
680 PyGILState_Ensure, it's important that the GILState machinery knows about
681 it so it doesn't try to create another thread state for the thread (this is
682 a better fix for SF bug #1010677 than the first one attempted).
683*/
Thomas Wouters89f507f2006-12-13 04:49:30 +0000684static void
Michael W. Hudson188d4362005-06-20 16:52:57 +0000685_PyGILState_NoteThreadState(PyThreadState* tstate)
686{
Antoine Pitrou079ce542010-09-08 12:37:10 +0000687 /* If autoTLSkey isn't initialized, this must be the very first
688 threadstate created in Py_Initialize(). Don't do anything for now
689 (we'll be back here when _PyGILState_Init is called). */
690 if (!autoInterpreterState)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 return;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 /* Stick the thread state for this thread in thread local storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +0000694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 The only situation where you can legitimately have more than one
696 thread state for an OS level thread is when there are multiple
697 interpreters, when:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 a) You shouldn't really be using the PyGILState_ APIs anyway,
700 and:
Michael W. Hudson188d4362005-06-20 16:52:57 +0000701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 b) The slightly odd way PyThread_set_key_value works (see
703 comments by its implementation) means that the first thread
704 state created for that given OS level thread will "win",
705 which seems reasonable behaviour.
706 */
707 if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
708 Py_FatalError("Couldn't create autoTLSkey mapping");
Michael W. Hudson188d4362005-06-20 16:52:57 +0000709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 /* PyGILState_Release must not try to delete this thread state. */
711 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +0000712}
713
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000714/* The public functions */
Tim Peters19717fa2004-10-09 17:38:29 +0000715PyThreadState *
716PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000717{
Antoine Pitrou079ce542010-09-08 12:37:10 +0000718 if (autoInterpreterState == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 return NULL;
720 return (PyThreadState *)PyThread_get_key_value(autoTLSkey);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000721}
722
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700723int
724PyGILState_Check(void)
725{
726 /* can't use PyThreadState_Get() since it will assert that it has the GIL */
727 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed(
728 &_PyThreadState_Current);
729 return tstate && (tstate == PyGILState_GetThisThreadState());
730}
731
Tim Peters19717fa2004-10-09 17:38:29 +0000732PyGILState_STATE
733PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 int current;
736 PyThreadState *tcur;
737 /* Note that we do not auto-init Python here - apart from
738 potential races with 2 threads auto-initializing, pep-311
739 spells out other issues. Embedders are expected to have
740 called Py_Initialize() and usually PyEval_InitThreads().
741 */
742 assert(autoInterpreterState); /* Py_Initialize() hasn't been called! */
743 tcur = (PyThreadState *)PyThread_get_key_value(autoTLSkey);
744 if (tcur == NULL) {
745 /* Create a new thread state for this thread */
746 tcur = PyThreadState_New(autoInterpreterState);
747 if (tcur == NULL)
748 Py_FatalError("Couldn't create thread-state for new thread");
749 /* This is our thread state! We'll need to delete it in the
750 matching call to PyGILState_Release(). */
751 tcur->gilstate_counter = 0;
752 current = 0; /* new thread state is never current */
753 }
754 else
755 current = PyThreadState_IsCurrent(tcur);
756 if (current == 0)
757 PyEval_RestoreThread(tcur);
758 /* Update our counter in the thread-state - no need for locks:
759 - tcur will remain valid as we hold the GIL.
760 - the counter is safe as we are the only thread "allowed"
761 to modify this value
762 */
763 ++tcur->gilstate_counter;
764 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000765}
766
Tim Peters19717fa2004-10-09 17:38:29 +0000767void
768PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000769{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 PyThreadState *tcur = (PyThreadState *)PyThread_get_key_value(
771 autoTLSkey);
772 if (tcur == NULL)
773 Py_FatalError("auto-releasing thread-state, "
774 "but no thread-state for this thread");
775 /* We must hold the GIL and have our thread state current */
776 /* XXX - remove the check - the assert should be fine,
777 but while this is very new (April 2003), the extra check
778 by release-only users can't hurt.
779 */
780 if (! PyThreadState_IsCurrent(tcur))
781 Py_FatalError("This thread state must be current when releasing");
782 assert(PyThreadState_IsCurrent(tcur));
783 --tcur->gilstate_counter;
784 assert(tcur->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 /* If we're going to destroy this thread-state, we must
787 * clear it while the GIL is held, as destructors may run.
788 */
789 if (tcur->gilstate_counter == 0) {
790 /* can't have been locked when we created it */
791 assert(oldstate == PyGILState_UNLOCKED);
792 PyThreadState_Clear(tcur);
793 /* Delete the thread-state. Note this releases the GIL too!
794 * It's vital that the GIL be held here, to avoid shutdown
795 * races; see bugs 225673 and 1061968 (that nasty bug has a
796 * habit of coming back).
797 */
798 PyThreadState_DeleteCurrent();
799 }
800 /* Release the lock if necessary */
801 else if (oldstate == PyGILState_UNLOCKED)
802 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000803}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000804
Benjamin Peterson3bf01752012-04-13 18:06:36 -0400805#endif /* WITH_THREAD */
806
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000807#ifdef __cplusplus
808}
809#endif
810
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000811