blob: 30a372212ed4db2adea3e62d5bb9217bed1989dc [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
Victor Stinnerb02ef712016-01-22 14:09:55 +01006#define GET_TSTATE() \
7 ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current))
8#define SET_TSTATE(value) \
Benjamin Petersonca470632016-09-06 13:47:26 -07009 _Py_atomic_store_relaxed(&_PyThreadState_Current, (uintptr_t)(value))
Victor Stinnerb02ef712016-01-22 14:09:55 +010010#define GET_INTERP_STATE() \
11 (GET_TSTATE()->interp)
12
Victor Stinnerbfd316e2016-01-20 11:12:38 +010013
Tim Peters84705582004-10-10 02:47:33 +000014/* --------------------------------------------------------------------------
15CAUTION
16
Victor Stinner1a7425f2013-07-07 16:25:15 +020017Always use PyMem_RawMalloc() and PyMem_RawFree() directly in this file. A
18number of these functions are advertised as safe to call when the GIL isn't
19held, and in a debug build Python redirects (e.g.) PyMem_NEW (etc) to Python's
20debugging obmalloc functions. Those aren't thread-safe (they rely on the GIL
21to avoid the expense of doing their own locking).
Tim Peters84705582004-10-10 02:47:33 +000022-------------------------------------------------------------------------- */
23
Martin v. Löwisf0473d52001-07-18 16:17:16 +000024#ifdef HAVE_DLOPEN
25#ifdef HAVE_DLFCN_H
26#include <dlfcn.h>
27#endif
Serhiy Storchakac2f7d872016-05-04 09:44:44 +030028#if !HAVE_DECL_RTLD_LAZY
Martin v. Löwisf0473d52001-07-18 16:17:16 +000029#define RTLD_LAZY 1
30#endif
31#endif
32
Benjamin Peterson43162b82012-04-13 11:58:27 -040033#ifdef __cplusplus
34extern "C" {
35#endif
Martin v. Löwisf0473d52001-07-18 16:17:16 +000036
Eric Snow05351c12017-09-05 21:43:08 -070037int _PyGILState_check_enabled = 1;
Victor Stinner8a1be612016-03-14 22:07:55 +010038
Guido van Rossum1d5ad901999-06-18 14:22:24 +000039#ifdef WITH_THREAD
Eric Snow05351c12017-09-05 21:43:08 -070040#include "pythread.h"
41static PyThread_type_lock head_mutex = NULL; /* Protects interp->tstate_head */
42#define HEAD_INIT() (void)(head_mutex || (head_mutex = PyThread_allocate_lock()))
43#define HEAD_LOCK() PyThread_acquire_lock(head_mutex, WAIT_LOCK)
44#define HEAD_UNLOCK() PyThread_release_lock(head_mutex)
Michael W. Hudson188d4362005-06-20 16:52:57 +000045
Eric Snow05351c12017-09-05 21:43:08 -070046/* The single PyInterpreterState used by this process'
47 GILState implementation
48*/
49/* TODO: Given interp_main, it may be possible to kill this ref */
50static PyInterpreterState *autoInterpreterState = NULL;
51static int autoTLSkey = -1;
Guido van Rossum1d5ad901999-06-18 14:22:24 +000052#else
Eric Snow05351c12017-09-05 21:43:08 -070053#define HEAD_INIT() /* Nothing */
Guido van Rossum1d5ad901999-06-18 14:22:24 +000054#define HEAD_LOCK() /* Nothing */
55#define HEAD_UNLOCK() /* Nothing */
56#endif
57
Eric Snow05351c12017-09-05 21:43:08 -070058static PyInterpreterState *interp_head = NULL;
59static PyInterpreterState *interp_main = NULL;
60
61/* Assuming the current thread holds the GIL, this is the
62 PyThreadState for the current thread. */
63_Py_atomic_address _PyThreadState_Current = {0};
64PyThreadFrameGetter _PyThreadState_GetFrame = NULL;
65
Michael W. Hudsonce7da6c2005-09-30 08:20:24 +000066#ifdef WITH_THREAD
Michael W. Hudson188d4362005-06-20 16:52:57 +000067static void _PyGILState_NoteThreadState(PyThreadState* tstate);
Michael W. Hudsonce7da6c2005-09-30 08:20:24 +000068#endif
Michael W. Hudson188d4362005-06-20 16:52:57 +000069
Eric Snow05351c12017-09-05 21:43:08 -070070/* _next_interp_id is an auto-numbered sequence of small integers.
71 It gets initialized in _PyInterpreterState_Init(), which is called
72 in Py_Initialize(), and used in PyInterpreterState_New(). A negative
73 interpreter ID indicates an error occurred. The main interpreter
74 will always have an ID of 0. Overflow results in a RuntimeError.
75 If that becomes a problem later then we can adjust, e.g. by using
76 a Python int.
77
78 We initialize this to -1 so that the pre-Py_Initialize() value
79 results in an error. */
80static int64_t _next_interp_id = -1;
81
Eric Snowe3774162017-05-22 19:46:40 -070082void
Eric Snow05351c12017-09-05 21:43:08 -070083_PyInterpreterState_Init(void)
Eric Snowe3774162017-05-22 19:46:40 -070084{
Eric Snow05351c12017-09-05 21:43:08 -070085 _next_interp_id = 0;
Eric Snowe3774162017-05-22 19:46:40 -070086}
Guido van Rossuma027efa1997-05-05 20:56:21 +000087
88PyInterpreterState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000089PyInterpreterState_New(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +000090{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000091 PyInterpreterState *interp = (PyInterpreterState *)
Victor Stinner1a7425f2013-07-07 16:25:15 +020092 PyMem_RawMalloc(sizeof(PyInterpreterState));
Guido van Rossum25ce5661997-08-02 03:10:38 +000093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 if (interp != NULL) {
Eric Snow05351c12017-09-05 21:43:08 -070095 HEAD_INIT();
96#ifdef WITH_THREAD
97 if (head_mutex == NULL)
98 Py_FatalError("Can't initialize threads for interpreter");
99#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000100 interp->modules_by_index = NULL;
101 interp->sysdict = NULL;
102 interp->builtins = NULL;
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200103 interp->builtins_copy = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 interp->tstate_head = NULL;
105 interp->codec_search_path = NULL;
106 interp->codec_search_cache = NULL;
107 interp->codec_error_registry = NULL;
108 interp->codecs_initialized = 0;
Victor Stinner3cbf14b2011-04-27 00:24:21 +0200109 interp->fscodec_initialized = 0;
Brett Cannonfd074152012-04-14 14:10:13 -0400110 interp->importlib = NULL;
Serhiy Storchaka133138a2016-08-02 22:51:21 +0300111 interp->import_func = NULL;
Brett Cannon3cebf932016-09-05 15:33:46 -0700112 interp->eval_frame = _PyEval_EvalFrameDefault;
Dino Viehlandf3cffd22017-06-21 14:44:36 -0700113 interp->co_extra_user_count = 0;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000114#ifdef HAVE_DLOPEN
Serhiy Storchakac2f7d872016-05-04 09:44:44 +0300115#if HAVE_DECL_RTLD_NOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 interp->dlopenflags = RTLD_NOW;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000117#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 interp->dlopenflags = RTLD_LAZY;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000119#endif
120#endif
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200121#ifdef HAVE_FORK
122 interp->before_forkers = NULL;
123 interp->after_forkers_parent = NULL;
124 interp->after_forkers_child = NULL;
125#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 HEAD_LOCK();
Eric Snow05351c12017-09-05 21:43:08 -0700128 interp->next = interp_head;
129 if (interp_main == NULL) {
130 interp_main = interp;
Eric Snow6b4be192017-05-22 21:36:03 -0700131 }
Eric Snow05351c12017-09-05 21:43:08 -0700132 interp_head = interp;
133 if (_next_interp_id < 0) {
Eric Snowe3774162017-05-22 19:46:40 -0700134 /* overflow or Py_Initialize() not called! */
135 PyErr_SetString(PyExc_RuntimeError,
136 "failed to get an interpreter ID");
137 interp = NULL;
138 } else {
Eric Snow05351c12017-09-05 21:43:08 -0700139 interp->id = _next_interp_id;
140 _next_interp_id += 1;
Eric Snowe3774162017-05-22 19:46:40 -0700141 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142 HEAD_UNLOCK();
143 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000145 return interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000146}
147
148
149void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000150PyInterpreterState_Clear(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 PyThreadState *p;
153 HEAD_LOCK();
154 for (p = interp->tstate_head; p != NULL; p = p->next)
155 PyThreadState_Clear(p);
156 HEAD_UNLOCK();
157 Py_CLEAR(interp->codec_search_path);
158 Py_CLEAR(interp->codec_search_cache);
159 Py_CLEAR(interp->codec_error_registry);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000160 Py_CLEAR(interp->modules_by_index);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000161 Py_CLEAR(interp->sysdict);
162 Py_CLEAR(interp->builtins);
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200163 Py_CLEAR(interp->builtins_copy);
Brett Cannonfd074152012-04-14 14:10:13 -0400164 Py_CLEAR(interp->importlib);
Serhiy Storchaka133138a2016-08-02 22:51:21 +0300165 Py_CLEAR(interp->import_func);
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200166#ifdef HAVE_FORK
167 Py_CLEAR(interp->before_forkers);
168 Py_CLEAR(interp->after_forkers_parent);
169 Py_CLEAR(interp->after_forkers_child);
170#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000171}
172
173
174static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000175zapthreads(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000177 PyThreadState *p;
178 /* No need to lock the mutex here because this should only happen
179 when the threads are all really dead (XXX famous last words). */
180 while ((p = interp->tstate_head) != NULL) {
181 PyThreadState_Delete(p);
182 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000183}
184
185
186void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000187PyInterpreterState_Delete(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000188{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000189 PyInterpreterState **p;
190 zapthreads(interp);
191 HEAD_LOCK();
Eric Snow05351c12017-09-05 21:43:08 -0700192 for (p = &interp_head; ; p = &(*p)->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000193 if (*p == NULL)
194 Py_FatalError(
195 "PyInterpreterState_Delete: invalid interp");
196 if (*p == interp)
197 break;
198 }
199 if (interp->tstate_head != NULL)
200 Py_FatalError("PyInterpreterState_Delete: remaining threads");
201 *p = interp->next;
Eric Snow05351c12017-09-05 21:43:08 -0700202 if (interp_main == interp) {
203 interp_main = NULL;
204 if (interp_head != NULL)
Eric Snow6b4be192017-05-22 21:36:03 -0700205 Py_FatalError("PyInterpreterState_Delete: remaining subinterpreters");
206 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207 HEAD_UNLOCK();
Victor Stinner1a7425f2013-07-07 16:25:15 +0200208 PyMem_RawFree(interp);
Eric Snow05351c12017-09-05 21:43:08 -0700209#ifdef WITH_THREAD
210 if (interp_head == NULL && head_mutex != NULL) {
211 PyThread_free_lock(head_mutex);
212 head_mutex = NULL;
213 }
214#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000215}
216
217
Eric Snowe3774162017-05-22 19:46:40 -0700218int64_t
219PyInterpreterState_GetID(PyInterpreterState *interp)
220{
221 if (interp == NULL) {
222 PyErr_SetString(PyExc_RuntimeError, "no interpreter provided");
223 return -1;
224 }
225 return interp->id;
226}
227
228
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000229/* Default implementation for _PyThreadState_GetFrame */
230static struct _frame *
231threadstate_getframe(PyThreadState *self)
232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 return self->frame;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000234}
235
Victor Stinner45b9be52010-03-03 23:28:07 +0000236static PyThreadState *
237new_threadstate(PyInterpreterState *interp, int init)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000238{
Victor Stinner1a7425f2013-07-07 16:25:15 +0200239 PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState));
Tim Peters84705582004-10-10 02:47:33 +0000240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 if (_PyThreadState_GetFrame == NULL)
242 _PyThreadState_GetFrame = threadstate_getframe;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 if (tstate != NULL) {
245 tstate->interp = interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 tstate->frame = NULL;
248 tstate->recursion_depth = 0;
249 tstate->overflowed = 0;
250 tstate->recursion_critical = 0;
251 tstate->tracing = 0;
252 tstate->use_tracing = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000253 tstate->gilstate_counter = 0;
254 tstate->async_exc = NULL;
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000255#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 tstate->thread_id = PyThread_get_thread_ident();
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000257#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000258 tstate->thread_id = 0;
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000259#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000261 tstate->dict = NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 tstate->curexc_type = NULL;
264 tstate->curexc_value = NULL;
265 tstate->curexc_traceback = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000267 tstate->exc_type = NULL;
268 tstate->exc_value = NULL;
269 tstate->exc_traceback = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 tstate->c_profilefunc = NULL;
272 tstate->c_tracefunc = NULL;
273 tstate->c_profileobj = NULL;
274 tstate->c_traceobj = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000275
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200276 tstate->trash_delete_nesting = 0;
277 tstate->trash_delete_later = NULL;
Antoine Pitrou7b476992013-09-07 23:38:37 +0200278 tstate->on_delete = NULL;
279 tstate->on_delete_data = NULL;
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200280
Yury Selivanov75445082015-05-11 22:57:16 -0400281 tstate->coroutine_wrapper = NULL;
Yury Selivanovaab3c4a2015-06-02 18:43:51 -0400282 tstate->in_coroutine_wrapper = 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400283
Yury Selivanoveb636452016-09-08 22:01:51 -0700284 tstate->async_gen_firstiter = NULL;
285 tstate->async_gen_finalizer = NULL;
286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 if (init)
288 _PyThreadState_Init(tstate);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000290 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200291 tstate->prev = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 tstate->next = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200293 if (tstate->next)
294 tstate->next->prev = tstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 interp->tstate_head = tstate;
296 HEAD_UNLOCK();
297 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000300}
301
Victor Stinner45b9be52010-03-03 23:28:07 +0000302PyThreadState *
303PyThreadState_New(PyInterpreterState *interp)
304{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 return new_threadstate(interp, 1);
Victor Stinner45b9be52010-03-03 23:28:07 +0000306}
307
308PyThreadState *
309_PyThreadState_Prealloc(PyInterpreterState *interp)
310{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 return new_threadstate(interp, 0);
Victor Stinner45b9be52010-03-03 23:28:07 +0000312}
313
314void
315_PyThreadState_Init(PyThreadState *tstate)
316{
317#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 _PyGILState_NoteThreadState(tstate);
Victor Stinner45b9be52010-03-03 23:28:07 +0000319#endif
320}
321
Martin v. Löwis1a214512008-06-11 05:26:20 +0000322PyObject*
Martin v. Löwis7800f752012-06-22 12:20:55 +0200323PyState_FindModule(struct PyModuleDef* module)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000324{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200325 Py_ssize_t index = module->m_base.m_index;
Victor Stinnerb02ef712016-01-22 14:09:55 +0100326 PyInterpreterState *state = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327 PyObject *res;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000328 if (module->m_slots) {
329 return NULL;
330 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 if (index == 0)
332 return NULL;
333 if (state->modules_by_index == NULL)
334 return NULL;
Antoine Pitrou75506e82012-08-20 19:30:46 +0200335 if (index >= PyList_GET_SIZE(state->modules_by_index))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 return NULL;
337 res = PyList_GET_ITEM(state->modules_by_index, index);
338 return res==Py_None ? NULL : res;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000339}
340
341int
342_PyState_AddModule(PyObject* module, struct PyModuleDef* def)
343{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000344 PyInterpreterState *state;
Berker Peksag4b7b5652016-08-22 18:05:56 +0300345 if (!def) {
346 assert(PyErr_Occurred());
347 return -1;
348 }
Nick Coghland5cacbb2015-05-23 22:24:10 +1000349 if (def->m_slots) {
350 PyErr_SetString(PyExc_SystemError,
351 "PyState_AddModule called on module with slots");
352 return -1;
353 }
Victor Stinnerb02ef712016-01-22 14:09:55 +0100354 state = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000355 if (!state->modules_by_index) {
356 state->modules_by_index = PyList_New(0);
357 if (!state->modules_by_index)
358 return -1;
359 }
360 while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
361 if (PyList_Append(state->modules_by_index, Py_None) < 0)
362 return -1;
363 Py_INCREF(module);
364 return PyList_SetItem(state->modules_by_index,
365 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000366}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000367
Martin v. Löwis7800f752012-06-22 12:20:55 +0200368int
369PyState_AddModule(PyObject* module, struct PyModuleDef* def)
370{
371 Py_ssize_t index;
Victor Stinnerb02ef712016-01-22 14:09:55 +0100372 PyInterpreterState *state = GET_INTERP_STATE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200373 if (!def) {
374 Py_FatalError("PyState_AddModule: Module Definition is NULL");
375 return -1;
376 }
377 index = def->m_base.m_index;
378 if (state->modules_by_index) {
379 if(PyList_GET_SIZE(state->modules_by_index) >= index) {
380 if(module == PyList_GET_ITEM(state->modules_by_index, index)) {
381 Py_FatalError("PyState_AddModule: Module already added!");
382 return -1;
383 }
384 }
385 }
386 return _PyState_AddModule(module, def);
387}
388
389int
390PyState_RemoveModule(struct PyModuleDef* def)
391{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000392 PyInterpreterState *state;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200393 Py_ssize_t index = def->m_base.m_index;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000394 if (def->m_slots) {
395 PyErr_SetString(PyExc_SystemError,
396 "PyState_RemoveModule called on module with slots");
397 return -1;
398 }
Victor Stinnerb02ef712016-01-22 14:09:55 +0100399 state = GET_INTERP_STATE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200400 if (index == 0) {
401 Py_FatalError("PyState_RemoveModule: Module index invalid.");
402 return -1;
403 }
404 if (state->modules_by_index == NULL) {
405 Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible.");
406 return -1;
407 }
408 if (index > PyList_GET_SIZE(state->modules_by_index)) {
409 Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
410 return -1;
411 }
412 return PyList_SetItem(state->modules_by_index, index, Py_None);
413}
414
Antoine Pitrou40322e62013-08-11 00:30:09 +0200415/* used by import.c:PyImport_Cleanup */
416void
417_PyState_ClearModules(void)
418{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100419 PyInterpreterState *state = GET_INTERP_STATE();
Antoine Pitrou40322e62013-08-11 00:30:09 +0200420 if (state->modules_by_index) {
421 Py_ssize_t i;
422 for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) {
423 PyObject *m = PyList_GET_ITEM(state->modules_by_index, i);
424 if (PyModule_Check(m)) {
425 /* cleanup the saved copy of module dicts */
426 PyModuleDef *md = PyModule_GetDef(m);
427 if (md)
428 Py_CLEAR(md->m_base.m_copy);
429 }
430 }
431 /* Setting modules_by_index to NULL could be dangerous, so we
432 clear the list instead. */
433 if (PyList_SetSlice(state->modules_by_index,
434 0, PyList_GET_SIZE(state->modules_by_index),
435 NULL))
436 PyErr_WriteUnraisable(state->modules_by_index);
437 }
438}
439
Guido van Rossuma027efa1997-05-05 20:56:21 +0000440void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000441PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000442{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 if (Py_VerboseFlag && tstate->frame != NULL)
444 fprintf(stderr,
445 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447 Py_CLEAR(tstate->frame);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449 Py_CLEAR(tstate->dict);
450 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000452 Py_CLEAR(tstate->curexc_type);
453 Py_CLEAR(tstate->curexc_value);
454 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456 Py_CLEAR(tstate->exc_type);
457 Py_CLEAR(tstate->exc_value);
458 Py_CLEAR(tstate->exc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 tstate->c_profilefunc = NULL;
461 tstate->c_tracefunc = NULL;
462 Py_CLEAR(tstate->c_profileobj);
463 Py_CLEAR(tstate->c_traceobj);
Yury Selivanov75445082015-05-11 22:57:16 -0400464
465 Py_CLEAR(tstate->coroutine_wrapper);
Yury Selivanoveb636452016-09-08 22:01:51 -0700466 Py_CLEAR(tstate->async_gen_firstiter);
467 Py_CLEAR(tstate->async_gen_finalizer);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000468}
469
470
Guido van Rossum29757862001-01-23 01:46:06 +0000471/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
472static void
473tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000474{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000475 PyInterpreterState *interp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 if (tstate == NULL)
477 Py_FatalError("PyThreadState_Delete: NULL tstate");
478 interp = tstate->interp;
479 if (interp == NULL)
480 Py_FatalError("PyThreadState_Delete: NULL interp");
481 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200482 if (tstate->prev)
483 tstate->prev->next = tstate->next;
484 else
485 interp->tstate_head = tstate->next;
486 if (tstate->next)
487 tstate->next->prev = tstate->prev;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 HEAD_UNLOCK();
Antoine Pitrou7b476992013-09-07 23:38:37 +0200489 if (tstate->on_delete != NULL) {
490 tstate->on_delete(tstate->on_delete_data);
491 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200492 PyMem_RawFree(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000493}
494
495
Guido van Rossum29757862001-01-23 01:46:06 +0000496void
497PyThreadState_Delete(PyThreadState *tstate)
498{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100499 if (tstate == GET_TSTATE())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000500 Py_FatalError("PyThreadState_Delete: tstate is still current");
Tim Petersf4e69282006-02-27 17:15:31 +0000501#ifdef WITH_THREAD
Eric Snow05351c12017-09-05 21:43:08 -0700502 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
503 PyThread_delete_key_value(autoTLSkey);
Tim Petersf4e69282006-02-27 17:15:31 +0000504#endif /* WITH_THREAD */
Christian Heimesb9dbc7d2013-07-01 23:42:28 +0200505 tstate_delete_common(tstate);
Guido van Rossum29757862001-01-23 01:46:06 +0000506}
507
508
509#ifdef WITH_THREAD
510void
511PyThreadState_DeleteCurrent()
512{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100513 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 if (tstate == NULL)
515 Py_FatalError(
516 "PyThreadState_DeleteCurrent: no current tstate");
Victor Stinner8a1be612016-03-14 22:07:55 +0100517 tstate_delete_common(tstate);
Eric Snow05351c12017-09-05 21:43:08 -0700518 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
519 PyThread_delete_key_value(autoTLSkey);
Victor Stinner8a1be612016-03-14 22:07:55 +0100520 SET_TSTATE(NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000521 PyEval_ReleaseLock();
Guido van Rossum29757862001-01-23 01:46:06 +0000522}
523#endif /* WITH_THREAD */
524
525
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200526/*
527 * Delete all thread states except the one passed as argument.
528 * Note that, if there is a current thread state, it *must* be the one
529 * passed as argument. Also, this won't touch any other interpreters
530 * than the current one, since we don't know which thread state should
531 * be kept in those other interpreteres.
532 */
533void
534_PyThreadState_DeleteExcept(PyThreadState *tstate)
535{
536 PyInterpreterState *interp = tstate->interp;
537 PyThreadState *p, *next, *garbage;
538 HEAD_LOCK();
539 /* Remove all thread states, except tstate, from the linked list of
540 thread states. This will allow calling PyThreadState_Clear()
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200541 without holding the lock. */
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200542 garbage = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200543 if (garbage == tstate)
544 garbage = tstate->next;
545 if (tstate->prev)
546 tstate->prev->next = tstate->next;
547 if (tstate->next)
548 tstate->next->prev = tstate->prev;
549 tstate->prev = tstate->next = NULL;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200550 interp->tstate_head = tstate;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200551 HEAD_UNLOCK();
552 /* Clear and deallocate all stale thread states. Even if this
553 executes Python code, we should be safe since it executes
554 in the current thread, not one of the stale threads. */
555 for (p = garbage; p; p = next) {
556 next = p->next;
557 PyThreadState_Clear(p);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200558 PyMem_RawFree(p);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200559 }
560}
561
562
Guido van Rossuma027efa1997-05-05 20:56:21 +0000563PyThreadState *
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100564_PyThreadState_UncheckedGet(void)
565{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100566 return GET_TSTATE();
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100567}
568
569
570PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000571PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000572{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100573 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 if (tstate == NULL)
575 Py_FatalError("PyThreadState_Get: no current thread");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000578}
579
580
581PyThreadState *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000582PyThreadState_Swap(PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000583{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100584 PyThreadState *oldts = GET_TSTATE();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000585
Victor Stinnerb02ef712016-01-22 14:09:55 +0100586 SET_TSTATE(newts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 /* It should not be possible for more than one thread state
588 to be used for a thread. Check this the best we can in debug
589 builds.
590 */
Martin v. Löwis9e296252003-05-01 05:25:29 +0000591#if defined(Py_DEBUG) && defined(WITH_THREAD)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 if (newts) {
593 /* This can be called from PyEval_RestoreThread(). Similar
594 to it, we need to ensure errno doesn't change.
595 */
596 int err = errno;
597 PyThreadState *check = PyGILState_GetThisThreadState();
598 if (check && check->interp == newts->interp && check != newts)
599 Py_FatalError("Invalid thread state for this thread");
600 errno = err;
601 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000602#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000604}
Guido van Rossumede04391998-04-10 20:18:25 +0000605
606/* An extension mechanism to store arbitrary additional per-thread state.
607 PyThreadState_GetDict() returns a dictionary that can be used to hold such
608 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +0000609 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
610 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +0000611
612PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000613PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000614{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100615 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 if (tstate == NULL)
617 return NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 if (tstate->dict == NULL) {
620 PyObject *d;
621 tstate->dict = d = PyDict_New();
622 if (d == NULL)
623 PyErr_Clear();
624 }
625 return tstate->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000626}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000627
628
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000629/* Asynchronously raise an exception in a thread.
630 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +0000631 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000632 to call this, or use ctypes. Must be called with the GIL held.
633 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
634 match any known thread id). Can be called with exc=NULL to clear an
635 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000636
637int
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200638PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc)
639{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100640 PyInterpreterState *interp = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 PyThreadState *p;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 /* Although the GIL is held, a few C API functions can be called
644 * without the GIL held, and in particular some that create and
645 * destroy thread and interpreter states. Those can mutate the
646 * list of thread states we're traversing, so to prevent that we lock
647 * head_mutex for the duration.
648 */
649 HEAD_LOCK();
650 for (p = interp->tstate_head; p != NULL; p = p->next) {
651 if (p->thread_id == id) {
652 /* Tricky: we need to decref the current value
653 * (if any) in p->async_exc, but that can in turn
654 * allow arbitrary Python code to run, including
655 * perhaps calls to this function. To prevent
656 * deadlock, we need to release head_mutex before
657 * the decref.
658 */
659 PyObject *old_exc = p->async_exc;
660 Py_XINCREF(exc);
661 p->async_exc = exc;
662 HEAD_UNLOCK();
663 Py_XDECREF(old_exc);
664 _PyEval_SignalAsyncExc();
665 return 1;
666 }
667 }
668 HEAD_UNLOCK();
669 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000670}
671
672
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000673/* Routines for advanced debuggers, requested by David Beazley.
674 Don't use unless you know what you are doing! */
675
676PyInterpreterState *
677PyInterpreterState_Head(void)
678{
Eric Snow05351c12017-09-05 21:43:08 -0700679 return interp_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000680}
681
682PyInterpreterState *
Eric Snow6b4be192017-05-22 21:36:03 -0700683PyInterpreterState_Main(void)
684{
Eric Snow05351c12017-09-05 21:43:08 -0700685 return interp_main;
Eric Snow6b4be192017-05-22 21:36:03 -0700686}
687
688PyInterpreterState *
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000689PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000691}
692
693PyThreadState *
694PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000696}
697
698PyThreadState *
699PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000701}
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000702
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000703/* The implementation of sys._current_frames(). This is intended to be
704 called with the GIL held, as it will be when called via
705 sys._current_frames(). It's possible it would work fine even without
706 the GIL held, but haven't thought enough about that.
707*/
708PyObject *
709_PyThread_CurrentFrames(void)
710{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 PyObject *result;
712 PyInterpreterState *i;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 result = PyDict_New();
715 if (result == NULL)
716 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 /* for i in all interpreters:
719 * for t in all of i's thread states:
720 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +0200721 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 * need to grab head_mutex for the duration.
723 */
724 HEAD_LOCK();
Eric Snow05351c12017-09-05 21:43:08 -0700725 for (i = interp_head; i != NULL; i = i->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 PyThreadState *t;
727 for (t = i->tstate_head; t != NULL; t = t->next) {
728 PyObject *id;
729 int stat;
730 struct _frame *frame = t->frame;
731 if (frame == NULL)
732 continue;
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200733 id = PyLong_FromUnsignedLong(t->thread_id);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 if (id == NULL)
735 goto Fail;
736 stat = PyDict_SetItem(result, id, (PyObject *)frame);
737 Py_DECREF(id);
738 if (stat < 0)
739 goto Fail;
740 }
741 }
742 HEAD_UNLOCK();
743 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000744
745 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000746 HEAD_UNLOCK();
747 Py_DECREF(result);
748 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000749}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000750
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000751/* Python "auto thread state" API. */
752#ifdef WITH_THREAD
753
754/* Keep this as a static, as it is not reliable! It can only
755 ever be compared to the state for the *current* thread.
756 * If not equal, then it doesn't matter that the actual
757 value may change immediately after comparison, as it can't
758 possibly change to the current thread's state.
759 * If equal, then the current thread holds the lock, so the value can't
760 change until we yield the lock.
761*/
762static int
763PyThreadState_IsCurrent(PyThreadState *tstate)
764{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 /* Must be the tstate for this thread */
766 assert(PyGILState_GetThisThreadState()==tstate);
Victor Stinnerb02ef712016-01-22 14:09:55 +0100767 return tstate == GET_TSTATE();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000768}
769
Tim Peters4c1f5ec2004-10-09 17:25:05 +0000770/* Internal initialization/finalization functions called by
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000771 Py_Initialize/Py_FinalizeEx
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000772*/
Tim Peters19717fa2004-10-09 17:38:29 +0000773void
774_PyGILState_Init(PyInterpreterState *i, PyThreadState *t)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000775{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 assert(i && t); /* must init with valid states */
Eric Snow05351c12017-09-05 21:43:08 -0700777 autoTLSkey = PyThread_create_key();
778 if (autoTLSkey == -1)
Kristján Valur Jónsson2fea9b92010-09-20 02:11:49 +0000779 Py_FatalError("Could not allocate TLS entry");
Eric Snow05351c12017-09-05 21:43:08 -0700780 autoInterpreterState = i;
781 assert(PyThread_get_key_value(autoTLSkey) == NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000782 assert(t->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 _PyGILState_NoteThreadState(t);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000785}
786
Victor Stinner861d9ab2016-03-16 22:45:24 +0100787PyInterpreterState *
788_PyGILState_GetInterpreterStateUnsafe(void)
789{
Eric Snow05351c12017-09-05 21:43:08 -0700790 return autoInterpreterState;
Victor Stinner861d9ab2016-03-16 22:45:24 +0100791}
792
Tim Peters19717fa2004-10-09 17:38:29 +0000793void
794_PyGILState_Fini(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000795{
Eric Snow05351c12017-09-05 21:43:08 -0700796 PyThread_delete_key(autoTLSkey);
797 autoTLSkey = -1;
798 autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000799}
800
Antoine Pitrouf7ecfac2017-05-28 11:35:14 +0200801/* Reset the TLS key - called by PyOS_AfterFork_Child().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200802 * This should not be necessary, but some - buggy - pthread implementations
Charles-François Natalia233df82011-11-22 19:49:51 +0100803 * don't reset TLS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200804 */
805void
806_PyGILState_Reinit(void)
807{
Jason Friedf82c9512017-05-22 16:58:55 -0700808#ifdef WITH_THREAD
Eric Snow05351c12017-09-05 21:43:08 -0700809 head_mutex = NULL;
810 HEAD_INIT();
Jason Friedf82c9512017-05-22 16:58:55 -0700811#endif
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200812 PyThreadState *tstate = PyGILState_GetThisThreadState();
Eric Snow05351c12017-09-05 21:43:08 -0700813 PyThread_delete_key(autoTLSkey);
814 if ((autoTLSkey = PyThread_create_key()) == -1)
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200815 Py_FatalError("Could not allocate TLS entry");
816
Charles-François Natalia233df82011-11-22 19:49:51 +0100817 /* If the thread had an associated auto thread state, reassociate it with
818 * the new key. */
Eric Snow05351c12017-09-05 21:43:08 -0700819 if (tstate && PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200820 Py_FatalError("Couldn't create autoTLSkey mapping");
821}
822
Michael W. Hudson188d4362005-06-20 16:52:57 +0000823/* When a thread state is created for a thread by some mechanism other than
824 PyGILState_Ensure, it's important that the GILState machinery knows about
825 it so it doesn't try to create another thread state for the thread (this is
826 a better fix for SF bug #1010677 than the first one attempted).
827*/
Thomas Wouters89f507f2006-12-13 04:49:30 +0000828static void
Michael W. Hudson188d4362005-06-20 16:52:57 +0000829_PyGILState_NoteThreadState(PyThreadState* tstate)
830{
Antoine Pitrou079ce542010-09-08 12:37:10 +0000831 /* If autoTLSkey isn't initialized, this must be the very first
832 threadstate created in Py_Initialize(). Don't do anything for now
833 (we'll be back here when _PyGILState_Init is called). */
Eric Snow05351c12017-09-05 21:43:08 -0700834 if (!autoInterpreterState)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 return;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 /* Stick the thread state for this thread in thread local storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +0000838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 The only situation where you can legitimately have more than one
840 thread state for an OS level thread is when there are multiple
Victor Stinner590cebe2013-12-13 11:08:56 +0100841 interpreters.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000842
Victor Stinner590cebe2013-12-13 11:08:56 +0100843 You shouldn't really be using the PyGILState_ APIs anyway (see issues
844 #10915 and #15751).
Michael W. Hudson188d4362005-06-20 16:52:57 +0000845
Victor Stinner590cebe2013-12-13 11:08:56 +0100846 The first thread state created for that given OS level thread will
847 "win", which seems reasonable behaviour.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 */
Eric Snow05351c12017-09-05 21:43:08 -0700849 if (PyThread_get_key_value(autoTLSkey) == NULL) {
850 if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
Victor Stinner590cebe2013-12-13 11:08:56 +0100851 Py_FatalError("Couldn't create autoTLSkey mapping");
852 }
Michael W. Hudson188d4362005-06-20 16:52:57 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 /* PyGILState_Release must not try to delete this thread state. */
855 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +0000856}
857
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000858/* The public functions */
Tim Peters19717fa2004-10-09 17:38:29 +0000859PyThreadState *
860PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000861{
Eric Snow05351c12017-09-05 21:43:08 -0700862 if (autoInterpreterState == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 return NULL;
Eric Snow05351c12017-09-05 21:43:08 -0700864 return (PyThreadState *)PyThread_get_key_value(autoTLSkey);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000865}
866
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700867int
868PyGILState_Check(void)
869{
Victor Stinner8a1be612016-03-14 22:07:55 +0100870 PyThreadState *tstate;
871
872 if (!_PyGILState_check_enabled)
873 return 1;
874
Eric Snow05351c12017-09-05 21:43:08 -0700875 if (autoTLSkey == -1)
Victor Stinner8a1be612016-03-14 22:07:55 +0100876 return 1;
877
878 tstate = GET_TSTATE();
879 if (tstate == NULL)
880 return 0;
881
882 return (tstate == PyGILState_GetThisThreadState());
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700883}
884
Tim Peters19717fa2004-10-09 17:38:29 +0000885PyGILState_STATE
886PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000887{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 int current;
889 PyThreadState *tcur;
890 /* Note that we do not auto-init Python here - apart from
891 potential races with 2 threads auto-initializing, pep-311
892 spells out other issues. Embedders are expected to have
893 called Py_Initialize() and usually PyEval_InitThreads().
894 */
Eric Snow05351c12017-09-05 21:43:08 -0700895 assert(autoInterpreterState); /* Py_Initialize() hasn't been called! */
896 tcur = (PyThreadState *)PyThread_get_key_value(autoTLSkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 if (tcur == NULL) {
Victor Stinner62ca1002013-12-13 01:46:43 +0100898 /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is
899 called from a new thread for the first time, we need the create the
900 GIL. */
901 PyEval_InitThreads();
902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 /* Create a new thread state for this thread */
Eric Snow05351c12017-09-05 21:43:08 -0700904 tcur = PyThreadState_New(autoInterpreterState);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 if (tcur == NULL)
906 Py_FatalError("Couldn't create thread-state for new thread");
907 /* This is our thread state! We'll need to delete it in the
908 matching call to PyGILState_Release(). */
909 tcur->gilstate_counter = 0;
910 current = 0; /* new thread state is never current */
911 }
912 else
913 current = PyThreadState_IsCurrent(tcur);
914 if (current == 0)
915 PyEval_RestoreThread(tcur);
916 /* Update our counter in the thread-state - no need for locks:
917 - tcur will remain valid as we hold the GIL.
918 - the counter is safe as we are the only thread "allowed"
919 to modify this value
920 */
921 ++tcur->gilstate_counter;
922 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000923}
924
Tim Peters19717fa2004-10-09 17:38:29 +0000925void
926PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000927{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 PyThreadState *tcur = (PyThreadState *)PyThread_get_key_value(
Eric Snow05351c12017-09-05 21:43:08 -0700929 autoTLSkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 if (tcur == NULL)
931 Py_FatalError("auto-releasing thread-state, "
932 "but no thread-state for this thread");
933 /* We must hold the GIL and have our thread state current */
934 /* XXX - remove the check - the assert should be fine,
935 but while this is very new (April 2003), the extra check
936 by release-only users can't hurt.
937 */
938 if (! PyThreadState_IsCurrent(tcur))
939 Py_FatalError("This thread state must be current when releasing");
940 assert(PyThreadState_IsCurrent(tcur));
941 --tcur->gilstate_counter;
942 assert(tcur->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 /* If we're going to destroy this thread-state, we must
945 * clear it while the GIL is held, as destructors may run.
946 */
947 if (tcur->gilstate_counter == 0) {
948 /* can't have been locked when we created it */
949 assert(oldstate == PyGILState_UNLOCKED);
950 PyThreadState_Clear(tcur);
951 /* Delete the thread-state. Note this releases the GIL too!
952 * It's vital that the GIL be held here, to avoid shutdown
953 * races; see bugs 225673 and 1061968 (that nasty bug has a
954 * habit of coming back).
955 */
956 PyThreadState_DeleteCurrent();
957 }
958 /* Release the lock if necessary */
959 else if (oldstate == PyGILState_UNLOCKED)
960 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000961}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000962
Benjamin Peterson3bf01752012-04-13 18:06:36 -0400963#endif /* WITH_THREAD */
964
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000965#ifdef __cplusplus
966}
967#endif
968
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000969