blob: 500f96768752f4c37fcda6b878691c690c4c124c [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"
Eric Snow2ebc5ce2017-09-07 23:51:28 -06005#include "internal/pystate.h"
Guido van Rossuma027efa1997-05-05 20:56:21 +00006
Victor Stinnerb02ef712016-01-22 14:09:55 +01007#define GET_TSTATE() \
8 ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current))
9#define SET_TSTATE(value) \
Benjamin Petersonca470632016-09-06 13:47:26 -070010 _Py_atomic_store_relaxed(&_PyThreadState_Current, (uintptr_t)(value))
Victor Stinnerb02ef712016-01-22 14:09:55 +010011#define GET_INTERP_STATE() \
12 (GET_TSTATE()->interp)
13
Victor Stinnerbfd316e2016-01-20 11:12:38 +010014
Tim Peters84705582004-10-10 02:47:33 +000015/* --------------------------------------------------------------------------
16CAUTION
17
Victor Stinner1a7425f2013-07-07 16:25:15 +020018Always use PyMem_RawMalloc() and PyMem_RawFree() directly in this file. A
19number of these functions are advertised as safe to call when the GIL isn't
20held, and in a debug build Python redirects (e.g.) PyMem_NEW (etc) to Python's
21debugging obmalloc functions. Those aren't thread-safe (they rely on the GIL
22to avoid the expense of doing their own locking).
Tim Peters84705582004-10-10 02:47:33 +000023-------------------------------------------------------------------------- */
24
Martin v. Löwisf0473d52001-07-18 16:17:16 +000025#ifdef HAVE_DLOPEN
26#ifdef HAVE_DLFCN_H
27#include <dlfcn.h>
28#endif
Serhiy Storchakac2f7d872016-05-04 09:44:44 +030029#if !HAVE_DECL_RTLD_LAZY
Martin v. Löwisf0473d52001-07-18 16:17:16 +000030#define RTLD_LAZY 1
31#endif
32#endif
33
Benjamin Peterson43162b82012-04-13 11:58:27 -040034#ifdef __cplusplus
35extern "C" {
36#endif
Martin v. Löwisf0473d52001-07-18 16:17:16 +000037
Victor Stinner5d39e042017-11-29 17:20:38 +010038static _PyInitError
39_PyRuntimeState_Init_impl(_PyRuntimeState *runtime)
Eric Snow2ebc5ce2017-09-07 23:51:28 -060040{
41 memset(runtime, 0, sizeof(*runtime));
Victor Stinner8a1be612016-03-14 22:07:55 +010042
Eric Snow2ebc5ce2017-09-07 23:51:28 -060043 _PyGC_Initialize(&runtime->gc);
44 _PyEval_Initialize(&runtime->ceval);
Michael W. Hudson188d4362005-06-20 16:52:57 +000045
Eric Snow2ebc5ce2017-09-07 23:51:28 -060046 runtime->gilstate.check_enabled = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -080047
Masayuki Yamamoto731e1892017-10-06 19:41:34 +090048 /* A TSS key must be initialized with Py_tss_NEEDS_INIT
49 in accordance with the specification. */
Victor Stinnerf7e5b562017-11-15 15:48:08 -080050 Py_tss_t initial = Py_tss_NEEDS_INIT;
51 runtime->gilstate.autoTSSkey = initial;
Guido van Rossum1d5ad901999-06-18 14:22:24 +000052
Eric Snow2ebc5ce2017-09-07 23:51:28 -060053 runtime->interpreters.mutex = PyThread_allocate_lock();
Victor Stinnerf7e5b562017-11-15 15:48:08 -080054 if (runtime->interpreters.mutex == NULL) {
55 return _Py_INIT_ERR("Can't initialize threads for interpreter");
56 }
57
Eric Snow2ebc5ce2017-09-07 23:51:28 -060058 runtime->interpreters.next_id = -1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -080059 return _Py_INIT_OK();
Eric Snow2ebc5ce2017-09-07 23:51:28 -060060}
Eric Snow05351c12017-09-05 21:43:08 -070061
Victor Stinner5d39e042017-11-29 17:20:38 +010062_PyInitError
63_PyRuntimeState_Init(_PyRuntimeState *runtime)
64{
65 /* Force default allocator, since _PyRuntimeState_Fini() must
66 use the same allocator than this function. */
67 PyMemAllocatorEx old_alloc;
68 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
69
70 _PyInitError err = _PyRuntimeState_Init_impl(runtime);
71
72 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
73 return err;
74}
75
Eric Snow2ebc5ce2017-09-07 23:51:28 -060076void
77_PyRuntimeState_Fini(_PyRuntimeState *runtime)
78{
Victor Stinner5d39e042017-11-29 17:20:38 +010079 /* Force the allocator used by _PyRuntimeState_Init(). */
80 PyMemAllocatorEx old_alloc;
81 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinnerccb04422017-11-16 03:20:31 -080082
Eric Snow2ebc5ce2017-09-07 23:51:28 -060083 if (runtime->interpreters.mutex != NULL) {
84 PyThread_free_lock(runtime->interpreters.mutex);
85 runtime->interpreters.mutex = NULL;
86 }
Victor Stinnerccb04422017-11-16 03:20:31 -080087
88 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Eric Snow2ebc5ce2017-09-07 23:51:28 -060089}
90
91#define HEAD_LOCK() PyThread_acquire_lock(_PyRuntime.interpreters.mutex, \
92 WAIT_LOCK)
93#define HEAD_UNLOCK() PyThread_release_lock(_PyRuntime.interpreters.mutex)
Eric Snow05351c12017-09-05 21:43:08 -070094
Michael W. Hudson188d4362005-06-20 16:52:57 +000095static void _PyGILState_NoteThreadState(PyThreadState* tstate);
96
Victor Stinnera7368ac2017-11-15 18:11:45 -080097_PyInitError
Eric Snow2ebc5ce2017-09-07 23:51:28 -060098_PyInterpreterState_Enable(_PyRuntimeState *runtime)
Eric Snowe3774162017-05-22 19:46:40 -070099{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600100 runtime->interpreters.next_id = 0;
101 /* Since we only call _PyRuntimeState_Init() once per process
102 (see _PyRuntime_Initialize()), we make sure the mutex is
103 initialized here. */
104 if (runtime->interpreters.mutex == NULL) {
105 runtime->interpreters.mutex = PyThread_allocate_lock();
Victor Stinnera7368ac2017-11-15 18:11:45 -0800106 if (runtime->interpreters.mutex == NULL) {
107 return _Py_INIT_ERR("Can't initialize threads for interpreter");
108 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600109 }
Victor Stinnera7368ac2017-11-15 18:11:45 -0800110 return _Py_INIT_OK();
Eric Snowe3774162017-05-22 19:46:40 -0700111}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000112
113PyInterpreterState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000114PyInterpreterState_New(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 PyInterpreterState *interp = (PyInterpreterState *)
Victor Stinner1a7425f2013-07-07 16:25:15 +0200117 PyMem_RawMalloc(sizeof(PyInterpreterState));
Guido van Rossum25ce5661997-08-02 03:10:38 +0000118
Victor Stinnerd4341102017-11-23 00:12:09 +0100119 if (interp == NULL) {
120 return NULL;
121 }
122
123
124 interp->modules = NULL;
125 interp->modules_by_index = NULL;
126 interp->sysdict = NULL;
127 interp->builtins = NULL;
128 interp->builtins_copy = NULL;
129 interp->tstate_head = NULL;
130 interp->check_interval = 100;
131 interp->num_threads = 0;
132 interp->pythread_stacksize = 0;
133 interp->codec_search_path = NULL;
134 interp->codec_search_cache = NULL;
135 interp->codec_error_registry = NULL;
136 interp->codecs_initialized = 0;
137 interp->fscodec_initialized = 0;
138 interp->core_config = _PyCoreConfig_INIT;
139 interp->config = _PyMainInterpreterConfig_INIT;
140 interp->importlib = NULL;
141 interp->import_func = NULL;
142 interp->eval_frame = _PyEval_EvalFrameDefault;
143 interp->co_extra_user_count = 0;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000144#ifdef HAVE_DLOPEN
Serhiy Storchakac2f7d872016-05-04 09:44:44 +0300145#if HAVE_DECL_RTLD_NOW
Victor Stinnerd4341102017-11-23 00:12:09 +0100146 interp->dlopenflags = RTLD_NOW;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000147#else
Victor Stinnerd4341102017-11-23 00:12:09 +0100148 interp->dlopenflags = RTLD_LAZY;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000149#endif
150#endif
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200151#ifdef HAVE_FORK
Victor Stinnerd4341102017-11-23 00:12:09 +0100152 interp->before_forkers = NULL;
153 interp->after_forkers_parent = NULL;
154 interp->after_forkers_child = NULL;
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200155#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000156
Victor Stinnerd4341102017-11-23 00:12:09 +0100157 HEAD_LOCK();
158 interp->next = _PyRuntime.interpreters.head;
159 if (_PyRuntime.interpreters.main == NULL) {
160 _PyRuntime.interpreters.main = interp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000161 }
Victor Stinnerd4341102017-11-23 00:12:09 +0100162 _PyRuntime.interpreters.head = interp;
163 if (_PyRuntime.interpreters.next_id < 0) {
164 /* overflow or Py_Initialize() not called! */
165 PyErr_SetString(PyExc_RuntimeError,
166 "failed to get an interpreter ID");
167 interp = NULL;
168 } else {
169 interp->id = _PyRuntime.interpreters.next_id;
170 _PyRuntime.interpreters.next_id += 1;
171 }
172 HEAD_UNLOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 return interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000175}
176
177
178void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000179PyInterpreterState_Clear(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000180{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000181 PyThreadState *p;
182 HEAD_LOCK();
183 for (p = interp->tstate_head; p != NULL; p = p->next)
184 PyThreadState_Clear(p);
185 HEAD_UNLOCK();
186 Py_CLEAR(interp->codec_search_path);
187 Py_CLEAR(interp->codec_search_cache);
188 Py_CLEAR(interp->codec_error_registry);
Eric Snow93c92f72017-09-13 23:46:04 -0700189 Py_CLEAR(interp->modules);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000190 Py_CLEAR(interp->modules_by_index);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 Py_CLEAR(interp->sysdict);
192 Py_CLEAR(interp->builtins);
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200193 Py_CLEAR(interp->builtins_copy);
Brett Cannonfd074152012-04-14 14:10:13 -0400194 Py_CLEAR(interp->importlib);
Serhiy Storchaka133138a2016-08-02 22:51:21 +0300195 Py_CLEAR(interp->import_func);
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200196#ifdef HAVE_FORK
197 Py_CLEAR(interp->before_forkers);
198 Py_CLEAR(interp->after_forkers_parent);
199 Py_CLEAR(interp->after_forkers_child);
200#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000201}
202
203
204static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000205zapthreads(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000206{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207 PyThreadState *p;
208 /* No need to lock the mutex here because this should only happen
209 when the threads are all really dead (XXX famous last words). */
210 while ((p = interp->tstate_head) != NULL) {
211 PyThreadState_Delete(p);
212 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000213}
214
215
216void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000217PyInterpreterState_Delete(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000218{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000219 PyInterpreterState **p;
220 zapthreads(interp);
221 HEAD_LOCK();
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600222 for (p = &_PyRuntime.interpreters.head; ; p = &(*p)->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 if (*p == NULL)
224 Py_FatalError(
225 "PyInterpreterState_Delete: invalid interp");
226 if (*p == interp)
227 break;
228 }
229 if (interp->tstate_head != NULL)
230 Py_FatalError("PyInterpreterState_Delete: remaining threads");
231 *p = interp->next;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600232 if (_PyRuntime.interpreters.main == interp) {
233 _PyRuntime.interpreters.main = NULL;
234 if (_PyRuntime.interpreters.head != NULL)
Eric Snow6b4be192017-05-22 21:36:03 -0700235 Py_FatalError("PyInterpreterState_Delete: remaining subinterpreters");
236 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 HEAD_UNLOCK();
Victor Stinner1a7425f2013-07-07 16:25:15 +0200238 PyMem_RawFree(interp);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000239}
240
241
Eric Snowe3774162017-05-22 19:46:40 -0700242int64_t
243PyInterpreterState_GetID(PyInterpreterState *interp)
244{
245 if (interp == NULL) {
246 PyErr_SetString(PyExc_RuntimeError, "no interpreter provided");
247 return -1;
248 }
249 return interp->id;
250}
251
252
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000253/* Default implementation for _PyThreadState_GetFrame */
254static struct _frame *
255threadstate_getframe(PyThreadState *self)
256{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 return self->frame;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000258}
259
Victor Stinner45b9be52010-03-03 23:28:07 +0000260static PyThreadState *
261new_threadstate(PyInterpreterState *interp, int init)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000262{
Victor Stinner1a7425f2013-07-07 16:25:15 +0200263 PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState));
Tim Peters84705582004-10-10 02:47:33 +0000264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000265 if (_PyThreadState_GetFrame == NULL)
266 _PyThreadState_GetFrame = threadstate_getframe;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000268 if (tstate != NULL) {
269 tstate->interp = interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 tstate->frame = NULL;
272 tstate->recursion_depth = 0;
273 tstate->overflowed = 0;
274 tstate->recursion_critical = 0;
pdox18967932017-10-25 23:03:01 -0700275 tstate->stackcheck_counter = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000276 tstate->tracing = 0;
277 tstate->use_tracing = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000278 tstate->gilstate_counter = 0;
279 tstate->async_exc = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 tstate->thread_id = PyThread_get_thread_ident();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000282 tstate->dict = NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 tstate->curexc_type = NULL;
285 tstate->curexc_value = NULL;
286 tstate->curexc_traceback = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000287
Mark Shannonae3087c2017-10-22 22:41:51 +0100288 tstate->exc_state.exc_type = NULL;
289 tstate->exc_state.exc_value = NULL;
290 tstate->exc_state.exc_traceback = NULL;
291 tstate->exc_state.previous_item = NULL;
292 tstate->exc_info = &tstate->exc_state;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 tstate->c_profilefunc = NULL;
295 tstate->c_tracefunc = NULL;
296 tstate->c_profileobj = NULL;
297 tstate->c_traceobj = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000298
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200299 tstate->trash_delete_nesting = 0;
300 tstate->trash_delete_later = NULL;
Antoine Pitrou7b476992013-09-07 23:38:37 +0200301 tstate->on_delete = NULL;
302 tstate->on_delete_data = NULL;
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200303
Yury Selivanov75445082015-05-11 22:57:16 -0400304 tstate->coroutine_wrapper = NULL;
Yury Selivanovaab3c4a2015-06-02 18:43:51 -0400305 tstate->in_coroutine_wrapper = 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400306
Yury Selivanoveb636452016-09-08 22:01:51 -0700307 tstate->async_gen_firstiter = NULL;
308 tstate->async_gen_finalizer = NULL;
309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000310 if (init)
311 _PyThreadState_Init(tstate);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200314 tstate->prev = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 tstate->next = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200316 if (tstate->next)
317 tstate->next->prev = tstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 interp->tstate_head = tstate;
319 HEAD_UNLOCK();
320 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000322 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000323}
324
Victor Stinner45b9be52010-03-03 23:28:07 +0000325PyThreadState *
326PyThreadState_New(PyInterpreterState *interp)
327{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 return new_threadstate(interp, 1);
Victor Stinner45b9be52010-03-03 23:28:07 +0000329}
330
331PyThreadState *
332_PyThreadState_Prealloc(PyInterpreterState *interp)
333{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 return new_threadstate(interp, 0);
Victor Stinner45b9be52010-03-03 23:28:07 +0000335}
336
337void
338_PyThreadState_Init(PyThreadState *tstate)
339{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 _PyGILState_NoteThreadState(tstate);
Victor Stinner45b9be52010-03-03 23:28:07 +0000341}
342
Martin v. Löwis1a214512008-06-11 05:26:20 +0000343PyObject*
Martin v. Löwis7800f752012-06-22 12:20:55 +0200344PyState_FindModule(struct PyModuleDef* module)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000345{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200346 Py_ssize_t index = module->m_base.m_index;
Victor Stinnerb02ef712016-01-22 14:09:55 +0100347 PyInterpreterState *state = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 PyObject *res;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000349 if (module->m_slots) {
350 return NULL;
351 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 if (index == 0)
353 return NULL;
354 if (state->modules_by_index == NULL)
355 return NULL;
Antoine Pitrou75506e82012-08-20 19:30:46 +0200356 if (index >= PyList_GET_SIZE(state->modules_by_index))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 return NULL;
358 res = PyList_GET_ITEM(state->modules_by_index, index);
359 return res==Py_None ? NULL : res;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000360}
361
362int
363_PyState_AddModule(PyObject* module, struct PyModuleDef* def)
364{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000365 PyInterpreterState *state;
Berker Peksag4b7b5652016-08-22 18:05:56 +0300366 if (!def) {
367 assert(PyErr_Occurred());
368 return -1;
369 }
Nick Coghland5cacbb2015-05-23 22:24:10 +1000370 if (def->m_slots) {
371 PyErr_SetString(PyExc_SystemError,
372 "PyState_AddModule called on module with slots");
373 return -1;
374 }
Victor Stinnerb02ef712016-01-22 14:09:55 +0100375 state = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 if (!state->modules_by_index) {
377 state->modules_by_index = PyList_New(0);
378 if (!state->modules_by_index)
379 return -1;
380 }
381 while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
382 if (PyList_Append(state->modules_by_index, Py_None) < 0)
383 return -1;
384 Py_INCREF(module);
385 return PyList_SetItem(state->modules_by_index,
386 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000387}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000388
Martin v. Löwis7800f752012-06-22 12:20:55 +0200389int
390PyState_AddModule(PyObject* module, struct PyModuleDef* def)
391{
392 Py_ssize_t index;
Victor Stinnerb02ef712016-01-22 14:09:55 +0100393 PyInterpreterState *state = GET_INTERP_STATE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200394 if (!def) {
395 Py_FatalError("PyState_AddModule: Module Definition is NULL");
396 return -1;
397 }
398 index = def->m_base.m_index;
399 if (state->modules_by_index) {
400 if(PyList_GET_SIZE(state->modules_by_index) >= index) {
401 if(module == PyList_GET_ITEM(state->modules_by_index, index)) {
402 Py_FatalError("PyState_AddModule: Module already added!");
403 return -1;
404 }
405 }
406 }
407 return _PyState_AddModule(module, def);
408}
409
410int
411PyState_RemoveModule(struct PyModuleDef* def)
412{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000413 PyInterpreterState *state;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200414 Py_ssize_t index = def->m_base.m_index;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000415 if (def->m_slots) {
416 PyErr_SetString(PyExc_SystemError,
417 "PyState_RemoveModule called on module with slots");
418 return -1;
419 }
Victor Stinnerb02ef712016-01-22 14:09:55 +0100420 state = GET_INTERP_STATE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200421 if (index == 0) {
422 Py_FatalError("PyState_RemoveModule: Module index invalid.");
423 return -1;
424 }
425 if (state->modules_by_index == NULL) {
426 Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible.");
427 return -1;
428 }
429 if (index > PyList_GET_SIZE(state->modules_by_index)) {
430 Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
431 return -1;
432 }
433 return PyList_SetItem(state->modules_by_index, index, Py_None);
434}
435
Antoine Pitrou40322e62013-08-11 00:30:09 +0200436/* used by import.c:PyImport_Cleanup */
437void
438_PyState_ClearModules(void)
439{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100440 PyInterpreterState *state = GET_INTERP_STATE();
Antoine Pitrou40322e62013-08-11 00:30:09 +0200441 if (state->modules_by_index) {
442 Py_ssize_t i;
443 for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) {
444 PyObject *m = PyList_GET_ITEM(state->modules_by_index, i);
445 if (PyModule_Check(m)) {
446 /* cleanup the saved copy of module dicts */
447 PyModuleDef *md = PyModule_GetDef(m);
448 if (md)
449 Py_CLEAR(md->m_base.m_copy);
450 }
451 }
452 /* Setting modules_by_index to NULL could be dangerous, so we
453 clear the list instead. */
454 if (PyList_SetSlice(state->modules_by_index,
455 0, PyList_GET_SIZE(state->modules_by_index),
456 NULL))
457 PyErr_WriteUnraisable(state->modules_by_index);
458 }
459}
460
Guido van Rossuma027efa1997-05-05 20:56:21 +0000461void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000462PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000463{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 if (Py_VerboseFlag && tstate->frame != NULL)
465 fprintf(stderr,
466 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000468 Py_CLEAR(tstate->frame);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 Py_CLEAR(tstate->dict);
471 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 Py_CLEAR(tstate->curexc_type);
474 Py_CLEAR(tstate->curexc_value);
475 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000476
Mark Shannonae3087c2017-10-22 22:41:51 +0100477 Py_CLEAR(tstate->exc_state.exc_type);
478 Py_CLEAR(tstate->exc_state.exc_value);
479 Py_CLEAR(tstate->exc_state.exc_traceback);
Serhiy Storchakabdf42982017-10-26 16:59:40 +0300480
Mark Shannonae3087c2017-10-22 22:41:51 +0100481 /* The stack of exception states should contain just this thread. */
482 assert(tstate->exc_info->previous_item == NULL);
483 if (Py_VerboseFlag && tstate->exc_info != &tstate->exc_state) {
484 fprintf(stderr,
485 "PyThreadState_Clear: warning: thread still has a generator\n");
486 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 tstate->c_profilefunc = NULL;
489 tstate->c_tracefunc = NULL;
490 Py_CLEAR(tstate->c_profileobj);
491 Py_CLEAR(tstate->c_traceobj);
Yury Selivanov75445082015-05-11 22:57:16 -0400492
493 Py_CLEAR(tstate->coroutine_wrapper);
Yury Selivanoveb636452016-09-08 22:01:51 -0700494 Py_CLEAR(tstate->async_gen_firstiter);
495 Py_CLEAR(tstate->async_gen_finalizer);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000496}
497
498
Guido van Rossum29757862001-01-23 01:46:06 +0000499/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
500static void
501tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000502{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 PyInterpreterState *interp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 if (tstate == NULL)
505 Py_FatalError("PyThreadState_Delete: NULL tstate");
506 interp = tstate->interp;
507 if (interp == NULL)
508 Py_FatalError("PyThreadState_Delete: NULL interp");
509 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200510 if (tstate->prev)
511 tstate->prev->next = tstate->next;
512 else
513 interp->tstate_head = tstate->next;
514 if (tstate->next)
515 tstate->next->prev = tstate->prev;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 HEAD_UNLOCK();
Antoine Pitrou7b476992013-09-07 23:38:37 +0200517 if (tstate->on_delete != NULL) {
518 tstate->on_delete(tstate->on_delete_data);
519 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200520 PyMem_RawFree(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000521}
522
523
Guido van Rossum29757862001-01-23 01:46:06 +0000524void
525PyThreadState_Delete(PyThreadState *tstate)
526{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100527 if (tstate == GET_TSTATE())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 Py_FatalError("PyThreadState_Delete: tstate is still current");
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600529 if (_PyRuntime.gilstate.autoInterpreterState &&
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900530 PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == tstate)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600531 {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900532 PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, NULL);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600533 }
Christian Heimesb9dbc7d2013-07-01 23:42:28 +0200534 tstate_delete_common(tstate);
Guido van Rossum29757862001-01-23 01:46:06 +0000535}
536
537
Guido van Rossum29757862001-01-23 01:46:06 +0000538void
539PyThreadState_DeleteCurrent()
540{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100541 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 if (tstate == NULL)
543 Py_FatalError(
544 "PyThreadState_DeleteCurrent: no current tstate");
Victor Stinner8a1be612016-03-14 22:07:55 +0100545 tstate_delete_common(tstate);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600546 if (_PyRuntime.gilstate.autoInterpreterState &&
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900547 PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == tstate)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600548 {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900549 PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, NULL);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600550 }
Victor Stinner8a1be612016-03-14 22:07:55 +0100551 SET_TSTATE(NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 PyEval_ReleaseLock();
Guido van Rossum29757862001-01-23 01:46:06 +0000553}
Guido van Rossum29757862001-01-23 01:46:06 +0000554
555
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200556/*
557 * Delete all thread states except the one passed as argument.
558 * Note that, if there is a current thread state, it *must* be the one
559 * passed as argument. Also, this won't touch any other interpreters
560 * than the current one, since we don't know which thread state should
561 * be kept in those other interpreteres.
562 */
563void
564_PyThreadState_DeleteExcept(PyThreadState *tstate)
565{
566 PyInterpreterState *interp = tstate->interp;
567 PyThreadState *p, *next, *garbage;
568 HEAD_LOCK();
569 /* Remove all thread states, except tstate, from the linked list of
570 thread states. This will allow calling PyThreadState_Clear()
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200571 without holding the lock. */
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200572 garbage = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200573 if (garbage == tstate)
574 garbage = tstate->next;
575 if (tstate->prev)
576 tstate->prev->next = tstate->next;
577 if (tstate->next)
578 tstate->next->prev = tstate->prev;
579 tstate->prev = tstate->next = NULL;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200580 interp->tstate_head = tstate;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200581 HEAD_UNLOCK();
582 /* Clear and deallocate all stale thread states. Even if this
583 executes Python code, we should be safe since it executes
584 in the current thread, not one of the stale threads. */
585 for (p = garbage; p; p = next) {
586 next = p->next;
587 PyThreadState_Clear(p);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200588 PyMem_RawFree(p);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200589 }
590}
591
592
Guido van Rossuma027efa1997-05-05 20:56:21 +0000593PyThreadState *
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100594_PyThreadState_UncheckedGet(void)
595{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100596 return GET_TSTATE();
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100597}
598
599
600PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000601PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000602{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100603 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 if (tstate == NULL)
605 Py_FatalError("PyThreadState_Get: no current thread");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000608}
609
610
611PyThreadState *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000612PyThreadState_Swap(PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000613{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100614 PyThreadState *oldts = GET_TSTATE();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000615
Victor Stinnerb02ef712016-01-22 14:09:55 +0100616 SET_TSTATE(newts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 /* It should not be possible for more than one thread state
618 to be used for a thread. Check this the best we can in debug
619 builds.
620 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200621#if defined(Py_DEBUG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 if (newts) {
623 /* This can be called from PyEval_RestoreThread(). Similar
624 to it, we need to ensure errno doesn't change.
625 */
626 int err = errno;
627 PyThreadState *check = PyGILState_GetThisThreadState();
628 if (check && check->interp == newts->interp && check != newts)
629 Py_FatalError("Invalid thread state for this thread");
630 errno = err;
631 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000632#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000634}
Guido van Rossumede04391998-04-10 20:18:25 +0000635
636/* An extension mechanism to store arbitrary additional per-thread state.
637 PyThreadState_GetDict() returns a dictionary that can be used to hold such
638 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +0000639 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
640 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +0000641
642PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000643PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000644{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100645 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 if (tstate == NULL)
647 return NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 if (tstate->dict == NULL) {
650 PyObject *d;
651 tstate->dict = d = PyDict_New();
652 if (d == NULL)
653 PyErr_Clear();
654 }
655 return tstate->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000656}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000657
658
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000659/* Asynchronously raise an exception in a thread.
660 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +0000661 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000662 to call this, or use ctypes. Must be called with the GIL held.
663 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
664 match any known thread id). Can be called with exc=NULL to clear an
665 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000666
667int
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200668PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc)
669{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100670 PyInterpreterState *interp = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 PyThreadState *p;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 /* Although the GIL is held, a few C API functions can be called
674 * without the GIL held, and in particular some that create and
675 * destroy thread and interpreter states. Those can mutate the
676 * list of thread states we're traversing, so to prevent that we lock
677 * head_mutex for the duration.
678 */
679 HEAD_LOCK();
680 for (p = interp->tstate_head; p != NULL; p = p->next) {
681 if (p->thread_id == id) {
682 /* Tricky: we need to decref the current value
683 * (if any) in p->async_exc, but that can in turn
684 * allow arbitrary Python code to run, including
685 * perhaps calls to this function. To prevent
686 * deadlock, we need to release head_mutex before
687 * the decref.
688 */
689 PyObject *old_exc = p->async_exc;
690 Py_XINCREF(exc);
691 p->async_exc = exc;
692 HEAD_UNLOCK();
693 Py_XDECREF(old_exc);
694 _PyEval_SignalAsyncExc();
695 return 1;
696 }
697 }
698 HEAD_UNLOCK();
699 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000700}
701
702
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000703/* Routines for advanced debuggers, requested by David Beazley.
704 Don't use unless you know what you are doing! */
705
706PyInterpreterState *
707PyInterpreterState_Head(void)
708{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600709 return _PyRuntime.interpreters.head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000710}
711
712PyInterpreterState *
Eric Snow6b4be192017-05-22 21:36:03 -0700713PyInterpreterState_Main(void)
714{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600715 return _PyRuntime.interpreters.main;
Eric Snow6b4be192017-05-22 21:36:03 -0700716}
717
718PyInterpreterState *
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000719PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000721}
722
723PyThreadState *
724PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000726}
727
728PyThreadState *
729PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000731}
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000732
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000733/* The implementation of sys._current_frames(). This is intended to be
734 called with the GIL held, as it will be when called via
735 sys._current_frames(). It's possible it would work fine even without
736 the GIL held, but haven't thought enough about that.
737*/
738PyObject *
739_PyThread_CurrentFrames(void)
740{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 PyObject *result;
742 PyInterpreterState *i;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 result = PyDict_New();
745 if (result == NULL)
746 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000748 /* for i in all interpreters:
749 * for t in all of i's thread states:
750 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +0200751 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 * need to grab head_mutex for the duration.
753 */
754 HEAD_LOCK();
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600755 for (i = _PyRuntime.interpreters.head; i != NULL; i = i->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 PyThreadState *t;
757 for (t = i->tstate_head; t != NULL; t = t->next) {
758 PyObject *id;
759 int stat;
760 struct _frame *frame = t->frame;
761 if (frame == NULL)
762 continue;
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200763 id = PyLong_FromUnsignedLong(t->thread_id);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 if (id == NULL)
765 goto Fail;
766 stat = PyDict_SetItem(result, id, (PyObject *)frame);
767 Py_DECREF(id);
768 if (stat < 0)
769 goto Fail;
770 }
771 }
772 HEAD_UNLOCK();
773 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000774
775 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 HEAD_UNLOCK();
777 Py_DECREF(result);
778 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000779}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000780
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000781/* Python "auto thread state" API. */
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000782
783/* Keep this as a static, as it is not reliable! It can only
784 ever be compared to the state for the *current* thread.
785 * If not equal, then it doesn't matter that the actual
786 value may change immediately after comparison, as it can't
787 possibly change to the current thread's state.
788 * If equal, then the current thread holds the lock, so the value can't
789 change until we yield the lock.
790*/
791static int
792PyThreadState_IsCurrent(PyThreadState *tstate)
793{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 /* Must be the tstate for this thread */
795 assert(PyGILState_GetThisThreadState()==tstate);
Victor Stinnerb02ef712016-01-22 14:09:55 +0100796 return tstate == GET_TSTATE();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000797}
798
Tim Peters4c1f5ec2004-10-09 17:25:05 +0000799/* Internal initialization/finalization functions called by
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000800 Py_Initialize/Py_FinalizeEx
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000801*/
Tim Peters19717fa2004-10-09 17:38:29 +0000802void
803_PyGILState_Init(PyInterpreterState *i, PyThreadState *t)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000804{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 assert(i && t); /* must init with valid states */
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900806 if (PyThread_tss_create(&_PyRuntime.gilstate.autoTSSkey) != 0) {
807 Py_FatalError("Could not allocate TSS entry");
808 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600809 _PyRuntime.gilstate.autoInterpreterState = i;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900810 assert(PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 assert(t->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 _PyGILState_NoteThreadState(t);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000814}
815
Victor Stinner861d9ab2016-03-16 22:45:24 +0100816PyInterpreterState *
817_PyGILState_GetInterpreterStateUnsafe(void)
818{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600819 return _PyRuntime.gilstate.autoInterpreterState;
Victor Stinner861d9ab2016-03-16 22:45:24 +0100820}
821
Tim Peters19717fa2004-10-09 17:38:29 +0000822void
823_PyGILState_Fini(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000824{
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900825 PyThread_tss_delete(&_PyRuntime.gilstate.autoTSSkey);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600826 _PyRuntime.gilstate.autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000827}
828
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900829/* Reset the TSS key - called by PyOS_AfterFork_Child().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200830 * This should not be necessary, but some - buggy - pthread implementations
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900831 * don't reset TSS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200832 */
833void
834_PyGILState_Reinit(void)
835{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600836 _PyRuntime.interpreters.mutex = PyThread_allocate_lock();
837 if (_PyRuntime.interpreters.mutex == NULL)
838 Py_FatalError("Can't initialize threads for interpreter");
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200839 PyThreadState *tstate = PyGILState_GetThisThreadState();
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900840 PyThread_tss_delete(&_PyRuntime.gilstate.autoTSSkey);
841 if (PyThread_tss_create(&_PyRuntime.gilstate.autoTSSkey) != 0) {
842 Py_FatalError("Could not allocate TSS entry");
843 }
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200844
Charles-François Natalia233df82011-11-22 19:49:51 +0100845 /* If the thread had an associated auto thread state, reassociate it with
846 * the new key. */
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900847 if (tstate &&
848 PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, (void *)tstate) != 0)
849 {
850 Py_FatalError("Couldn't create autoTSSkey mapping");
851 }
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200852}
853
Michael W. Hudson188d4362005-06-20 16:52:57 +0000854/* When a thread state is created for a thread by some mechanism other than
855 PyGILState_Ensure, it's important that the GILState machinery knows about
856 it so it doesn't try to create another thread state for the thread (this is
857 a better fix for SF bug #1010677 than the first one attempted).
858*/
Thomas Wouters89f507f2006-12-13 04:49:30 +0000859static void
Michael W. Hudson188d4362005-06-20 16:52:57 +0000860_PyGILState_NoteThreadState(PyThreadState* tstate)
861{
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900862 /* If autoTSSkey isn't initialized, this must be the very first
Antoine Pitrou079ce542010-09-08 12:37:10 +0000863 threadstate created in Py_Initialize(). Don't do anything for now
864 (we'll be back here when _PyGILState_Init is called). */
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600865 if (!_PyRuntime.gilstate.autoInterpreterState)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 return;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000867
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900868 /* Stick the thread state for this thread in thread specific storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +0000869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 The only situation where you can legitimately have more than one
871 thread state for an OS level thread is when there are multiple
Victor Stinner590cebe2013-12-13 11:08:56 +0100872 interpreters.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000873
Victor Stinner590cebe2013-12-13 11:08:56 +0100874 You shouldn't really be using the PyGILState_ APIs anyway (see issues
875 #10915 and #15751).
Michael W. Hudson188d4362005-06-20 16:52:57 +0000876
Victor Stinner590cebe2013-12-13 11:08:56 +0100877 The first thread state created for that given OS level thread will
878 "win", which seems reasonable behaviour.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 */
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900880 if (PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == NULL) {
881 if ((PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, (void *)tstate)
882 ) != 0)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600883 {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900884 Py_FatalError("Couldn't create autoTSSkey mapping");
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600885 }
Victor Stinner590cebe2013-12-13 11:08:56 +0100886 }
Michael W. Hudson188d4362005-06-20 16:52:57 +0000887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 /* PyGILState_Release must not try to delete this thread state. */
889 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +0000890}
891
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000892/* The public functions */
Tim Peters19717fa2004-10-09 17:38:29 +0000893PyThreadState *
894PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000895{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600896 if (_PyRuntime.gilstate.autoInterpreterState == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 return NULL;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900898 return (PyThreadState *)PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000899}
900
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700901int
902PyGILState_Check(void)
903{
Victor Stinner8a1be612016-03-14 22:07:55 +0100904 PyThreadState *tstate;
905
906 if (!_PyGILState_check_enabled)
907 return 1;
908
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900909 if (!PyThread_tss_is_created(&_PyRuntime.gilstate.autoTSSkey)) {
Victor Stinner8a1be612016-03-14 22:07:55 +0100910 return 1;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900911 }
Victor Stinner8a1be612016-03-14 22:07:55 +0100912
913 tstate = GET_TSTATE();
914 if (tstate == NULL)
915 return 0;
916
917 return (tstate == PyGILState_GetThisThreadState());
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -0700918}
919
Tim Peters19717fa2004-10-09 17:38:29 +0000920PyGILState_STATE
921PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000922{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 int current;
924 PyThreadState *tcur;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +0100925 int need_init_threads = 0;
926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 /* Note that we do not auto-init Python here - apart from
928 potential races with 2 threads auto-initializing, pep-311
929 spells out other issues. Embedders are expected to have
930 called Py_Initialize() and usually PyEval_InitThreads().
931 */
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600932 /* Py_Initialize() hasn't been called! */
933 assert(_PyRuntime.gilstate.autoInterpreterState);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +0100934
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900935 tcur = (PyThreadState *)PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 if (tcur == NULL) {
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +0100937 need_init_threads = 1;
Victor Stinner62ca1002013-12-13 01:46:43 +0100938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 /* Create a new thread state for this thread */
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600940 tcur = PyThreadState_New(_PyRuntime.gilstate.autoInterpreterState);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 if (tcur == NULL)
942 Py_FatalError("Couldn't create thread-state for new thread");
943 /* This is our thread state! We'll need to delete it in the
944 matching call to PyGILState_Release(). */
945 tcur->gilstate_counter = 0;
946 current = 0; /* new thread state is never current */
947 }
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +0100948 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 current = PyThreadState_IsCurrent(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +0100950 }
951
952 if (current == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 PyEval_RestoreThread(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +0100954 }
955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 /* Update our counter in the thread-state - no need for locks:
957 - tcur will remain valid as we hold the GIL.
958 - the counter is safe as we are the only thread "allowed"
959 to modify this value
960 */
961 ++tcur->gilstate_counter;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +0100962
963 if (need_init_threads) {
964 /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is
965 called from a new thread for the first time, we need the create the
966 GIL. */
967 PyEval_InitThreads();
968 }
969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000971}
972
Tim Peters19717fa2004-10-09 17:38:29 +0000973void
974PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000975{
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900976 PyThreadState *tcur = (PyThreadState *)PyThread_tss_get(
977 &_PyRuntime.gilstate.autoTSSkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 if (tcur == NULL)
979 Py_FatalError("auto-releasing thread-state, "
980 "but no thread-state for this thread");
981 /* We must hold the GIL and have our thread state current */
982 /* XXX - remove the check - the assert should be fine,
983 but while this is very new (April 2003), the extra check
984 by release-only users can't hurt.
985 */
986 if (! PyThreadState_IsCurrent(tcur))
987 Py_FatalError("This thread state must be current when releasing");
988 assert(PyThreadState_IsCurrent(tcur));
989 --tcur->gilstate_counter;
990 assert(tcur->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 /* If we're going to destroy this thread-state, we must
993 * clear it while the GIL is held, as destructors may run.
994 */
995 if (tcur->gilstate_counter == 0) {
996 /* can't have been locked when we created it */
997 assert(oldstate == PyGILState_UNLOCKED);
998 PyThreadState_Clear(tcur);
999 /* Delete the thread-state. Note this releases the GIL too!
1000 * It's vital that the GIL be held here, to avoid shutdown
1001 * races; see bugs 225673 and 1061968 (that nasty bug has a
1002 * habit of coming back).
1003 */
1004 PyThreadState_DeleteCurrent();
1005 }
1006 /* Release the lock if necessary */
1007 else if (oldstate == PyGILState_UNLOCKED)
1008 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001009}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001010
Benjamin Peterson3bf01752012-04-13 18:06:36 -04001011
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001012#ifdef __cplusplus
1013}
1014#endif