blob: 24a08ebf4fe5eba45c5cf3d0851b20300a9f1108 [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
Victor Stinner8a1be612016-03-14 22:07:55 +010037int _PyGILState_check_enabled = 1;
38
Guido van Rossum1d5ad901999-06-18 14:22:24 +000039#ifdef WITH_THREAD
40#include "pythread.h"
41static PyThread_type_lock head_mutex = NULL; /* Protects interp->tstate_head */
Moshe Zadka9fb6af92000-08-04 21:27:47 +000042#define HEAD_INIT() (void)(head_mutex || (head_mutex = PyThread_allocate_lock()))
Guido van Rossum1d5ad901999-06-18 14:22:24 +000043#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
46/* The single PyInterpreterState used by this process'
47 GILState implementation
48*/
Eric Snow6b4be192017-05-22 21:36:03 -070049/* TODO: Given interp_main, it may be possible to kill this ref */
Michael W. Hudson188d4362005-06-20 16:52:57 +000050static PyInterpreterState *autoInterpreterState = NULL;
Victor Stinner8a1be612016-03-14 22:07:55 +010051static int autoTLSkey = -1;
Guido van Rossum1d5ad901999-06-18 14:22:24 +000052#else
53#define HEAD_INIT() /* Nothing */
54#define HEAD_LOCK() /* Nothing */
55#define HEAD_UNLOCK() /* Nothing */
56#endif
57
Guido van Rossum25ce5661997-08-02 03:10:38 +000058static PyInterpreterState *interp_head = NULL;
Eric Snow6b4be192017-05-22 21:36:03 -070059static PyInterpreterState *interp_main = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +000060
Jeffrey Yasskin39370832010-05-03 19:29:34 +000061/* Assuming the current thread holds the GIL, this is the
62 PyThreadState for the current thread. */
Victor Stinnerb02ef712016-01-22 14:09:55 +010063_Py_atomic_address _PyThreadState_Current = {0};
Guido van Rossum6297a7a2003-02-19 15:53:17 +000064PyThreadFrameGetter _PyThreadState_GetFrame = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +000065
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 Snowe3774162017-05-22 19:46:40 -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
82void
83_PyInterpreterState_Init(void)
84{
85 _next_interp_id = 0;
86}
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) {
95 HEAD_INIT();
Thomas Wouters0e3f5912006-08-11 14:57:12 +000096#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000097 if (head_mutex == NULL)
98 Py_FatalError("Can't initialize threads for interpreter");
Thomas Wouters0e3f5912006-08-11 14:57:12 +000099#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000100 interp->modules = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000101 interp->modules_by_index = NULL;
102 interp->sysdict = NULL;
103 interp->builtins = NULL;
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200104 interp->builtins_copy = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000105 interp->tstate_head = NULL;
106 interp->codec_search_path = NULL;
107 interp->codec_search_cache = NULL;
108 interp->codec_error_registry = NULL;
109 interp->codecs_initialized = 0;
Victor Stinner3cbf14b2011-04-27 00:24:21 +0200110 interp->fscodec_initialized = 0;
Brett Cannonfd074152012-04-14 14:10:13 -0400111 interp->importlib = NULL;
Serhiy Storchaka133138a2016-08-02 22:51:21 +0300112 interp->import_func = NULL;
Brett Cannon3cebf932016-09-05 15:33:46 -0700113 interp->eval_frame = _PyEval_EvalFrameDefault;
Dino Viehlandf3cffd22017-06-21 14:44:36 -0700114 interp->co_extra_user_count = 0;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000115#ifdef HAVE_DLOPEN
Serhiy Storchakac2f7d872016-05-04 09:44:44 +0300116#if HAVE_DECL_RTLD_NOW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000117 interp->dlopenflags = RTLD_NOW;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000118#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000119 interp->dlopenflags = RTLD_LAZY;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000120#endif
121#endif
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200122#ifdef HAVE_FORK
123 interp->before_forkers = NULL;
124 interp->after_forkers_parent = NULL;
125 interp->after_forkers_child = NULL;
126#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 HEAD_LOCK();
129 interp->next = interp_head;
Eric Snow6b4be192017-05-22 21:36:03 -0700130 if (interp_main == NULL) {
131 interp_main = interp;
132 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000133 interp_head = interp;
Eric Snowe3774162017-05-22 19:46:40 -0700134 if (_next_interp_id < 0) {
135 /* overflow or Py_Initialize() not called! */
136 PyErr_SetString(PyExc_RuntimeError,
137 "failed to get an interpreter ID");
138 interp = NULL;
139 } else {
140 interp->id = _next_interp_id;
141 _next_interp_id += 1;
142 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000143 HEAD_UNLOCK();
144 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146 return interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000147}
148
149
150void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000151PyInterpreterState_Clear(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000153 PyThreadState *p;
154 HEAD_LOCK();
155 for (p = interp->tstate_head; p != NULL; p = p->next)
156 PyThreadState_Clear(p);
157 HEAD_UNLOCK();
158 Py_CLEAR(interp->codec_search_path);
159 Py_CLEAR(interp->codec_search_cache);
160 Py_CLEAR(interp->codec_error_registry);
161 Py_CLEAR(interp->modules);
162 Py_CLEAR(interp->modules_by_index);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000163 Py_CLEAR(interp->sysdict);
164 Py_CLEAR(interp->builtins);
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200165 Py_CLEAR(interp->builtins_copy);
Brett Cannonfd074152012-04-14 14:10:13 -0400166 Py_CLEAR(interp->importlib);
Serhiy Storchaka133138a2016-08-02 22:51:21 +0300167 Py_CLEAR(interp->import_func);
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200168#ifdef HAVE_FORK
169 Py_CLEAR(interp->before_forkers);
170 Py_CLEAR(interp->after_forkers_parent);
171 Py_CLEAR(interp->after_forkers_child);
172#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000173}
174
175
176static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000177zapthreads(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000178{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000179 PyThreadState *p;
180 /* No need to lock the mutex here because this should only happen
181 when the threads are all really dead (XXX famous last words). */
182 while ((p = interp->tstate_head) != NULL) {
183 PyThreadState_Delete(p);
184 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000185}
186
187
188void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000189PyInterpreterState_Delete(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000190{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 PyInterpreterState **p;
192 zapthreads(interp);
193 HEAD_LOCK();
194 for (p = &interp_head; ; p = &(*p)->next) {
195 if (*p == NULL)
196 Py_FatalError(
197 "PyInterpreterState_Delete: invalid interp");
198 if (*p == interp)
199 break;
200 }
201 if (interp->tstate_head != NULL)
202 Py_FatalError("PyInterpreterState_Delete: remaining threads");
203 *p = interp->next;
Eric Snow6b4be192017-05-22 21:36:03 -0700204 if (interp_main == interp) {
205 interp_main = NULL;
206 if (interp_head != NULL)
207 Py_FatalError("PyInterpreterState_Delete: remaining subinterpreters");
208 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 HEAD_UNLOCK();
Victor Stinner1a7425f2013-07-07 16:25:15 +0200210 PyMem_RawFree(interp);
Antoine Pitrou8db076c2011-10-30 19:13:55 +0100211#ifdef WITH_THREAD
212 if (interp_head == NULL && head_mutex != NULL) {
213 PyThread_free_lock(head_mutex);
214 head_mutex = NULL;
215 }
216#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000217}
218
219
Eric Snowe3774162017-05-22 19:46:40 -0700220int64_t
221PyInterpreterState_GetID(PyInterpreterState *interp)
222{
223 if (interp == NULL) {
224 PyErr_SetString(PyExc_RuntimeError, "no interpreter provided");
225 return -1;
226 }
227 return interp->id;
228}
229
230
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000231/* Default implementation for _PyThreadState_GetFrame */
232static struct _frame *
233threadstate_getframe(PyThreadState *self)
234{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 return self->frame;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000236}
237
Victor Stinner45b9be52010-03-03 23:28:07 +0000238static PyThreadState *
239new_threadstate(PyInterpreterState *interp, int init)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000240{
Victor Stinner1a7425f2013-07-07 16:25:15 +0200241 PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState));
Tim Peters84705582004-10-10 02:47:33 +0000242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 if (_PyThreadState_GetFrame == NULL)
244 _PyThreadState_GetFrame = threadstate_getframe;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 if (tstate != NULL) {
247 tstate->interp = interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000249 tstate->frame = NULL;
250 tstate->recursion_depth = 0;
251 tstate->overflowed = 0;
252 tstate->recursion_critical = 0;
253 tstate->tracing = 0;
254 tstate->use_tracing = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000255 tstate->gilstate_counter = 0;
256 tstate->async_exc = NULL;
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000257#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000258 tstate->thread_id = PyThread_get_thread_ident();
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000259#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000260 tstate->thread_id = 0;
Martin v. Löwisf9ce67d2003-07-13 10:41:53 +0000261#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 tstate->dict = NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000265 tstate->curexc_type = NULL;
266 tstate->curexc_value = NULL;
267 tstate->curexc_traceback = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000269 tstate->exc_type = NULL;
270 tstate->exc_value = NULL;
271 tstate->exc_traceback = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000273 tstate->c_profilefunc = NULL;
274 tstate->c_tracefunc = NULL;
275 tstate->c_profileobj = NULL;
276 tstate->c_traceobj = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000277
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200278 tstate->trash_delete_nesting = 0;
279 tstate->trash_delete_later = NULL;
Antoine Pitrou7b476992013-09-07 23:38:37 +0200280 tstate->on_delete = NULL;
281 tstate->on_delete_data = NULL;
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200282
Yury Selivanov75445082015-05-11 22:57:16 -0400283 tstate->coroutine_wrapper = NULL;
Yury Selivanovaab3c4a2015-06-02 18:43:51 -0400284 tstate->in_coroutine_wrapper = 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400285
Yury Selivanoveb636452016-09-08 22:01:51 -0700286 tstate->async_gen_firstiter = NULL;
287 tstate->async_gen_finalizer = NULL;
288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289 if (init)
290 _PyThreadState_Init(tstate);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200293 tstate->prev = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 tstate->next = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200295 if (tstate->next)
296 tstate->next->prev = tstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 interp->tstate_head = tstate;
298 HEAD_UNLOCK();
299 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000302}
303
Victor Stinner45b9be52010-03-03 23:28:07 +0000304PyThreadState *
305PyThreadState_New(PyInterpreterState *interp)
306{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 return new_threadstate(interp, 1);
Victor Stinner45b9be52010-03-03 23:28:07 +0000308}
309
310PyThreadState *
311_PyThreadState_Prealloc(PyInterpreterState *interp)
312{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 return new_threadstate(interp, 0);
Victor Stinner45b9be52010-03-03 23:28:07 +0000314}
315
316void
317_PyThreadState_Init(PyThreadState *tstate)
318{
319#ifdef WITH_THREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000320 _PyGILState_NoteThreadState(tstate);
Victor Stinner45b9be52010-03-03 23:28:07 +0000321#endif
322}
323
Martin v. Löwis1a214512008-06-11 05:26:20 +0000324PyObject*
Martin v. Löwis7800f752012-06-22 12:20:55 +0200325PyState_FindModule(struct PyModuleDef* module)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000326{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200327 Py_ssize_t index = module->m_base.m_index;
Victor Stinnerb02ef712016-01-22 14:09:55 +0100328 PyInterpreterState *state = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000329 PyObject *res;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000330 if (module->m_slots) {
331 return NULL;
332 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000333 if (index == 0)
334 return NULL;
335 if (state->modules_by_index == NULL)
336 return NULL;
Antoine Pitrou75506e82012-08-20 19:30:46 +0200337 if (index >= PyList_GET_SIZE(state->modules_by_index))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 return NULL;
339 res = PyList_GET_ITEM(state->modules_by_index, index);
340 return res==Py_None ? NULL : res;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000341}
342
343int
344_PyState_AddModule(PyObject* module, struct PyModuleDef* def)
345{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000346 PyInterpreterState *state;
Berker Peksag4b7b5652016-08-22 18:05:56 +0300347 if (!def) {
348 assert(PyErr_Occurred());
349 return -1;
350 }
Nick Coghland5cacbb2015-05-23 22:24:10 +1000351 if (def->m_slots) {
352 PyErr_SetString(PyExc_SystemError,
353 "PyState_AddModule called on module with slots");
354 return -1;
355 }
Victor Stinnerb02ef712016-01-22 14:09:55 +0100356 state = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 if (!state->modules_by_index) {
358 state->modules_by_index = PyList_New(0);
359 if (!state->modules_by_index)
360 return -1;
361 }
362 while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
363 if (PyList_Append(state->modules_by_index, Py_None) < 0)
364 return -1;
365 Py_INCREF(module);
366 return PyList_SetItem(state->modules_by_index,
367 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000368}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000369
Martin v. Löwis7800f752012-06-22 12:20:55 +0200370int
371PyState_AddModule(PyObject* module, struct PyModuleDef* def)
372{
373 Py_ssize_t index;
Victor Stinnerb02ef712016-01-22 14:09:55 +0100374 PyInterpreterState *state = GET_INTERP_STATE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200375 if (!def) {
376 Py_FatalError("PyState_AddModule: Module Definition is NULL");
377 return -1;
378 }
379 index = def->m_base.m_index;
380 if (state->modules_by_index) {
381 if(PyList_GET_SIZE(state->modules_by_index) >= index) {
382 if(module == PyList_GET_ITEM(state->modules_by_index, index)) {
383 Py_FatalError("PyState_AddModule: Module already added!");
384 return -1;
385 }
386 }
387 }
388 return _PyState_AddModule(module, def);
389}
390
391int
392PyState_RemoveModule(struct PyModuleDef* def)
393{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000394 PyInterpreterState *state;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200395 Py_ssize_t index = def->m_base.m_index;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000396 if (def->m_slots) {
397 PyErr_SetString(PyExc_SystemError,
398 "PyState_RemoveModule called on module with slots");
399 return -1;
400 }
Victor Stinnerb02ef712016-01-22 14:09:55 +0100401 state = GET_INTERP_STATE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200402 if (index == 0) {
403 Py_FatalError("PyState_RemoveModule: Module index invalid.");
404 return -1;
405 }
406 if (state->modules_by_index == NULL) {
407 Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible.");
408 return -1;
409 }
410 if (index > PyList_GET_SIZE(state->modules_by_index)) {
411 Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
412 return -1;
413 }
414 return PyList_SetItem(state->modules_by_index, index, Py_None);
415}
416
Antoine Pitrou40322e62013-08-11 00:30:09 +0200417/* used by import.c:PyImport_Cleanup */
418void
419_PyState_ClearModules(void)
420{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100421 PyInterpreterState *state = GET_INTERP_STATE();
Antoine Pitrou40322e62013-08-11 00:30:09 +0200422 if (state->modules_by_index) {
423 Py_ssize_t i;
424 for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) {
425 PyObject *m = PyList_GET_ITEM(state->modules_by_index, i);
426 if (PyModule_Check(m)) {
427 /* cleanup the saved copy of module dicts */
428 PyModuleDef *md = PyModule_GetDef(m);
429 if (md)
430 Py_CLEAR(md->m_base.m_copy);
431 }
432 }
433 /* Setting modules_by_index to NULL could be dangerous, so we
434 clear the list instead. */
435 if (PyList_SetSlice(state->modules_by_index,
436 0, PyList_GET_SIZE(state->modules_by_index),
437 NULL))
438 PyErr_WriteUnraisable(state->modules_by_index);
439 }
440}
441
Guido van Rossuma027efa1997-05-05 20:56:21 +0000442void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000443PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000444{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 if (Py_VerboseFlag && tstate->frame != NULL)
446 fprintf(stderr,
447 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449 Py_CLEAR(tstate->frame);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 Py_CLEAR(tstate->dict);
452 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 Py_CLEAR(tstate->curexc_type);
455 Py_CLEAR(tstate->curexc_value);
456 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 Py_CLEAR(tstate->exc_type);
459 Py_CLEAR(tstate->exc_value);
460 Py_CLEAR(tstate->exc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000462 tstate->c_profilefunc = NULL;
463 tstate->c_tracefunc = NULL;
464 Py_CLEAR(tstate->c_profileobj);
465 Py_CLEAR(tstate->c_traceobj);
Yury Selivanov75445082015-05-11 22:57:16 -0400466
467 Py_CLEAR(tstate->coroutine_wrapper);
Yury Selivanoveb636452016-09-08 22:01:51 -0700468 Py_CLEAR(tstate->async_gen_firstiter);
469 Py_CLEAR(tstate->async_gen_finalizer);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000470}
471
472
Guido van Rossum29757862001-01-23 01:46:06 +0000473/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
474static void
475tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000476{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 PyInterpreterState *interp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 if (tstate == NULL)
479 Py_FatalError("PyThreadState_Delete: NULL tstate");
480 interp = tstate->interp;
481 if (interp == NULL)
482 Py_FatalError("PyThreadState_Delete: NULL interp");
483 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200484 if (tstate->prev)
485 tstate->prev->next = tstate->next;
486 else
487 interp->tstate_head = tstate->next;
488 if (tstate->next)
489 tstate->next->prev = tstate->prev;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 HEAD_UNLOCK();
Antoine Pitrou7b476992013-09-07 23:38:37 +0200491 if (tstate->on_delete != NULL) {
492 tstate->on_delete(tstate->on_delete_data);
493 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200494 PyMem_RawFree(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000495}
496
497
Guido van Rossum29757862001-01-23 01:46:06 +0000498void
499PyThreadState_Delete(PyThreadState *tstate)
500{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100501 if (tstate == GET_TSTATE())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 Py_FatalError("PyThreadState_Delete: tstate is still current");
Tim Petersf4e69282006-02-27 17:15:31 +0000503#ifdef WITH_THREAD
Antoine Pitrou079ce542010-09-08 12:37:10 +0000504 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 PyThread_delete_key_value(autoTLSkey);
Tim Petersf4e69282006-02-27 17:15:31 +0000506#endif /* WITH_THREAD */
Christian Heimesb9dbc7d2013-07-01 23:42:28 +0200507 tstate_delete_common(tstate);
Guido van Rossum29757862001-01-23 01:46:06 +0000508}
509
510
511#ifdef WITH_THREAD
512void
513PyThreadState_DeleteCurrent()
514{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100515 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 if (tstate == NULL)
517 Py_FatalError(
518 "PyThreadState_DeleteCurrent: no current tstate");
Victor Stinner8a1be612016-03-14 22:07:55 +0100519 tstate_delete_common(tstate);
Antoine Pitrou079ce542010-09-08 12:37:10 +0000520 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000521 PyThread_delete_key_value(autoTLSkey);
Victor Stinner8a1be612016-03-14 22:07:55 +0100522 SET_TSTATE(NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 PyEval_ReleaseLock();
Guido van Rossum29757862001-01-23 01:46:06 +0000524}
525#endif /* WITH_THREAD */
526
527
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200528/*
529 * Delete all thread states except the one passed as argument.
530 * Note that, if there is a current thread state, it *must* be the one
531 * passed as argument. Also, this won't touch any other interpreters
532 * than the current one, since we don't know which thread state should
533 * be kept in those other interpreteres.
534 */
535void
536_PyThreadState_DeleteExcept(PyThreadState *tstate)
537{
538 PyInterpreterState *interp = tstate->interp;
539 PyThreadState *p, *next, *garbage;
540 HEAD_LOCK();
541 /* Remove all thread states, except tstate, from the linked list of
542 thread states. This will allow calling PyThreadState_Clear()
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200543 without holding the lock. */
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200544 garbage = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200545 if (garbage == tstate)
546 garbage = tstate->next;
547 if (tstate->prev)
548 tstate->prev->next = tstate->next;
549 if (tstate->next)
550 tstate->next->prev = tstate->prev;
551 tstate->prev = tstate->next = NULL;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200552 interp->tstate_head = tstate;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200553 HEAD_UNLOCK();
554 /* Clear and deallocate all stale thread states. Even if this
555 executes Python code, we should be safe since it executes
556 in the current thread, not one of the stale threads. */
557 for (p = garbage; p; p = next) {
558 next = p->next;
559 PyThreadState_Clear(p);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200560 PyMem_RawFree(p);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200561 }
562}
563
564
Guido van Rossuma027efa1997-05-05 20:56:21 +0000565PyThreadState *
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100566_PyThreadState_UncheckedGet(void)
567{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100568 return GET_TSTATE();
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100569}
570
571
572PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000573PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000574{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100575 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 if (tstate == NULL)
577 Py_FatalError("PyThreadState_Get: no current thread");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000580}
581
582
583PyThreadState *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000584PyThreadState_Swap(PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000585{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100586 PyThreadState *oldts = GET_TSTATE();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000587
Victor Stinnerb02ef712016-01-22 14:09:55 +0100588 SET_TSTATE(newts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 /* It should not be possible for more than one thread state
590 to be used for a thread. Check this the best we can in debug
591 builds.
592 */
Martin v. Löwis9e296252003-05-01 05:25:29 +0000593#if defined(Py_DEBUG) && defined(WITH_THREAD)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 if (newts) {
595 /* This can be called from PyEval_RestoreThread(). Similar
596 to it, we need to ensure errno doesn't change.
597 */
598 int err = errno;
599 PyThreadState *check = PyGILState_GetThisThreadState();
600 if (check && check->interp == newts->interp && check != newts)
601 Py_FatalError("Invalid thread state for this thread");
602 errno = err;
603 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000604#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000606}
Guido van Rossumede04391998-04-10 20:18:25 +0000607
608/* An extension mechanism to store arbitrary additional per-thread state.
609 PyThreadState_GetDict() returns a dictionary that can be used to hold such
610 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +0000611 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
612 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +0000613
614PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000615PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000616{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100617 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 if (tstate == NULL)
619 return NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 if (tstate->dict == NULL) {
622 PyObject *d;
623 tstate->dict = d = PyDict_New();
624 if (d == NULL)
625 PyErr_Clear();
626 }
627 return tstate->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000628}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000629
630
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000631/* Asynchronously raise an exception in a thread.
632 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +0000633 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000634 to call this, or use ctypes. Must be called with the GIL held.
635 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
636 match any known thread id). Can be called with exc=NULL to clear an
637 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000638
639int
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200640PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc)
641{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100642 PyInterpreterState *interp = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 PyThreadState *p;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 /* Although the GIL is held, a few C API functions can be called
646 * without the GIL held, and in particular some that create and
647 * destroy thread and interpreter states. Those can mutate the
648 * list of thread states we're traversing, so to prevent that we lock
649 * head_mutex for the duration.
650 */
651 HEAD_LOCK();
652 for (p = interp->tstate_head; p != NULL; p = p->next) {
653 if (p->thread_id == id) {
654 /* Tricky: we need to decref the current value
655 * (if any) in p->async_exc, but that can in turn
656 * allow arbitrary Python code to run, including
657 * perhaps calls to this function. To prevent
658 * deadlock, we need to release head_mutex before
659 * the decref.
660 */
661 PyObject *old_exc = p->async_exc;
662 Py_XINCREF(exc);
663 p->async_exc = exc;
664 HEAD_UNLOCK();
665 Py_XDECREF(old_exc);
666 _PyEval_SignalAsyncExc();
667 return 1;
668 }
669 }
670 HEAD_UNLOCK();
671 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000672}
673
674
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000675/* Routines for advanced debuggers, requested by David Beazley.
676 Don't use unless you know what you are doing! */
677
678PyInterpreterState *
679PyInterpreterState_Head(void)
680{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 return interp_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000682}
683
684PyInterpreterState *
Eric Snow6b4be192017-05-22 21:36:03 -0700685PyInterpreterState_Main(void)
686{
687 return interp_main;
688}
689
690PyInterpreterState *
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000691PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000693}
694
695PyThreadState *
696PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000698}
699
700PyThreadState *
701PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000703}
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000704
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000705/* The implementation of sys._current_frames(). This is intended to be
706 called with the GIL held, as it will be when called via
707 sys._current_frames(). It's possible it would work fine even without
708 the GIL held, but haven't thought enough about that.
709*/
710PyObject *
711_PyThread_CurrentFrames(void)
712{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 PyObject *result;
714 PyInterpreterState *i;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 result = PyDict_New();
717 if (result == NULL)
718 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 /* for i in all interpreters:
721 * for t in all of i's thread states:
722 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +0200723 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000724 * need to grab head_mutex for the duration.
725 */
726 HEAD_LOCK();
727 for (i = interp_head; i != NULL; i = i->next) {
728 PyThreadState *t;
729 for (t = i->tstate_head; t != NULL; t = t->next) {
730 PyObject *id;
731 int stat;
732 struct _frame *frame = t->frame;
733 if (frame == NULL)
734 continue;
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200735 id = PyLong_FromUnsignedLong(t->thread_id);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000736 if (id == NULL)
737 goto Fail;
738 stat = PyDict_SetItem(result, id, (PyObject *)frame);
739 Py_DECREF(id);
740 if (stat < 0)
741 goto Fail;
742 }
743 }
744 HEAD_UNLOCK();
745 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000746
747 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000748 HEAD_UNLOCK();
749 Py_DECREF(result);
750 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000751}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000752
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000753/* Python "auto thread state" API. */
754#ifdef WITH_THREAD
755
756/* Keep this as a static, as it is not reliable! It can only
757 ever be compared to the state for the *current* thread.
758 * If not equal, then it doesn't matter that the actual
759 value may change immediately after comparison, as it can't
760 possibly change to the current thread's state.
761 * If equal, then the current thread holds the lock, so the value can't
762 change until we yield the lock.
763*/
764static int
765PyThreadState_IsCurrent(PyThreadState *tstate)
766{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 /* Must be the tstate for this thread */
768 assert(PyGILState_GetThisThreadState()==tstate);
Victor Stinnerb02ef712016-01-22 14:09:55 +0100769 return tstate == GET_TSTATE();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000770}
771
Tim Peters4c1f5ec2004-10-09 17:25:05 +0000772/* Internal initialization/finalization functions called by
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000773 Py_Initialize/Py_FinalizeEx
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000774*/
Tim Peters19717fa2004-10-09 17:38:29 +0000775void
776_PyGILState_Init(PyInterpreterState *i, PyThreadState *t)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000777{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 assert(i && t); /* must init with valid states */
779 autoTLSkey = PyThread_create_key();
Kristján Valur Jónsson2fea9b92010-09-20 02:11:49 +0000780 if (autoTLSkey == -1)
781 Py_FatalError("Could not allocate TLS entry");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000782 autoInterpreterState = i;
783 assert(PyThread_get_key_value(autoTLSkey) == NULL);
784 assert(t->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 _PyGILState_NoteThreadState(t);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000787}
788
Victor Stinner861d9ab2016-03-16 22:45:24 +0100789PyInterpreterState *
790_PyGILState_GetInterpreterStateUnsafe(void)
791{
792 return autoInterpreterState;
793}
794
Tim Peters19717fa2004-10-09 17:38:29 +0000795void
796_PyGILState_Fini(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000797{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 PyThread_delete_key(autoTLSkey);
Victor Stinner8a1be612016-03-14 22:07:55 +0100799 autoTLSkey = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000801}
802
Antoine Pitrouf7ecfac2017-05-28 11:35:14 +0200803/* Reset the TLS key - called by PyOS_AfterFork_Child().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200804 * This should not be necessary, but some - buggy - pthread implementations
Charles-François Natalia233df82011-11-22 19:49:51 +0100805 * don't reset TLS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200806 */
807void
808_PyGILState_Reinit(void)
809{
Jason Friedf82c9512017-05-22 16:58:55 -0700810#ifdef WITH_THREAD
811 head_mutex = NULL;
812 HEAD_INIT();
813#endif
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200814 PyThreadState *tstate = PyGILState_GetThisThreadState();
815 PyThread_delete_key(autoTLSkey);
816 if ((autoTLSkey = PyThread_create_key()) == -1)
817 Py_FatalError("Could not allocate TLS entry");
818
Charles-François Natalia233df82011-11-22 19:49:51 +0100819 /* If the thread had an associated auto thread state, reassociate it with
820 * the new key. */
821 if (tstate && PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200822 Py_FatalError("Couldn't create autoTLSkey mapping");
823}
824
Michael W. Hudson188d4362005-06-20 16:52:57 +0000825/* When a thread state is created for a thread by some mechanism other than
826 PyGILState_Ensure, it's important that the GILState machinery knows about
827 it so it doesn't try to create another thread state for the thread (this is
828 a better fix for SF bug #1010677 than the first one attempted).
829*/
Thomas Wouters89f507f2006-12-13 04:49:30 +0000830static void
Michael W. Hudson188d4362005-06-20 16:52:57 +0000831_PyGILState_NoteThreadState(PyThreadState* tstate)
832{
Antoine Pitrou079ce542010-09-08 12:37:10 +0000833 /* If autoTLSkey isn't initialized, this must be the very first
834 threadstate created in Py_Initialize(). Don't do anything for now
835 (we'll be back here when _PyGILState_Init is called). */
836 if (!autoInterpreterState)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 return;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 /* Stick the thread state for this thread in thread local storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +0000840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 The only situation where you can legitimately have more than one
842 thread state for an OS level thread is when there are multiple
Victor Stinner590cebe2013-12-13 11:08:56 +0100843 interpreters.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000844
Victor Stinner590cebe2013-12-13 11:08:56 +0100845 You shouldn't really be using the PyGILState_ APIs anyway (see issues
846 #10915 and #15751).
Michael W. Hudson188d4362005-06-20 16:52:57 +0000847
Victor Stinner590cebe2013-12-13 11:08:56 +0100848 The first thread state created for that given OS level thread will
849 "win", which seems reasonable behaviour.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 */
Victor Stinner590cebe2013-12-13 11:08:56 +0100851 if (PyThread_get_key_value(autoTLSkey) == NULL) {
852 if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
853 Py_FatalError("Couldn't create autoTLSkey mapping");
854 }
Michael W. Hudson188d4362005-06-20 16:52:57 +0000855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 /* PyGILState_Release must not try to delete this thread state. */
857 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +0000858}
859
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000860/* The public functions */
Tim Peters19717fa2004-10-09 17:38:29 +0000861PyThreadState *
862PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000863{
Antoine Pitrou079ce542010-09-08 12:37:10 +0000864 if (autoInterpreterState == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 return NULL;
866 return (PyThreadState *)PyThread_get_key_value(autoTLSkey);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000867}
868
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700869int
870PyGILState_Check(void)
871{
Victor Stinner8a1be612016-03-14 22:07:55 +0100872 PyThreadState *tstate;
873
874 if (!_PyGILState_check_enabled)
875 return 1;
876
877 if (autoTLSkey == -1)
878 return 1;
879
880 tstate = GET_TSTATE();
881 if (tstate == NULL)
882 return 0;
883
884 return (tstate == PyGILState_GetThisThreadState());
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700885}
886
Tim Peters19717fa2004-10-09 17:38:29 +0000887PyGILState_STATE
888PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000889{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 int current;
891 PyThreadState *tcur;
892 /* Note that we do not auto-init Python here - apart from
893 potential races with 2 threads auto-initializing, pep-311
894 spells out other issues. Embedders are expected to have
895 called Py_Initialize() and usually PyEval_InitThreads().
896 */
897 assert(autoInterpreterState); /* Py_Initialize() hasn't been called! */
898 tcur = (PyThreadState *)PyThread_get_key_value(autoTLSkey);
899 if (tcur == NULL) {
Victor Stinner62ca1002013-12-13 01:46:43 +0100900 /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is
901 called from a new thread for the first time, we need the create the
902 GIL. */
903 PyEval_InitThreads();
904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 /* Create a new thread state for this thread */
906 tcur = PyThreadState_New(autoInterpreterState);
907 if (tcur == NULL)
908 Py_FatalError("Couldn't create thread-state for new thread");
909 /* This is our thread state! We'll need to delete it in the
910 matching call to PyGILState_Release(). */
911 tcur->gilstate_counter = 0;
912 current = 0; /* new thread state is never current */
913 }
914 else
915 current = PyThreadState_IsCurrent(tcur);
916 if (current == 0)
917 PyEval_RestoreThread(tcur);
918 /* Update our counter in the thread-state - no need for locks:
919 - tcur will remain valid as we hold the GIL.
920 - the counter is safe as we are the only thread "allowed"
921 to modify this value
922 */
923 ++tcur->gilstate_counter;
924 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000925}
926
Tim Peters19717fa2004-10-09 17:38:29 +0000927void
928PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 PyThreadState *tcur = (PyThreadState *)PyThread_get_key_value(
931 autoTLSkey);
932 if (tcur == NULL)
933 Py_FatalError("auto-releasing thread-state, "
934 "but no thread-state for this thread");
935 /* We must hold the GIL and have our thread state current */
936 /* XXX - remove the check - the assert should be fine,
937 but while this is very new (April 2003), the extra check
938 by release-only users can't hurt.
939 */
940 if (! PyThreadState_IsCurrent(tcur))
941 Py_FatalError("This thread state must be current when releasing");
942 assert(PyThreadState_IsCurrent(tcur));
943 --tcur->gilstate_counter;
944 assert(tcur->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 /* If we're going to destroy this thread-state, we must
947 * clear it while the GIL is held, as destructors may run.
948 */
949 if (tcur->gilstate_counter == 0) {
950 /* can't have been locked when we created it */
951 assert(oldstate == PyGILState_UNLOCKED);
952 PyThreadState_Clear(tcur);
953 /* Delete the thread-state. Note this releases the GIL too!
954 * It's vital that the GIL be held here, to avoid shutdown
955 * races; see bugs 225673 and 1061968 (that nasty bug has a
956 * habit of coming back).
957 */
958 PyThreadState_DeleteCurrent();
959 }
960 /* Release the lock if necessary */
961 else if (oldstate == PyGILState_UNLOCKED)
962 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000963}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000964
Benjamin Peterson3bf01752012-04-13 18:06:36 -0400965#endif /* WITH_THREAD */
966
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000967#ifdef __cplusplus
968}
969#endif
970
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000971