blob: e37cbd5a6578732df0c9dd4d811c641c4aa91bfe [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"
Victor Stinner09532fe2019-05-10 23:39:09 +02005#include "pycore_ceval.h"
Victor Stinner331a6a52019-05-27 16:39:22 +02006#include "pycore_initconfig.h"
Victor Stinner0e427c62020-03-25 21:22:55 +01007#include "pycore_pyerrors.h"
8#include "pycore_pylifecycle.h"
Victor Stinnerd9ea5ca2020-04-15 02:57:50 +02009#include "pycore_pymem.h" // _PyMem_SetDefaultAllocator()
Victor Stinnere5014be2020-04-14 17:52:15 +020010#include "pycore_pystate.h" // _PyThreadState_GET()
Victor Stinner71a35222020-03-26 22:46:14 +010011#include "pycore_sysmodule.h"
Guido van Rossuma027efa1997-05-05 20:56:21 +000012
Tim Peters84705582004-10-10 02:47:33 +000013/* --------------------------------------------------------------------------
14CAUTION
15
Victor Stinner1a7425f2013-07-07 16:25:15 +020016Always use PyMem_RawMalloc() and PyMem_RawFree() directly in this file. A
17number of these functions are advertised as safe to call when the GIL isn't
18held, and in a debug build Python redirects (e.g.) PyMem_NEW (etc) to Python's
19debugging obmalloc functions. Those aren't thread-safe (they rely on the GIL
20to avoid the expense of doing their own locking).
Tim Peters84705582004-10-10 02:47:33 +000021-------------------------------------------------------------------------- */
22
Martin v. Löwisf0473d52001-07-18 16:17:16 +000023#ifdef HAVE_DLOPEN
24#ifdef HAVE_DLFCN_H
25#include <dlfcn.h>
26#endif
Serhiy Storchakac2f7d872016-05-04 09:44:44 +030027#if !HAVE_DECL_RTLD_LAZY
Martin v. Löwisf0473d52001-07-18 16:17:16 +000028#define RTLD_LAZY 1
29#endif
30#endif
31
Benjamin Peterson43162b82012-04-13 11:58:27 -040032#ifdef __cplusplus
33extern "C" {
34#endif
Martin v. Löwisf0473d52001-07-18 16:17:16 +000035
Victor Stinner10c8e6a2019-04-26 01:53:18 +020036#define _PyRuntimeGILState_GetThreadState(gilstate) \
37 ((PyThreadState*)_Py_atomic_load_relaxed(&(gilstate)->tstate_current))
38#define _PyRuntimeGILState_SetThreadState(gilstate, value) \
39 _Py_atomic_store_relaxed(&(gilstate)->tstate_current, \
40 (uintptr_t)(value))
41
42/* Forward declarations */
43static PyThreadState *_PyGILState_GetThisThreadState(struct _gilstate_runtime_state *gilstate);
Victor Stinner9da74302019-11-20 11:17:17 +010044static void _PyThreadState_Delete(PyThreadState *tstate, int check_current);
Victor Stinner10c8e6a2019-04-26 01:53:18 +020045
46
Victor Stinner331a6a52019-05-27 16:39:22 +020047static PyStatus
Victor Stinner5d39e042017-11-29 17:20:38 +010048_PyRuntimeState_Init_impl(_PyRuntimeState *runtime)
Eric Snow2ebc5ce2017-09-07 23:51:28 -060049{
Steve Dowerb82e17e2019-05-23 08:45:22 -070050 /* We preserve the hook across init, because there is
51 currently no public API to set it between runtime
52 initialization and interpreter initialization. */
53 void *open_code_hook = runtime->open_code_hook;
54 void *open_code_userdata = runtime->open_code_userdata;
55 _Py_AuditHookEntry *audit_hook_head = runtime->audit_hook_head;
56
Eric Snow2ebc5ce2017-09-07 23:51:28 -060057 memset(runtime, 0, sizeof(*runtime));
Victor Stinner8a1be612016-03-14 22:07:55 +010058
Steve Dowerb82e17e2019-05-23 08:45:22 -070059 runtime->open_code_hook = open_code_hook;
60 runtime->open_code_userdata = open_code_userdata;
61 runtime->audit_hook_head = audit_hook_head;
62
Victor Stinnerdab84232020-03-17 18:56:44 +010063 _PyEval_InitRuntimeState(&runtime->ceval);
Victor Stinner441b10c2019-09-28 04:28:35 +020064
Victor Stinner3c30a762019-10-01 10:56:37 +020065 PyPreConfig_InitPythonConfig(&runtime->preconfig);
Michael W. Hudson188d4362005-06-20 16:52:57 +000066
Eric Snow2ebc5ce2017-09-07 23:51:28 -060067 runtime->gilstate.check_enabled = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -080068
Masayuki Yamamoto731e1892017-10-06 19:41:34 +090069 /* A TSS key must be initialized with Py_tss_NEEDS_INIT
70 in accordance with the specification. */
Victor Stinnerf7e5b562017-11-15 15:48:08 -080071 Py_tss_t initial = Py_tss_NEEDS_INIT;
72 runtime->gilstate.autoTSSkey = initial;
Guido van Rossum1d5ad901999-06-18 14:22:24 +000073
Eric Snow2ebc5ce2017-09-07 23:51:28 -060074 runtime->interpreters.mutex = PyThread_allocate_lock();
Victor Stinnerf7e5b562017-11-15 15:48:08 -080075 if (runtime->interpreters.mutex == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +020076 return _PyStatus_ERR("Can't initialize threads for interpreter");
Victor Stinnerf7e5b562017-11-15 15:48:08 -080077 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -060078 runtime->interpreters.next_id = -1;
Eric Snow7f8bfc92018-01-29 18:23:44 -070079
80 runtime->xidregistry.mutex = PyThread_allocate_lock();
81 if (runtime->xidregistry.mutex == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +020082 return _PyStatus_ERR("Can't initialize threads for cross-interpreter data registry");
Eric Snow7f8bfc92018-01-29 18:23:44 -070083 }
84
Eric Snow8479a342019-03-08 23:44:33 -070085 // Set it to the ID of the main thread of the main interpreter.
86 runtime->main_thread = PyThread_get_thread_ident();
Eric Snow5be45a62019-03-08 22:47:07 -070087
Victor Stinner331a6a52019-05-27 16:39:22 +020088 return _PyStatus_OK();
Eric Snow2ebc5ce2017-09-07 23:51:28 -060089}
Eric Snow05351c12017-09-05 21:43:08 -070090
Victor Stinner331a6a52019-05-27 16:39:22 +020091PyStatus
Victor Stinner5d39e042017-11-29 17:20:38 +010092_PyRuntimeState_Init(_PyRuntimeState *runtime)
93{
94 /* Force default allocator, since _PyRuntimeState_Fini() must
95 use the same allocator than this function. */
96 PyMemAllocatorEx old_alloc;
97 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
98
Victor Stinner331a6a52019-05-27 16:39:22 +020099 PyStatus status = _PyRuntimeState_Init_impl(runtime);
Victor Stinner5d39e042017-11-29 17:20:38 +0100100
101 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinner331a6a52019-05-27 16:39:22 +0200102 return status;
Victor Stinner5d39e042017-11-29 17:20:38 +0100103}
104
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600105void
106_PyRuntimeState_Fini(_PyRuntimeState *runtime)
107{
Victor Stinner5d39e042017-11-29 17:20:38 +0100108 /* Force the allocator used by _PyRuntimeState_Init(). */
109 PyMemAllocatorEx old_alloc;
110 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinnerccb04422017-11-16 03:20:31 -0800111
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600112 if (runtime->interpreters.mutex != NULL) {
113 PyThread_free_lock(runtime->interpreters.mutex);
114 runtime->interpreters.mutex = NULL;
115 }
Victor Stinnerccb04422017-11-16 03:20:31 -0800116
Stéphane Wirtel943395f2019-03-19 11:51:32 +0100117 if (runtime->xidregistry.mutex != NULL) {
118 PyThread_free_lock(runtime->xidregistry.mutex);
119 runtime->xidregistry.mutex = NULL;
120 }
121
Victor Stinnerccb04422017-11-16 03:20:31 -0800122 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600123}
124
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900125#ifdef HAVE_FORK
Eric Snow8479a342019-03-08 23:44:33 -0700126/* This function is called from PyOS_AfterFork_Child to ensure that
Victor Stinner26881c82020-06-02 15:51:37 +0200127 newly created child processes do not share locks with the parent. */
128PyStatus
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200129_PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime)
Eric Snow8479a342019-03-08 23:44:33 -0700130{
131 // This was initially set in _PyRuntimeState_Init().
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200132 runtime->main_thread = PyThread_get_thread_ident();
Eric Snow8479a342019-03-08 23:44:33 -0700133
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200134 /* Force default allocator, since _PyRuntimeState_Fini() must
135 use the same allocator than this function. */
136 PyMemAllocatorEx old_alloc;
137 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
138
Victor Stinner26881c82020-06-02 15:51:37 +0200139 int reinit_interp = _PyThread_at_fork_reinit(&runtime->interpreters.mutex);
140 int reinit_main_id = _PyThread_at_fork_reinit(&runtime->interpreters.main->id_mutex);
141 int reinit_xidregistry = _PyThread_at_fork_reinit(&runtime->xidregistry.mutex);
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200142
143 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
144
Victor Stinner26881c82020-06-02 15:51:37 +0200145 if (reinit_interp < 0
146 || reinit_main_id < 0
147 || reinit_xidregistry < 0)
148 {
149 return _PyStatus_ERR("Failed to reinitialize runtime locks");
Eric Snow8479a342019-03-08 23:44:33 -0700150
Eric Snow8479a342019-03-08 23:44:33 -0700151 }
Victor Stinner26881c82020-06-02 15:51:37 +0200152 return _PyStatus_OK();
Eric Snow8479a342019-03-08 23:44:33 -0700153}
Dong-hee Na62f75fe2020-04-15 01:16:24 +0900154#endif
Eric Snow8479a342019-03-08 23:44:33 -0700155
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200156#define HEAD_LOCK(runtime) \
157 PyThread_acquire_lock((runtime)->interpreters.mutex, WAIT_LOCK)
158#define HEAD_UNLOCK(runtime) \
159 PyThread_release_lock((runtime)->interpreters.mutex)
Eric Snow05351c12017-09-05 21:43:08 -0700160
Victor Stinner8bb32302019-04-24 16:47:40 +0200161/* Forward declaration */
162static void _PyGILState_NoteThreadState(
163 struct _gilstate_runtime_state *gilstate, PyThreadState* tstate);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000164
Victor Stinner331a6a52019-05-27 16:39:22 +0200165PyStatus
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600166_PyInterpreterState_Enable(_PyRuntimeState *runtime)
Eric Snowe3774162017-05-22 19:46:40 -0700167{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200168 struct pyinterpreters *interpreters = &runtime->interpreters;
169 interpreters->next_id = 0;
Victor Stinner5d926472018-03-06 14:31:37 +0100170
171 /* Py_Finalize() calls _PyRuntimeState_Fini() which clears the mutex.
172 Create a new mutex if needed. */
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200173 if (interpreters->mutex == NULL) {
Victor Stinner5d926472018-03-06 14:31:37 +0100174 /* Force default allocator, since _PyRuntimeState_Fini() must
175 use the same allocator than this function. */
176 PyMemAllocatorEx old_alloc;
177 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
178
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200179 interpreters->mutex = PyThread_allocate_lock();
Victor Stinner5d926472018-03-06 14:31:37 +0100180
181 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
182
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200183 if (interpreters->mutex == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +0200184 return _PyStatus_ERR("Can't initialize threads for interpreter");
Victor Stinnera7368ac2017-11-15 18:11:45 -0800185 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600186 }
Victor Stinner5d926472018-03-06 14:31:37 +0100187
Victor Stinner331a6a52019-05-27 16:39:22 +0200188 return _PyStatus_OK();
Eric Snowe3774162017-05-22 19:46:40 -0700189}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000190
191PyInterpreterState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000192PyInterpreterState_New(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000193{
Victor Stinner71a35222020-03-26 22:46:14 +0100194 PyThreadState *tstate = _PyThreadState_GET();
195 /* tstate is NULL when Py_InitializeFromConfig() calls
196 PyInterpreterState_New() to create the main interpreter. */
197 if (_PySys_Audit(tstate, "cpython.PyInterpreterState_New", NULL) < 0) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700198 return NULL;
199 }
200
Andy Lester7668a8b2020-03-24 23:26:44 -0500201 PyInterpreterState *interp = PyMem_RawCalloc(1, sizeof(PyInterpreterState));
Victor Stinnerd4341102017-11-23 00:12:09 +0100202 if (interp == NULL) {
203 return NULL;
204 }
205
Eric Snow4c6955e2018-02-16 18:53:40 -0700206 interp->id_refcount = -1;
Victor Stinner022be022019-05-22 23:58:50 +0200207
Victor Stinner71a35222020-03-26 22:46:14 +0100208 /* Don't get runtime from tstate since tstate can be NULL */
Victor Stinner01b1cc12019-11-20 02:27:56 +0100209 _PyRuntimeState *runtime = &_PyRuntime;
210 interp->runtime = runtime;
211
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200212 if (_PyEval_InitState(&interp->ceval) < 0) {
213 goto out_of_memory;
214 }
215
Victor Stinner72474072019-11-20 12:25:50 +0100216 _PyGC_InitState(&interp->gc);
Victor Stinner8462a492019-10-01 12:06:16 +0200217 PyConfig_InitPythonConfig(&interp->config);
Victor Stinner022be022019-05-22 23:58:50 +0200218
Victor Stinnerd4341102017-11-23 00:12:09 +0100219 interp->eval_frame = _PyEval_EvalFrameDefault;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000220#ifdef HAVE_DLOPEN
Serhiy Storchakac2f7d872016-05-04 09:44:44 +0300221#if HAVE_DECL_RTLD_NOW
Victor Stinnerd4341102017-11-23 00:12:09 +0100222 interp->dlopenflags = RTLD_NOW;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000223#else
Victor Stinnerd4341102017-11-23 00:12:09 +0100224 interp->dlopenflags = RTLD_LAZY;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000225#endif
226#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000227
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200228 struct pyinterpreters *interpreters = &runtime->interpreters;
229
230 HEAD_LOCK(runtime);
231 if (interpreters->next_id < 0) {
Victor Stinnerd4341102017-11-23 00:12:09 +0100232 /* overflow or Py_Initialize() not called! */
Victor Stinner71a35222020-03-26 22:46:14 +0100233 if (tstate != NULL) {
234 _PyErr_SetString(tstate, PyExc_RuntimeError,
235 "failed to get an interpreter ID");
236 }
Pablo Galindo95d630e2018-08-31 22:49:29 +0100237 PyMem_RawFree(interp);
Victor Stinnerd4341102017-11-23 00:12:09 +0100238 interp = NULL;
Victor Stinnerd4341102017-11-23 00:12:09 +0100239 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200240 else {
241 interp->id = interpreters->next_id;
242 interpreters->next_id += 1;
243 interp->next = interpreters->head;
244 if (interpreters->main == NULL) {
245 interpreters->main = interp;
246 }
247 interpreters->head = interp;
248 }
249 HEAD_UNLOCK(runtime);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000250
Pablo Galindo95d630e2018-08-31 22:49:29 +0100251 if (interp == NULL) {
252 return NULL;
253 }
254
Yury Selivanovf23746a2018-01-22 19:11:18 -0500255 interp->tstate_next_unique_id = 0;
256
Steve Dowerb82e17e2019-05-23 08:45:22 -0700257 interp->audit_hooks = NULL;
258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 return interp;
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200260
261out_of_memory:
262 if (tstate != NULL) {
263 _PyErr_NoMemory(tstate);
264 }
265
266 PyMem_RawFree(interp);
267 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000268}
269
270
Victor Stinnereba5bf22020-10-30 22:51:02 +0100271static void
272interpreter_clear(PyInterpreterState *interp, PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000273{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100274 _PyRuntimeState *runtime = interp->runtime;
275
Victor Stinner71a35222020-03-26 22:46:14 +0100276 if (_PySys_Audit(tstate, "cpython.PyInterpreterState_Clear", NULL) < 0) {
277 _PyErr_Clear(tstate);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700278 }
279
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200280 HEAD_LOCK(runtime);
281 for (PyThreadState *p = interp->tstate_head; p != NULL; p = p->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000282 PyThreadState_Clear(p);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200283 }
284 HEAD_UNLOCK(runtime);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700285
286 Py_CLEAR(interp->audit_hooks);
287
Victor Stinner331a6a52019-05-27 16:39:22 +0200288 PyConfig_Clear(&interp->config);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289 Py_CLEAR(interp->codec_search_path);
290 Py_CLEAR(interp->codec_search_cache);
291 Py_CLEAR(interp->codec_error_registry);
Eric Snow93c92f72017-09-13 23:46:04 -0700292 Py_CLEAR(interp->modules);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000293 Py_CLEAR(interp->modules_by_index);
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200294 Py_CLEAR(interp->builtins_copy);
Brett Cannonfd074152012-04-14 14:10:13 -0400295 Py_CLEAR(interp->importlib);
Serhiy Storchaka133138a2016-08-02 22:51:21 +0300296 Py_CLEAR(interp->import_func);
Eric Snowd2fdd1f2019-03-15 17:47:43 -0600297 Py_CLEAR(interp->dict);
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200298#ifdef HAVE_FORK
299 Py_CLEAR(interp->before_forkers);
300 Py_CLEAR(interp->after_forkers_parent);
301 Py_CLEAR(interp->after_forkers_child);
302#endif
Victor Stinner7b3c2522020-03-07 00:24:23 +0100303 if (_PyRuntimeState_GetFinalizing(runtime) == NULL) {
Eric Snow86ea5812019-05-10 13:29:55 -0400304 _PyWarnings_Fini(interp);
305 }
Victor Stinnereba5bf22020-10-30 22:51:02 +0100306
307 /* Last garbage collection on this interpreter */
308 _PyGC_CollectNoFail(tstate);
309
310 _PyGC_Fini(tstate);
311
Hai Shi8ecc0c42020-08-13 05:23:30 +0800312 /* We don't clear sysdict and builtins until the end of this function.
313 Because clearing other attributes can execute arbitrary Python code
314 which requires sysdict and builtins. */
315 PyDict_Clear(interp->sysdict);
316 PyDict_Clear(interp->builtins);
317 Py_CLEAR(interp->sysdict);
318 Py_CLEAR(interp->builtins);
319
Eric Snow5be45a62019-03-08 22:47:07 -0700320 // XXX Once we have one allocator per interpreter (i.e.
321 // per-interpreter GC) we must ensure that all of the interpreter's
322 // objects have been cleaned up at the point.
Guido van Rossum25ce5661997-08-02 03:10:38 +0000323}
324
325
Victor Stinnereba5bf22020-10-30 22:51:02 +0100326void
327PyInterpreterState_Clear(PyInterpreterState *interp)
328{
329 // Use the current Python thread state to call audit hooks and to collect
330 // garbage. It can be different than the current Python thread state
331 // of 'interp'.
332 PyThreadState *current_tstate = _PyThreadState_GET();
333
334 interpreter_clear(interp, current_tstate);
335}
336
337
338void
339_PyInterpreterState_Clear(PyThreadState *tstate)
340{
341 interpreter_clear(tstate->interp, tstate);
342}
343
344
Guido van Rossum25ce5661997-08-02 03:10:38 +0000345static void
Victor Stinner9da74302019-11-20 11:17:17 +0100346zapthreads(PyInterpreterState *interp, int check_current)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000347{
Victor Stinner9da74302019-11-20 11:17:17 +0100348 PyThreadState *tstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 /* No need to lock the mutex here because this should only happen
350 when the threads are all really dead (XXX famous last words). */
Victor Stinner9da74302019-11-20 11:17:17 +0100351 while ((tstate = interp->tstate_head) != NULL) {
352 _PyThreadState_Delete(tstate, check_current);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000354}
355
356
Victor Stinner01b1cc12019-11-20 02:27:56 +0100357void
358PyInterpreterState_Delete(PyInterpreterState *interp)
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200359{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100360 _PyRuntimeState *runtime = interp->runtime;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200361 struct pyinterpreters *interpreters = &runtime->interpreters;
Victor Stinner9da74302019-11-20 11:17:17 +0100362 zapthreads(interp, 0);
363
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200364 _PyEval_FiniState(&interp->ceval);
365
Victor Stinner9da74302019-11-20 11:17:17 +0100366 /* Delete current thread. After this, many C API calls become crashy. */
367 _PyThreadState_Swap(&runtime->gilstate, NULL);
368
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200369 HEAD_LOCK(runtime);
370 PyInterpreterState **p;
371 for (p = &interpreters->head; ; p = &(*p)->next) {
372 if (*p == NULL) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100373 Py_FatalError("NULL interpreter");
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200374 }
375 if (*p == interp) {
376 break;
377 }
378 }
379 if (interp->tstate_head != NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100380 Py_FatalError("remaining threads");
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200381 }
382 *p = interp->next;
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200383
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200384 if (interpreters->main == interp) {
385 interpreters->main = NULL;
386 if (interpreters->head != NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100387 Py_FatalError("remaining subinterpreters");
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200388 }
389 }
390 HEAD_UNLOCK(runtime);
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200391
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200392 if (interp->id_mutex != NULL) {
393 PyThread_free_lock(interp->id_mutex);
394 }
395 PyMem_RawFree(interp);
396}
397
398
Victor Stinner26881c82020-06-02 15:51:37 +0200399#ifdef HAVE_FORK
Eric Snow59032962018-09-14 14:17:20 -0700400/*
401 * Delete all interpreter states except the main interpreter. If there
402 * is a current interpreter state, it *must* be the main interpreter.
403 */
Victor Stinner26881c82020-06-02 15:51:37 +0200404PyStatus
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200405_PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime)
Eric Snow59032962018-09-14 14:17:20 -0700406{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200407 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200408 struct pyinterpreters *interpreters = &runtime->interpreters;
409
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200410 PyThreadState *tstate = _PyThreadState_Swap(gilstate, NULL);
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200411 if (tstate != NULL && tstate->interp != interpreters->main) {
Victor Stinner26881c82020-06-02 15:51:37 +0200412 return _PyStatus_ERR("not main interpreter");
Eric Snow59032962018-09-14 14:17:20 -0700413 }
414
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200415 HEAD_LOCK(runtime);
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200416 PyInterpreterState *interp = interpreters->head;
417 interpreters->head = NULL;
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100418 while (interp != NULL) {
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200419 if (interp == interpreters->main) {
420 interpreters->main->next = NULL;
421 interpreters->head = interp;
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100422 interp = interp->next;
Eric Snow59032962018-09-14 14:17:20 -0700423 continue;
424 }
425
Victor Stinner01b1cc12019-11-20 02:27:56 +0100426 PyInterpreterState_Clear(interp); // XXX must activate?
Victor Stinner9da74302019-11-20 11:17:17 +0100427 zapthreads(interp, 1);
Eric Snow59032962018-09-14 14:17:20 -0700428 if (interp->id_mutex != NULL) {
429 PyThread_free_lock(interp->id_mutex);
430 }
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100431 PyInterpreterState *prev_interp = interp;
432 interp = interp->next;
433 PyMem_RawFree(prev_interp);
Eric Snow59032962018-09-14 14:17:20 -0700434 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200435 HEAD_UNLOCK(runtime);
Eric Snow59032962018-09-14 14:17:20 -0700436
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200437 if (interpreters->head == NULL) {
Victor Stinner26881c82020-06-02 15:51:37 +0200438 return _PyStatus_ERR("missing main interpreter");
Eric Snow59032962018-09-14 14:17:20 -0700439 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200440 _PyThreadState_Swap(gilstate, tstate);
Victor Stinner26881c82020-06-02 15:51:37 +0200441 return _PyStatus_OK();
Eric Snow59032962018-09-14 14:17:20 -0700442}
Victor Stinner26881c82020-06-02 15:51:37 +0200443#endif
Eric Snow59032962018-09-14 14:17:20 -0700444
445
Victor Stinnercaba55b2018-08-03 15:33:52 +0200446PyInterpreterState *
Victor Stinnerbe793732020-03-13 18:15:33 +0100447PyInterpreterState_Get(void)
Victor Stinnercaba55b2018-08-03 15:33:52 +0200448{
Victor Stinner50b48572018-11-01 01:51:40 +0100449 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner3026cad2020-06-01 16:02:40 +0200450 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnercaba55b2018-08-03 15:33:52 +0200451 PyInterpreterState *interp = tstate->interp;
452 if (interp == NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100453 Py_FatalError("no current interpreter");
Victor Stinnercaba55b2018-08-03 15:33:52 +0200454 }
455 return interp;
456}
457
458
Eric Snowe3774162017-05-22 19:46:40 -0700459int64_t
460PyInterpreterState_GetID(PyInterpreterState *interp)
461{
462 if (interp == NULL) {
463 PyErr_SetString(PyExc_RuntimeError, "no interpreter provided");
464 return -1;
465 }
466 return interp->id;
467}
468
469
Eric Snow5be45a62019-03-08 22:47:07 -0700470static PyInterpreterState *
Victor Stinner1a1bd2e2020-04-17 19:13:06 +0200471interp_look_up_id(_PyRuntimeState *runtime, int64_t requested_id)
Eric Snowb05b7112019-03-01 12:35:10 -0700472{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200473 PyInterpreterState *interp = runtime->interpreters.head;
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100474 while (interp != NULL) {
Victor Stinner1a1bd2e2020-04-17 19:13:06 +0200475 int64_t id = PyInterpreterState_GetID(interp);
Eric Snow5be45a62019-03-08 22:47:07 -0700476 if (id < 0) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100477 return NULL;
Eric Snow5be45a62019-03-08 22:47:07 -0700478 }
479 if (requested_id == id) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100480 return interp;
Eric Snow5be45a62019-03-08 22:47:07 -0700481 }
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100482 interp = PyInterpreterState_Next(interp);
Eric Snowb05b7112019-03-01 12:35:10 -0700483 }
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100484 return NULL;
Eric Snowb05b7112019-03-01 12:35:10 -0700485}
486
Eric Snow5be45a62019-03-08 22:47:07 -0700487PyInterpreterState *
Victor Stinner1a1bd2e2020-04-17 19:13:06 +0200488_PyInterpreterState_LookUpID(int64_t requested_id)
Eric Snow5be45a62019-03-08 22:47:07 -0700489{
490 PyInterpreterState *interp = NULL;
491 if (requested_id >= 0) {
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200492 _PyRuntimeState *runtime = &_PyRuntime;
493 HEAD_LOCK(runtime);
494 interp = interp_look_up_id(runtime, requested_id);
495 HEAD_UNLOCK(runtime);
Eric Snow5be45a62019-03-08 22:47:07 -0700496 }
497 if (interp == NULL && !PyErr_Occurred()) {
498 PyErr_Format(PyExc_RuntimeError,
499 "unrecognized interpreter ID %lld", requested_id);
500 }
501 return interp;
502}
503
Eric Snow4c6955e2018-02-16 18:53:40 -0700504
505int
506_PyInterpreterState_IDInitref(PyInterpreterState *interp)
507{
508 if (interp->id_mutex != NULL) {
509 return 0;
510 }
511 interp->id_mutex = PyThread_allocate_lock();
512 if (interp->id_mutex == NULL) {
513 PyErr_SetString(PyExc_RuntimeError,
514 "failed to create init interpreter ID mutex");
515 return -1;
516 }
517 interp->id_refcount = 0;
518 return 0;
519}
520
521
522void
523_PyInterpreterState_IDIncref(PyInterpreterState *interp)
524{
525 if (interp->id_mutex == NULL) {
526 return;
527 }
528 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
529 interp->id_refcount += 1;
530 PyThread_release_lock(interp->id_mutex);
531}
532
533
534void
535_PyInterpreterState_IDDecref(PyInterpreterState *interp)
536{
537 if (interp->id_mutex == NULL) {
538 return;
539 }
Victor Stinner0fd2c302019-06-04 03:15:09 +0200540 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
Eric Snow4c6955e2018-02-16 18:53:40 -0700541 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
542 assert(interp->id_refcount != 0);
543 interp->id_refcount -= 1;
544 int64_t refcount = interp->id_refcount;
545 PyThread_release_lock(interp->id_mutex);
546
Eric Snowc11183c2019-03-15 16:35:46 -0600547 if (refcount == 0 && interp->requires_idref) {
Eric Snowf53d9f22018-02-20 16:30:17 -0700548 // XXX Using the "head" thread isn't strictly correct.
549 PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
550 // XXX Possible GILState issues?
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200551 PyThreadState *save_tstate = _PyThreadState_Swap(gilstate, tstate);
Eric Snow4c6955e2018-02-16 18:53:40 -0700552 Py_EndInterpreter(tstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200553 _PyThreadState_Swap(gilstate, save_tstate);
Eric Snow4c6955e2018-02-16 18:53:40 -0700554 }
555}
556
Eric Snowc11183c2019-03-15 16:35:46 -0600557int
558_PyInterpreterState_RequiresIDRef(PyInterpreterState *interp)
559{
560 return interp->requires_idref;
561}
562
563void
564_PyInterpreterState_RequireIDRef(PyInterpreterState *interp, int required)
565{
566 interp->requires_idref = required ? 1 : 0;
567}
568
Eric Snowc11183c2019-03-15 16:35:46 -0600569PyObject *
570_PyInterpreterState_GetMainModule(PyInterpreterState *interp)
571{
572 if (interp->modules == NULL) {
573 PyErr_SetString(PyExc_RuntimeError, "interpreter not initialized");
574 return NULL;
575 }
576 return PyMapping_GetItemString(interp->modules, "__main__");
577}
578
Eric Snowd2fdd1f2019-03-15 17:47:43 -0600579PyObject *
580PyInterpreterState_GetDict(PyInterpreterState *interp)
581{
582 if (interp->dict == NULL) {
583 interp->dict = PyDict_New();
584 if (interp->dict == NULL) {
585 PyErr_Clear();
586 }
587 }
588 /* Returning NULL means no per-interpreter dict is available. */
589 return interp->dict;
590}
591
Victor Stinner45b9be52010-03-03 23:28:07 +0000592static PyThreadState *
593new_threadstate(PyInterpreterState *interp, int init)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000594{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100595 _PyRuntimeState *runtime = interp->runtime;
Victor Stinner1a7425f2013-07-07 16:25:15 +0200596 PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState));
Victor Stinner8bb32302019-04-24 16:47:40 +0200597 if (tstate == NULL) {
598 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000600
Victor Stinner8bb32302019-04-24 16:47:40 +0200601 tstate->interp = interp;
602
603 tstate->frame = NULL;
604 tstate->recursion_depth = 0;
605 tstate->overflowed = 0;
Victor Stinner8bb32302019-04-24 16:47:40 +0200606 tstate->stackcheck_counter = 0;
607 tstate->tracing = 0;
608 tstate->use_tracing = 0;
609 tstate->gilstate_counter = 0;
610 tstate->async_exc = NULL;
611 tstate->thread_id = PyThread_get_thread_ident();
612
613 tstate->dict = NULL;
614
615 tstate->curexc_type = NULL;
616 tstate->curexc_value = NULL;
617 tstate->curexc_traceback = NULL;
618
619 tstate->exc_state.exc_type = NULL;
620 tstate->exc_state.exc_value = NULL;
621 tstate->exc_state.exc_traceback = NULL;
622 tstate->exc_state.previous_item = NULL;
623 tstate->exc_info = &tstate->exc_state;
624
625 tstate->c_profilefunc = NULL;
626 tstate->c_tracefunc = NULL;
627 tstate->c_profileobj = NULL;
628 tstate->c_traceobj = NULL;
629
630 tstate->trash_delete_nesting = 0;
631 tstate->trash_delete_later = NULL;
632 tstate->on_delete = NULL;
633 tstate->on_delete_data = NULL;
634
635 tstate->coroutine_origin_tracking_depth = 0;
636
Victor Stinner8bb32302019-04-24 16:47:40 +0200637 tstate->async_gen_firstiter = NULL;
638 tstate->async_gen_finalizer = NULL;
639
640 tstate->context = NULL;
641 tstate->context_ver = 1;
642
Victor Stinner8bb32302019-04-24 16:47:40 +0200643 if (init) {
Victor Stinner01b1cc12019-11-20 02:27:56 +0100644 _PyThreadState_Init(tstate);
Victor Stinner8bb32302019-04-24 16:47:40 +0200645 }
646
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200647 HEAD_LOCK(runtime);
Stefan Krahb3b9ade2020-03-02 21:22:36 +0100648 tstate->id = ++interp->tstate_next_unique_id;
Victor Stinner8bb32302019-04-24 16:47:40 +0200649 tstate->prev = NULL;
650 tstate->next = interp->tstate_head;
651 if (tstate->next)
652 tstate->next->prev = tstate;
653 interp->tstate_head = tstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200654 HEAD_UNLOCK(runtime);
Victor Stinner8bb32302019-04-24 16:47:40 +0200655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000657}
658
Victor Stinner45b9be52010-03-03 23:28:07 +0000659PyThreadState *
660PyThreadState_New(PyInterpreterState *interp)
661{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 return new_threadstate(interp, 1);
Victor Stinner45b9be52010-03-03 23:28:07 +0000663}
664
665PyThreadState *
666_PyThreadState_Prealloc(PyInterpreterState *interp)
667{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 return new_threadstate(interp, 0);
Victor Stinner45b9be52010-03-03 23:28:07 +0000669}
670
671void
Victor Stinner01b1cc12019-11-20 02:27:56 +0100672_PyThreadState_Init(PyThreadState *tstate)
Victor Stinner45b9be52010-03-03 23:28:07 +0000673{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100674 _PyGILState_NoteThreadState(&tstate->interp->runtime->gilstate, tstate);
Victor Stinner45b9be52010-03-03 23:28:07 +0000675}
676
Martin v. Löwis1a214512008-06-11 05:26:20 +0000677PyObject*
Martin v. Löwis7800f752012-06-22 12:20:55 +0200678PyState_FindModule(struct PyModuleDef* module)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000679{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200680 Py_ssize_t index = module->m_base.m_index;
Victor Stinner81a7be32020-04-14 15:14:01 +0200681 PyInterpreterState *state = _PyInterpreterState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 PyObject *res;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000683 if (module->m_slots) {
684 return NULL;
685 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 if (index == 0)
687 return NULL;
688 if (state->modules_by_index == NULL)
689 return NULL;
Antoine Pitrou75506e82012-08-20 19:30:46 +0200690 if (index >= PyList_GET_SIZE(state->modules_by_index))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 return NULL;
692 res = PyList_GET_ITEM(state->modules_by_index, index);
693 return res==Py_None ? NULL : res;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000694}
695
696int
Victor Stinner82c83bd2019-11-22 18:52:27 +0100697_PyState_AddModule(PyThreadState *tstate, PyObject* module, struct PyModuleDef* def)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000698{
Berker Peksag4b7b5652016-08-22 18:05:56 +0300699 if (!def) {
Victor Stinner71a35222020-03-26 22:46:14 +0100700 assert(_PyErr_Occurred(tstate));
Berker Peksag4b7b5652016-08-22 18:05:56 +0300701 return -1;
702 }
Nick Coghland5cacbb2015-05-23 22:24:10 +1000703 if (def->m_slots) {
Victor Stinner71a35222020-03-26 22:46:14 +0100704 _PyErr_SetString(tstate,
705 PyExc_SystemError,
706 "PyState_AddModule called on module with slots");
Nick Coghland5cacbb2015-05-23 22:24:10 +1000707 return -1;
708 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100709
710 PyInterpreterState *interp = tstate->interp;
711 if (!interp->modules_by_index) {
712 interp->modules_by_index = PyList_New(0);
713 if (!interp->modules_by_index) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 return -1;
Victor Stinner82c83bd2019-11-22 18:52:27 +0100715 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100717
718 while (PyList_GET_SIZE(interp->modules_by_index) <= def->m_base.m_index) {
719 if (PyList_Append(interp->modules_by_index, Py_None) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 return -1;
Victor Stinner82c83bd2019-11-22 18:52:27 +0100721 }
722 }
723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000724 Py_INCREF(module);
Victor Stinner82c83bd2019-11-22 18:52:27 +0100725 return PyList_SetItem(interp->modules_by_index,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000727}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000728
Martin v. Löwis7800f752012-06-22 12:20:55 +0200729int
730PyState_AddModule(PyObject* module, struct PyModuleDef* def)
731{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200732 if (!def) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100733 Py_FatalError("module definition is NULL");
Martin v. Löwis7800f752012-06-22 12:20:55 +0200734 return -1;
735 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100736
737 PyThreadState *tstate = _PyThreadState_GET();
738 PyInterpreterState *interp = tstate->interp;
739 Py_ssize_t index = def->m_base.m_index;
740 if (interp->modules_by_index &&
741 index < PyList_GET_SIZE(interp->modules_by_index) &&
742 module == PyList_GET_ITEM(interp->modules_by_index, index))
743 {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100744 _Py_FatalErrorFormat(__func__, "module %p already added", module);
Benjamin Peterson39de95b2019-09-12 00:43:22 +0100745 return -1;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200746 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100747 return _PyState_AddModule(tstate, module, def);
Martin v. Löwis7800f752012-06-22 12:20:55 +0200748}
749
750int
751PyState_RemoveModule(struct PyModuleDef* def)
752{
Victor Stinner71a35222020-03-26 22:46:14 +0100753 PyThreadState *tstate = _PyThreadState_GET();
754 PyInterpreterState *interp = tstate->interp;
755
Nick Coghland5cacbb2015-05-23 22:24:10 +1000756 if (def->m_slots) {
Victor Stinner71a35222020-03-26 22:46:14 +0100757 _PyErr_SetString(tstate,
758 PyExc_SystemError,
759 "PyState_RemoveModule called on module with slots");
Nick Coghland5cacbb2015-05-23 22:24:10 +1000760 return -1;
761 }
Victor Stinner71a35222020-03-26 22:46:14 +0100762
763 Py_ssize_t index = def->m_base.m_index;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200764 if (index == 0) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100765 Py_FatalError("invalid module index");
Martin v. Löwis7800f752012-06-22 12:20:55 +0200766 }
Victor Stinner71a35222020-03-26 22:46:14 +0100767 if (interp->modules_by_index == NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100768 Py_FatalError("Interpreters module-list not accessible.");
Martin v. Löwis7800f752012-06-22 12:20:55 +0200769 }
Victor Stinner71a35222020-03-26 22:46:14 +0100770 if (index > PyList_GET_SIZE(interp->modules_by_index)) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100771 Py_FatalError("Module index out of bounds.");
Martin v. Löwis7800f752012-06-22 12:20:55 +0200772 }
Victor Stinner71a35222020-03-26 22:46:14 +0100773
Zackery Spytz2a893432018-12-05 00:14:00 -0700774 Py_INCREF(Py_None);
Victor Stinner71a35222020-03-26 22:46:14 +0100775 return PyList_SetItem(interp->modules_by_index, index, Py_None);
Martin v. Löwis7800f752012-06-22 12:20:55 +0200776}
777
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200778/* Used by PyImport_Cleanup() */
Antoine Pitrou40322e62013-08-11 00:30:09 +0200779void
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200780_PyInterpreterState_ClearModules(PyInterpreterState *interp)
Antoine Pitrou40322e62013-08-11 00:30:09 +0200781{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200782 if (!interp->modules_by_index) {
783 return;
784 }
785
786 Py_ssize_t i;
787 for (i = 0; i < PyList_GET_SIZE(interp->modules_by_index); i++) {
788 PyObject *m = PyList_GET_ITEM(interp->modules_by_index, i);
789 if (PyModule_Check(m)) {
790 /* cleanup the saved copy of module dicts */
791 PyModuleDef *md = PyModule_GetDef(m);
792 if (md) {
793 Py_CLEAR(md->m_base.m_copy);
Antoine Pitrou40322e62013-08-11 00:30:09 +0200794 }
795 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200796 }
797
798 /* Setting modules_by_index to NULL could be dangerous, so we
799 clear the list instead. */
800 if (PyList_SetSlice(interp->modules_by_index,
801 0, PyList_GET_SIZE(interp->modules_by_index),
802 NULL)) {
803 PyErr_WriteUnraisable(interp->modules_by_index);
Antoine Pitrou40322e62013-08-11 00:30:09 +0200804 }
805}
806
Guido van Rossuma027efa1997-05-05 20:56:21 +0000807void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000808PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000809{
Victor Stinnerda7933e2020-04-13 03:04:28 +0200810 int verbose = _PyInterpreterState_GetConfig(tstate->interp)->verbose;
Victor Stinner53b7d4e2018-07-25 01:37:05 +0200811
Victor Stinner5804f872020-03-24 16:32:26 +0100812 if (verbose && tstate->frame != NULL) {
813 /* bpo-20526: After the main thread calls
814 _PyRuntimeState_SetFinalizing() in Py_FinalizeEx(), threads must
815 exit when trying to take the GIL. If a thread exit in the middle of
816 _PyEval_EvalFrameDefault(), tstate->frame is not reset to its
817 previous value. It is more likely with daemon threads, but it can
818 happen with regular threads if threading._shutdown() fails
819 (ex: interrupted by CTRL+C). */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 fprintf(stderr,
821 "PyThreadState_Clear: warning: thread still has a frame\n");
Victor Stinner5804f872020-03-24 16:32:26 +0100822 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000823
Victor Stinner5804f872020-03-24 16:32:26 +0100824 /* Don't clear tstate->frame: it is a borrowed reference */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 Py_CLEAR(tstate->dict);
827 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 Py_CLEAR(tstate->curexc_type);
830 Py_CLEAR(tstate->curexc_value);
831 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000832
Mark Shannonae3087c2017-10-22 22:41:51 +0100833 Py_CLEAR(tstate->exc_state.exc_type);
834 Py_CLEAR(tstate->exc_state.exc_value);
835 Py_CLEAR(tstate->exc_state.exc_traceback);
Serhiy Storchakabdf42982017-10-26 16:59:40 +0300836
Mark Shannonae3087c2017-10-22 22:41:51 +0100837 /* The stack of exception states should contain just this thread. */
Victor Stinner53b7d4e2018-07-25 01:37:05 +0200838 if (verbose && tstate->exc_info != &tstate->exc_state) {
Mark Shannonae3087c2017-10-22 22:41:51 +0100839 fprintf(stderr,
840 "PyThreadState_Clear: warning: thread still has a generator\n");
841 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 tstate->c_profilefunc = NULL;
844 tstate->c_tracefunc = NULL;
845 Py_CLEAR(tstate->c_profileobj);
846 Py_CLEAR(tstate->c_traceobj);
Yury Selivanov75445082015-05-11 22:57:16 -0400847
Yury Selivanoveb636452016-09-08 22:01:51 -0700848 Py_CLEAR(tstate->async_gen_firstiter);
849 Py_CLEAR(tstate->async_gen_finalizer);
Yury Selivanovf23746a2018-01-22 19:11:18 -0500850
851 Py_CLEAR(tstate->context);
Victor Stinner4d96b462020-02-01 02:30:25 +0100852
853 if (tstate->on_delete != NULL) {
854 tstate->on_delete(tstate->on_delete_data);
855 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000856}
857
858
Joannah Nanjekye8855e472019-10-04 08:35:42 -0300859/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
Guido van Rossum29757862001-01-23 01:46:06 +0000860static void
Victor Stinner9da74302019-11-20 11:17:17 +0100861tstate_delete_common(PyThreadState *tstate,
862 struct _gilstate_runtime_state *gilstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000863{
Victor Stinner3026cad2020-06-01 16:02:40 +0200864 _Py_EnsureTstateNotNULL(tstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200865 PyInterpreterState *interp = tstate->interp;
866 if (interp == NULL) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100867 Py_FatalError("NULL interpreter");
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200868 }
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100869 _PyRuntimeState *runtime = interp->runtime;
870
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200871 HEAD_LOCK(runtime);
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100872 if (tstate->prev) {
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200873 tstate->prev->next = tstate->next;
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100874 }
875 else {
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200876 interp->tstate_head = tstate->next;
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100877 }
878 if (tstate->next) {
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200879 tstate->next->prev = tstate->prev;
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100880 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200881 HEAD_UNLOCK(runtime);
Victor Stinner4d96b462020-02-01 02:30:25 +0100882
Victor Stinner9da74302019-11-20 11:17:17 +0100883 if (gilstate->autoInterpreterState &&
884 PyThread_tss_get(&gilstate->autoTSSkey) == tstate)
885 {
886 PyThread_tss_set(&gilstate->autoTSSkey, NULL);
887 }
888}
889
890
891static void
892_PyThreadState_Delete(PyThreadState *tstate, int check_current)
893{
894 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
895 if (check_current) {
896 if (tstate == _PyRuntimeGILState_GetThreadState(gilstate)) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100897 _Py_FatalErrorFormat(__func__, "tstate %p is still current", tstate);
Victor Stinner9da74302019-11-20 11:17:17 +0100898 }
899 }
900 tstate_delete_common(tstate, gilstate);
Victor Stinner23ef89d2020-03-18 02:26:04 +0100901 PyMem_RawFree(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000902}
903
904
Victor Stinner01b1cc12019-11-20 02:27:56 +0100905void
906PyThreadState_Delete(PyThreadState *tstate)
Guido van Rossum29757862001-01-23 01:46:06 +0000907{
Victor Stinner9da74302019-11-20 11:17:17 +0100908 _PyThreadState_Delete(tstate, 1);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200909}
910
911
Joannah Nanjekye2bc43cd2019-09-05 13:06:49 -0300912void
Victor Stinner23ef89d2020-03-18 02:26:04 +0100913_PyThreadState_DeleteCurrent(PyThreadState *tstate)
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200914{
Victor Stinner3026cad2020-06-01 16:02:40 +0200915 _Py_EnsureTstateNotNULL(tstate);
Victor Stinner23ef89d2020-03-18 02:26:04 +0100916 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
Victor Stinner9da74302019-11-20 11:17:17 +0100917 tstate_delete_common(tstate, gilstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200918 _PyRuntimeGILState_SetThreadState(gilstate, NULL);
Victor Stinner23ef89d2020-03-18 02:26:04 +0100919 _PyEval_ReleaseLock(tstate);
920 PyMem_RawFree(tstate);
Guido van Rossum29757862001-01-23 01:46:06 +0000921}
Guido van Rossum29757862001-01-23 01:46:06 +0000922
Joannah Nanjekye8855e472019-10-04 08:35:42 -0300923void
924PyThreadState_DeleteCurrent(void)
925{
Victor Stinner23ef89d2020-03-18 02:26:04 +0100926 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
927 PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate);
928 _PyThreadState_DeleteCurrent(tstate);
Joannah Nanjekye8855e472019-10-04 08:35:42 -0300929}
930
Guido van Rossum29757862001-01-23 01:46:06 +0000931
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200932/*
933 * Delete all thread states except the one passed as argument.
934 * Note that, if there is a current thread state, it *must* be the one
935 * passed as argument. Also, this won't touch any other interpreters
936 * than the current one, since we don't know which thread state should
Min ho Kim39d87b52019-08-31 06:21:19 +1000937 * be kept in those other interpreters.
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200938 */
939void
Victor Stinner0fd2c302019-06-04 03:15:09 +0200940_PyThreadState_DeleteExcept(_PyRuntimeState *runtime, PyThreadState *tstate)
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200941{
942 PyInterpreterState *interp = tstate->interp;
Victor Stinner9ad58ac2020-03-09 23:37:49 +0100943
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200944 HEAD_LOCK(runtime);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200945 /* Remove all thread states, except tstate, from the linked list of
946 thread states. This will allow calling PyThreadState_Clear()
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200947 without holding the lock. */
Victor Stinner9ad58ac2020-03-09 23:37:49 +0100948 PyThreadState *list = interp->tstate_head;
949 if (list == tstate) {
950 list = tstate->next;
951 }
952 if (tstate->prev) {
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200953 tstate->prev->next = tstate->next;
Victor Stinner9ad58ac2020-03-09 23:37:49 +0100954 }
955 if (tstate->next) {
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200956 tstate->next->prev = tstate->prev;
Victor Stinner9ad58ac2020-03-09 23:37:49 +0100957 }
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200958 tstate->prev = tstate->next = NULL;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200959 interp->tstate_head = tstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200960 HEAD_UNLOCK(runtime);
Victor Stinner9ad58ac2020-03-09 23:37:49 +0100961
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200962 /* Clear and deallocate all stale thread states. Even if this
963 executes Python code, we should be safe since it executes
964 in the current thread, not one of the stale threads. */
Victor Stinner9ad58ac2020-03-09 23:37:49 +0100965 PyThreadState *p, *next;
966 for (p = list; p; p = next) {
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200967 next = p->next;
968 PyThreadState_Clear(p);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200969 PyMem_RawFree(p);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200970 }
971}
972
973
Victor Stinnere838a932020-05-05 19:56:48 +0200974#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
975PyThreadState*
976_PyThreadState_GetTSS(void) {
977 return PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey);
978}
979#endif
980
981
Guido van Rossuma027efa1997-05-05 20:56:21 +0000982PyThreadState *
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100983_PyThreadState_UncheckedGet(void)
984{
Victor Stinner50b48572018-11-01 01:51:40 +0100985 return _PyThreadState_GET();
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100986}
987
988
989PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000990PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000991{
Victor Stinner50b48572018-11-01 01:51:40 +0100992 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner3026cad2020-06-01 16:02:40 +0200993 _Py_EnsureTstateNotNULL(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000995}
996
997
Victor Stinner09532fe2019-05-10 23:39:09 +0200998PyThreadState *
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200999_PyThreadState_Swap(struct _gilstate_runtime_state *gilstate, PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001000{
Victor Stinnere838a932020-05-05 19:56:48 +02001001#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
1002 PyThreadState *oldts = _PyThreadState_GetTSS();
1003#else
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001004 PyThreadState *oldts = _PyRuntimeGILState_GetThreadState(gilstate);
Victor Stinnere838a932020-05-05 19:56:48 +02001005#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +00001006
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001007 _PyRuntimeGILState_SetThreadState(gilstate, newts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 /* It should not be possible for more than one thread state
1009 to be used for a thread. Check this the best we can in debug
1010 builds.
1011 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02001012#if defined(Py_DEBUG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 if (newts) {
1014 /* This can be called from PyEval_RestoreThread(). Similar
1015 to it, we need to ensure errno doesn't change.
1016 */
1017 int err = errno;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001018 PyThreadState *check = _PyGILState_GetThisThreadState(gilstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 if (check && check->interp == newts->interp && check != newts)
1020 Py_FatalError("Invalid thread state for this thread");
1021 errno = err;
1022 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001023#endif
Victor Stinnere838a932020-05-05 19:56:48 +02001024#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
1025 PyThread_tss_set(&gilstate->autoTSSkey, newts);
1026#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001028}
Guido van Rossumede04391998-04-10 20:18:25 +00001029
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001030PyThreadState *
1031PyThreadState_Swap(PyThreadState *newts)
1032{
1033 return _PyThreadState_Swap(&_PyRuntime.gilstate, newts);
1034}
1035
Guido van Rossumede04391998-04-10 20:18:25 +00001036/* An extension mechanism to store arbitrary additional per-thread state.
1037 PyThreadState_GetDict() returns a dictionary that can be used to hold such
1038 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +00001039 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
1040 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +00001041
1042PyObject *
Victor Stinner0e427c62020-03-25 21:22:55 +01001043_PyThreadState_GetDict(PyThreadState *tstate)
1044{
1045 assert(tstate != NULL);
1046 if (tstate->dict == NULL) {
1047 tstate->dict = PyDict_New();
1048 if (tstate->dict == NULL) {
1049 _PyErr_Clear(tstate);
1050 }
1051 }
1052 return tstate->dict;
1053}
1054
1055
1056PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001057PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +00001058{
Victor Stinner50b48572018-11-01 01:51:40 +01001059 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner0e427c62020-03-25 21:22:55 +01001060 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 }
Victor Stinner0e427c62020-03-25 21:22:55 +01001063 return _PyThreadState_GetDict(tstate);
Guido van Rossumede04391998-04-10 20:18:25 +00001064}
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001065
1066
Victor Stinner8fb02b62020-03-13 23:38:08 +01001067PyInterpreterState *
1068PyThreadState_GetInterpreter(PyThreadState *tstate)
1069{
1070 assert(tstate != NULL);
Victor Stinner8fb02b62020-03-13 23:38:08 +01001071 return tstate->interp;
1072}
1073
1074
Victor Stinner4386b902020-04-29 03:01:43 +02001075PyFrameObject*
Victor Stinnerfd1e1a12020-03-20 15:51:45 +01001076PyThreadState_GetFrame(PyThreadState *tstate)
1077{
1078 assert(tstate != NULL);
Victor Stinner4386b902020-04-29 03:01:43 +02001079 PyFrameObject *frame = tstate->frame;
1080 Py_XINCREF(frame);
1081 return frame;
Victor Stinnerfd1e1a12020-03-20 15:51:45 +01001082}
1083
1084
Victor Stinner5c3cda02020-03-25 21:23:53 +01001085uint64_t
1086PyThreadState_GetID(PyThreadState *tstate)
1087{
1088 assert(tstate != NULL);
1089 return tstate->id;
1090}
1091
1092
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001093/* Asynchronously raise an exception in a thread.
1094 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +00001095 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001096 to call this, or use ctypes. Must be called with the GIL held.
1097 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
1098 match any known thread id). Can be called with exc=NULL to clear an
1099 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001100
1101int
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +02001102PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc)
1103{
Victor Stinner09532fe2019-05-10 23:39:09 +02001104 _PyRuntimeState *runtime = &_PyRuntime;
1105 PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 /* Although the GIL is held, a few C API functions can be called
1108 * without the GIL held, and in particular some that create and
1109 * destroy thread and interpreter states. Those can mutate the
1110 * list of thread states we're traversing, so to prevent that we lock
1111 * head_mutex for the duration.
1112 */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001113 HEAD_LOCK(runtime);
Victor Stinner56bfdeb2020-03-18 09:26:25 +01001114 for (PyThreadState *tstate = interp->tstate_head; tstate != NULL; tstate = tstate->next) {
1115 if (tstate->thread_id != id) {
1116 continue;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 }
Victor Stinner56bfdeb2020-03-18 09:26:25 +01001118
1119 /* Tricky: we need to decref the current value
1120 * (if any) in tstate->async_exc, but that can in turn
1121 * allow arbitrary Python code to run, including
1122 * perhaps calls to this function. To prevent
1123 * deadlock, we need to release head_mutex before
1124 * the decref.
1125 */
1126 PyObject *old_exc = tstate->async_exc;
1127 Py_XINCREF(exc);
1128 tstate->async_exc = exc;
1129 HEAD_UNLOCK(runtime);
1130
1131 Py_XDECREF(old_exc);
1132 _PyEval_SignalAsyncExc(tstate);
1133 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001135 HEAD_UNLOCK(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001137}
1138
1139
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001140/* Routines for advanced debuggers, requested by David Beazley.
1141 Don't use unless you know what you are doing! */
1142
1143PyInterpreterState *
1144PyInterpreterState_Head(void)
1145{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001146 return _PyRuntime.interpreters.head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001147}
1148
1149PyInterpreterState *
Eric Snow6b4be192017-05-22 21:36:03 -07001150PyInterpreterState_Main(void)
1151{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001152 return _PyRuntime.interpreters.main;
Eric Snow6b4be192017-05-22 21:36:03 -07001153}
1154
1155PyInterpreterState *
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001156PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001158}
1159
1160PyThreadState *
1161PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001163}
1164
1165PyThreadState *
1166PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001168}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001169
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001170/* The implementation of sys._current_frames(). This is intended to be
1171 called with the GIL held, as it will be when called via
1172 sys._current_frames(). It's possible it would work fine even without
1173 the GIL held, but haven't thought enough about that.
1174*/
1175PyObject *
1176_PyThread_CurrentFrames(void)
1177{
Victor Stinner71a35222020-03-26 22:46:14 +01001178 PyThreadState *tstate = _PyThreadState_GET();
1179 if (_PySys_Audit(tstate, "sys._current_frames", NULL) < 0) {
Steve Dowerb82e17e2019-05-23 08:45:22 -07001180 return NULL;
1181 }
1182
Victor Stinner71a35222020-03-26 22:46:14 +01001183 PyObject *result = PyDict_New();
1184 if (result == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 return NULL;
Victor Stinner71a35222020-03-26 22:46:14 +01001186 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 /* for i in all interpreters:
1189 * for t in all of i's thread states:
1190 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +02001191 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 * need to grab head_mutex for the duration.
1193 */
Victor Stinner71a35222020-03-26 22:46:14 +01001194 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001195 HEAD_LOCK(runtime);
Victor Stinner71a35222020-03-26 22:46:14 +01001196 PyInterpreterState *i;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001197 for (i = runtime->interpreters.head; i != NULL; i = i->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001198 PyThreadState *t;
1199 for (t = i->tstate_head; t != NULL; t = t->next) {
Victor Stinner4386b902020-04-29 03:01:43 +02001200 PyFrameObject *frame = t->frame;
Victor Stinner71a35222020-03-26 22:46:14 +01001201 if (frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 continue;
Victor Stinner71a35222020-03-26 22:46:14 +01001203 }
1204 PyObject *id = PyLong_FromUnsignedLong(t->thread_id);
1205 if (id == NULL) {
1206 goto fail;
1207 }
1208 int stat = PyDict_SetItem(result, id, (PyObject *)frame);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 Py_DECREF(id);
Victor Stinner71a35222020-03-26 22:46:14 +01001210 if (stat < 0) {
1211 goto fail;
1212 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 }
1214 }
Victor Stinner71a35222020-03-26 22:46:14 +01001215 goto done;
1216
1217fail:
1218 Py_CLEAR(result);
1219
1220done:
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001221 HEAD_UNLOCK(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001222 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001223}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001224
Julien Danjou64366fa2020-11-02 15:16:25 +01001225PyObject *
1226_PyThread_CurrentExceptions(void)
1227{
1228 PyThreadState *tstate = _PyThreadState_GET();
1229
1230 _Py_EnsureTstateNotNULL(tstate);
1231
1232 if (_PySys_Audit(tstate, "sys._current_exceptions", NULL) < 0) {
1233 return NULL;
1234 }
1235
1236 PyObject *result = PyDict_New();
1237 if (result == NULL) {
1238 return NULL;
1239 }
1240
1241 /* for i in all interpreters:
1242 * for t in all of i's thread states:
1243 * if t's frame isn't NULL, map t's id to its frame
1244 * Because these lists can mutate even when the GIL is held, we
1245 * need to grab head_mutex for the duration.
1246 */
1247 _PyRuntimeState *runtime = tstate->interp->runtime;
1248 HEAD_LOCK(runtime);
1249 PyInterpreterState *i;
1250 for (i = runtime->interpreters.head; i != NULL; i = i->next) {
1251 PyThreadState *t;
1252 for (t = i->tstate_head; t != NULL; t = t->next) {
1253 _PyErr_StackItem *err_info = _PyErr_GetTopmostException(t);
1254 if (err_info == NULL) {
1255 continue;
1256 }
1257 PyObject *id = PyLong_FromUnsignedLong(t->thread_id);
1258 if (id == NULL) {
1259 goto fail;
1260 }
1261 PyObject *exc_info = PyTuple_Pack(
1262 3,
1263 err_info->exc_type != NULL ? err_info->exc_type : Py_None,
1264 err_info->exc_value != NULL ? err_info->exc_value : Py_None,
1265 err_info->exc_traceback != NULL ? err_info->exc_traceback : Py_None);
1266 if (exc_info == NULL) {
1267 Py_DECREF(id);
1268 goto fail;
1269 }
1270 int stat = PyDict_SetItem(result, id, exc_info);
1271 Py_DECREF(id);
1272 Py_DECREF(exc_info);
1273 if (stat < 0) {
1274 goto fail;
1275 }
1276 }
1277 }
1278 goto done;
1279
1280fail:
1281 Py_CLEAR(result);
1282
1283done:
1284 HEAD_UNLOCK(runtime);
1285 return result;
1286}
1287
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001288/* Python "auto thread state" API. */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001289
1290/* Keep this as a static, as it is not reliable! It can only
1291 ever be compared to the state for the *current* thread.
1292 * If not equal, then it doesn't matter that the actual
1293 value may change immediately after comparison, as it can't
1294 possibly change to the current thread's state.
1295 * If equal, then the current thread holds the lock, so the value can't
1296 change until we yield the lock.
1297*/
1298static int
1299PyThreadState_IsCurrent(PyThreadState *tstate)
1300{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001301 /* Must be the tstate for this thread */
Victor Stinner0fd2c302019-06-04 03:15:09 +02001302 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001303 assert(_PyGILState_GetThisThreadState(gilstate) == tstate);
1304 return tstate == _PyRuntimeGILState_GetThreadState(gilstate);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001305}
1306
Tim Peters4c1f5ec2004-10-09 17:25:05 +00001307/* Internal initialization/finalization functions called by
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001308 Py_Initialize/Py_FinalizeEx
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001309*/
Victor Stinner4e53abb2020-03-10 23:49:16 +01001310PyStatus
Victor Stinner01b1cc12019-11-20 02:27:56 +01001311_PyGILState_Init(PyThreadState *tstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001312{
Victor Stinnerdda5d6e2020-04-08 17:54:59 +02001313 if (!_Py_IsMainInterpreter(tstate)) {
1314 /* Currently, PyGILState is shared by all interpreters. The main
1315 * interpreter is responsible to initialize it. */
1316 return _PyStatus_OK();
1317 }
1318
Victor Stinner8bb32302019-04-24 16:47:40 +02001319 /* must init with valid states */
Victor Stinner0fd2c302019-06-04 03:15:09 +02001320 assert(tstate != NULL);
Victor Stinnerb45d2592019-06-20 00:05:23 +02001321 assert(tstate->interp != NULL);
Victor Stinner8bb32302019-04-24 16:47:40 +02001322
Victor Stinner01b1cc12019-11-20 02:27:56 +01001323 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
Victor Stinner8bb32302019-04-24 16:47:40 +02001324
1325 if (PyThread_tss_create(&gilstate->autoTSSkey) != 0) {
Victor Stinner4e53abb2020-03-10 23:49:16 +01001326 return _PyStatus_NO_MEMORY();
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001327 }
Victor Stinnerb45d2592019-06-20 00:05:23 +02001328 gilstate->autoInterpreterState = tstate->interp;
Victor Stinner8bb32302019-04-24 16:47:40 +02001329 assert(PyThread_tss_get(&gilstate->autoTSSkey) == NULL);
1330 assert(tstate->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +00001331
Victor Stinner8bb32302019-04-24 16:47:40 +02001332 _PyGILState_NoteThreadState(gilstate, tstate);
Victor Stinner4e53abb2020-03-10 23:49:16 +01001333 return _PyStatus_OK();
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001334}
1335
Victor Stinner861d9ab2016-03-16 22:45:24 +01001336PyInterpreterState *
1337_PyGILState_GetInterpreterStateUnsafe(void)
1338{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001339 return _PyRuntime.gilstate.autoInterpreterState;
Victor Stinner861d9ab2016-03-16 22:45:24 +01001340}
1341
Tim Peters19717fa2004-10-09 17:38:29 +00001342void
Victor Stinner7eee5be2019-11-20 10:38:34 +01001343_PyGILState_Fini(PyThreadState *tstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001344{
Victor Stinner7eee5be2019-11-20 10:38:34 +01001345 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
Victor Stinner8e91c242019-04-24 17:24:01 +02001346 PyThread_tss_delete(&gilstate->autoTSSkey);
1347 gilstate->autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001348}
1349
Victor Stinner26881c82020-06-02 15:51:37 +02001350#ifdef HAVE_FORK
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001351/* Reset the TSS key - called by PyOS_AfterFork_Child().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001352 * This should not be necessary, but some - buggy - pthread implementations
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001353 * don't reset TSS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001354 */
Victor Stinner26881c82020-06-02 15:51:37 +02001355PyStatus
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001356_PyGILState_Reinit(_PyRuntimeState *runtime)
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001357{
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001358 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001359 PyThreadState *tstate = _PyGILState_GetThisThreadState(gilstate);
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001360
1361 PyThread_tss_delete(&gilstate->autoTSSkey);
1362 if (PyThread_tss_create(&gilstate->autoTSSkey) != 0) {
Victor Stinner26881c82020-06-02 15:51:37 +02001363 return _PyStatus_NO_MEMORY();
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001364 }
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001365
Charles-François Natalia233df82011-11-22 19:49:51 +01001366 /* If the thread had an associated auto thread state, reassociate it with
1367 * the new key. */
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001368 if (tstate &&
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001369 PyThread_tss_set(&gilstate->autoTSSkey, (void *)tstate) != 0)
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001370 {
Victor Stinner26881c82020-06-02 15:51:37 +02001371 return _PyStatus_ERR("failed to set autoTSSkey");
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001372 }
Victor Stinner26881c82020-06-02 15:51:37 +02001373 return _PyStatus_OK();
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001374}
Victor Stinner26881c82020-06-02 15:51:37 +02001375#endif
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001376
Michael W. Hudson188d4362005-06-20 16:52:57 +00001377/* When a thread state is created for a thread by some mechanism other than
1378 PyGILState_Ensure, it's important that the GILState machinery knows about
1379 it so it doesn't try to create another thread state for the thread (this is
1380 a better fix for SF bug #1010677 than the first one attempted).
1381*/
Thomas Wouters89f507f2006-12-13 04:49:30 +00001382static void
Victor Stinner8bb32302019-04-24 16:47:40 +02001383_PyGILState_NoteThreadState(struct _gilstate_runtime_state *gilstate, PyThreadState* tstate)
Michael W. Hudson188d4362005-06-20 16:52:57 +00001384{
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001385 /* If autoTSSkey isn't initialized, this must be the very first
Antoine Pitrou079ce542010-09-08 12:37:10 +00001386 threadstate created in Py_Initialize(). Don't do anything for now
1387 (we'll be back here when _PyGILState_Init is called). */
Victor Stinner8bb32302019-04-24 16:47:40 +02001388 if (!gilstate->autoInterpreterState) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 return;
Victor Stinner8bb32302019-04-24 16:47:40 +02001390 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001391
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001392 /* Stick the thread state for this thread in thread specific storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +00001393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001394 The only situation where you can legitimately have more than one
1395 thread state for an OS level thread is when there are multiple
Victor Stinner590cebe2013-12-13 11:08:56 +01001396 interpreters.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001397
Victor Stinner590cebe2013-12-13 11:08:56 +01001398 You shouldn't really be using the PyGILState_ APIs anyway (see issues
1399 #10915 and #15751).
Michael W. Hudson188d4362005-06-20 16:52:57 +00001400
Victor Stinner590cebe2013-12-13 11:08:56 +01001401 The first thread state created for that given OS level thread will
1402 "win", which seems reasonable behaviour.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001403 */
Victor Stinner8bb32302019-04-24 16:47:40 +02001404 if (PyThread_tss_get(&gilstate->autoTSSkey) == NULL) {
1405 if ((PyThread_tss_set(&gilstate->autoTSSkey, (void *)tstate)) != 0) {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001406 Py_FatalError("Couldn't create autoTSSkey mapping");
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001407 }
Victor Stinner590cebe2013-12-13 11:08:56 +01001408 }
Michael W. Hudson188d4362005-06-20 16:52:57 +00001409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 /* PyGILState_Release must not try to delete this thread state. */
1411 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +00001412}
1413
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001414/* The public functions */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001415static PyThreadState *
1416_PyGILState_GetThisThreadState(struct _gilstate_runtime_state *gilstate)
1417{
1418 if (gilstate->autoInterpreterState == NULL)
1419 return NULL;
1420 return (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey);
1421}
1422
Tim Peters19717fa2004-10-09 17:38:29 +00001423PyThreadState *
1424PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001425{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001426 return _PyGILState_GetThisThreadState(&_PyRuntime.gilstate);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001427}
1428
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -07001429int
1430PyGILState_Check(void)
1431{
Victor Stinner1c4cbdf2020-04-13 11:45:21 +02001432 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
1433 if (!gilstate->check_enabled) {
Victor Stinner8a1be612016-03-14 22:07:55 +01001434 return 1;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001435 }
Victor Stinner8a1be612016-03-14 22:07:55 +01001436
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001437 if (!PyThread_tss_is_created(&gilstate->autoTSSkey)) {
1438 return 1;
1439 }
Victor Stinner8a1be612016-03-14 22:07:55 +01001440
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001441 PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate);
1442 if (tstate == NULL) {
1443 return 0;
1444 }
1445
1446 return (tstate == _PyGILState_GetThisThreadState(gilstate));
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -07001447}
1448
Tim Peters19717fa2004-10-09 17:38:29 +00001449PyGILState_STATE
1450PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001451{
Victor Stinner175a7042020-03-10 00:37:48 +01001452 _PyRuntimeState *runtime = &_PyRuntime;
1453 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 /* Note that we do not auto-init Python here - apart from
1456 potential races with 2 threads auto-initializing, pep-311
1457 spells out other issues. Embedders are expected to have
Victor Stinner175a7042020-03-10 00:37:48 +01001458 called Py_Initialize(). */
1459
1460 /* Ensure that _PyEval_InitThreads() and _PyGILState_Init() have been
1461 called by Py_Initialize() */
Victor Stinnere838a932020-05-05 19:56:48 +02001462#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinner175a7042020-03-10 00:37:48 +01001463 assert(_PyEval_ThreadsInitialized(runtime));
Victor Stinnere838a932020-05-05 19:56:48 +02001464#endif
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001465 assert(gilstate->autoInterpreterState);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001466
Victor Stinner175a7042020-03-10 00:37:48 +01001467 PyThreadState *tcur = (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey);
1468 int current;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 if (tcur == NULL) {
Victor Stinner175a7042020-03-10 00:37:48 +01001470 /* Create a new Python thread state for this thread */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001471 tcur = PyThreadState_New(gilstate->autoInterpreterState);
Victor Stinner175a7042020-03-10 00:37:48 +01001472 if (tcur == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 Py_FatalError("Couldn't create thread-state for new thread");
Victor Stinner175a7042020-03-10 00:37:48 +01001474 }
1475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001476 /* This is our thread state! We'll need to delete it in the
1477 matching call to PyGILState_Release(). */
1478 tcur->gilstate_counter = 0;
1479 current = 0; /* new thread state is never current */
1480 }
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001481 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 current = PyThreadState_IsCurrent(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001483 }
1484
1485 if (current == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 PyEval_RestoreThread(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001487 }
1488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 /* Update our counter in the thread-state - no need for locks:
1490 - tcur will remain valid as we hold the GIL.
1491 - the counter is safe as we are the only thread "allowed"
1492 to modify this value
1493 */
1494 ++tcur->gilstate_counter;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001497}
1498
Tim Peters19717fa2004-10-09 17:38:29 +00001499void
1500PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001501{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001502 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner23ef89d2020-03-18 02:26:04 +01001503 PyThreadState *tstate = PyThread_tss_get(&runtime->gilstate.autoTSSkey);
1504 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 Py_FatalError("auto-releasing thread-state, "
1506 "but no thread-state for this thread");
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001507 }
1508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 /* We must hold the GIL and have our thread state current */
1510 /* XXX - remove the check - the assert should be fine,
1511 but while this is very new (April 2003), the extra check
1512 by release-only users can't hurt.
1513 */
Victor Stinner23ef89d2020-03-18 02:26:04 +01001514 if (!PyThreadState_IsCurrent(tstate)) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +01001515 _Py_FatalErrorFormat(__func__,
1516 "thread state %p must be current when releasing",
1517 tstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001518 }
Victor Stinner23ef89d2020-03-18 02:26:04 +01001519 assert(PyThreadState_IsCurrent(tstate));
1520 --tstate->gilstate_counter;
1521 assert(tstate->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 /* If we're going to destroy this thread-state, we must
1524 * clear it while the GIL is held, as destructors may run.
1525 */
Victor Stinner23ef89d2020-03-18 02:26:04 +01001526 if (tstate->gilstate_counter == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 /* can't have been locked when we created it */
1528 assert(oldstate == PyGILState_UNLOCKED);
Victor Stinner23ef89d2020-03-18 02:26:04 +01001529 PyThreadState_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 /* Delete the thread-state. Note this releases the GIL too!
1531 * It's vital that the GIL be held here, to avoid shutdown
1532 * races; see bugs 225673 and 1061968 (that nasty bug has a
1533 * habit of coming back).
1534 */
Victor Stinner23ef89d2020-03-18 02:26:04 +01001535 assert(_PyRuntimeGILState_GetThreadState(&runtime->gilstate) == tstate);
1536 _PyThreadState_DeleteCurrent(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 }
1538 /* Release the lock if necessary */
1539 else if (oldstate == PyGILState_UNLOCKED)
1540 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001541}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001542
Benjamin Peterson3bf01752012-04-13 18:06:36 -04001543
Eric Snow7f8bfc92018-01-29 18:23:44 -07001544/**************************/
1545/* cross-interpreter data */
1546/**************************/
1547
1548/* cross-interpreter data */
1549
1550crossinterpdatafunc _PyCrossInterpreterData_Lookup(PyObject *);
1551
1552/* This is a separate func from _PyCrossInterpreterData_Lookup in order
1553 to keep the registry code separate. */
1554static crossinterpdatafunc
1555_lookup_getdata(PyObject *obj)
1556{
1557 crossinterpdatafunc getdata = _PyCrossInterpreterData_Lookup(obj);
1558 if (getdata == NULL && PyErr_Occurred() == 0)
1559 PyErr_Format(PyExc_ValueError,
1560 "%S does not support cross-interpreter data", obj);
1561 return getdata;
1562}
1563
1564int
1565_PyObject_CheckCrossInterpreterData(PyObject *obj)
1566{
1567 crossinterpdatafunc getdata = _lookup_getdata(obj);
1568 if (getdata == NULL) {
1569 return -1;
1570 }
1571 return 0;
1572}
1573
1574static int
Victor Stinner71a35222020-03-26 22:46:14 +01001575_check_xidata(PyThreadState *tstate, _PyCrossInterpreterData *data)
Eric Snow7f8bfc92018-01-29 18:23:44 -07001576{
1577 // data->data can be anything, including NULL, so we don't check it.
1578
1579 // data->obj may be NULL, so we don't check it.
1580
1581 if (data->interp < 0) {
Victor Stinner71a35222020-03-26 22:46:14 +01001582 _PyErr_SetString(tstate, PyExc_SystemError, "missing interp");
Eric Snow7f8bfc92018-01-29 18:23:44 -07001583 return -1;
1584 }
1585
1586 if (data->new_object == NULL) {
Victor Stinner71a35222020-03-26 22:46:14 +01001587 _PyErr_SetString(tstate, PyExc_SystemError, "missing new_object func");
Eric Snow7f8bfc92018-01-29 18:23:44 -07001588 return -1;
1589 }
1590
1591 // data->free may be NULL, so we don't check it.
1592
1593 return 0;
1594}
1595
1596int
1597_PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data)
1598{
Victor Stinner71a35222020-03-26 22:46:14 +01001599 // PyThreadState_Get() aborts if tstate is NULL.
1600 PyThreadState *tstate = PyThreadState_Get();
1601 PyInterpreterState *interp = tstate->interp;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001602
1603 // Reset data before re-populating.
1604 *data = (_PyCrossInterpreterData){0};
1605 data->free = PyMem_RawFree; // Set a default that may be overridden.
1606
1607 // Call the "getdata" func for the object.
1608 Py_INCREF(obj);
1609 crossinterpdatafunc getdata = _lookup_getdata(obj);
1610 if (getdata == NULL) {
1611 Py_DECREF(obj);
1612 return -1;
1613 }
1614 int res = getdata(obj, data);
1615 Py_DECREF(obj);
1616 if (res != 0) {
1617 return -1;
1618 }
1619
1620 // Fill in the blanks and validate the result.
Eric Snow7f8bfc92018-01-29 18:23:44 -07001621 data->interp = interp->id;
Victor Stinner71a35222020-03-26 22:46:14 +01001622 if (_check_xidata(tstate, data) != 0) {
Eric Snow7f8bfc92018-01-29 18:23:44 -07001623 _PyCrossInterpreterData_Release(data);
1624 return -1;
1625 }
1626
1627 return 0;
1628}
1629
Victor Stinnere225beb2019-06-03 18:14:24 +02001630static void
Eric Snow63799132018-06-01 18:45:20 -06001631_release_xidata(void *arg)
1632{
1633 _PyCrossInterpreterData *data = (_PyCrossInterpreterData *)arg;
1634 if (data->free != NULL) {
1635 data->free(data->data);
1636 }
1637 Py_XDECREF(data->obj);
Victor Stinnere225beb2019-06-03 18:14:24 +02001638}
1639
1640static void
1641_call_in_interpreter(struct _gilstate_runtime_state *gilstate,
1642 PyInterpreterState *interp,
1643 void (*func)(void *), void *arg)
1644{
1645 /* We would use Py_AddPendingCall() if it weren't specific to the
1646 * main interpreter (see bpo-33608). In the meantime we take a
1647 * naive approach.
1648 */
1649 PyThreadState *save_tstate = NULL;
1650 if (interp != _PyRuntimeGILState_GetThreadState(gilstate)->interp) {
1651 // XXX Using the "head" thread isn't strictly correct.
1652 PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
1653 // XXX Possible GILState issues?
1654 save_tstate = _PyThreadState_Swap(gilstate, tstate);
1655 }
1656
1657 func(arg);
1658
1659 // Switch back.
1660 if (save_tstate != NULL) {
1661 _PyThreadState_Swap(gilstate, save_tstate);
1662 }
Eric Snow63799132018-06-01 18:45:20 -06001663}
1664
Eric Snow7f8bfc92018-01-29 18:23:44 -07001665void
1666_PyCrossInterpreterData_Release(_PyCrossInterpreterData *data)
1667{
1668 if (data->data == NULL && data->obj == NULL) {
1669 // Nothing to release!
1670 return;
1671 }
1672
Victor Stinnere225beb2019-06-03 18:14:24 +02001673 // Switch to the original interpreter.
Eric Snow7f8bfc92018-01-29 18:23:44 -07001674 PyInterpreterState *interp = _PyInterpreterState_LookUpID(data->interp);
1675 if (interp == NULL) {
Min ho Kimc4cacc82019-07-31 08:16:13 +10001676 // The interpreter was already destroyed.
Eric Snow7f8bfc92018-01-29 18:23:44 -07001677 if (data->free != NULL) {
1678 // XXX Someone leaked some memory...
1679 }
1680 return;
1681 }
Eric Snowf53d9f22018-02-20 16:30:17 -07001682
Eric Snow7f8bfc92018-01-29 18:23:44 -07001683 // "Release" the data and/or the object.
Victor Stinnere225beb2019-06-03 18:14:24 +02001684 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
1685 _call_in_interpreter(gilstate, interp, _release_xidata, data);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001686}
1687
1688PyObject *
1689_PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *data)
1690{
1691 return data->new_object(data);
1692}
1693
1694/* registry of {type -> crossinterpdatafunc} */
1695
1696/* For now we use a global registry of shareable classes. An
1697 alternative would be to add a tp_* slot for a class's
1698 crossinterpdatafunc. It would be simpler and more efficient. */
1699
1700static int
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001701_register_xidata(struct _xidregistry *xidregistry, PyTypeObject *cls,
1702 crossinterpdatafunc getdata)
Eric Snow7f8bfc92018-01-29 18:23:44 -07001703{
1704 // Note that we effectively replace already registered classes
1705 // rather than failing.
1706 struct _xidregitem *newhead = PyMem_RawMalloc(sizeof(struct _xidregitem));
1707 if (newhead == NULL)
1708 return -1;
1709 newhead->cls = cls;
1710 newhead->getdata = getdata;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001711 newhead->next = xidregistry->head;
1712 xidregistry->head = newhead;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001713 return 0;
1714}
1715
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001716static void _register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001717
1718int
Eric Snowc11183c2019-03-15 16:35:46 -06001719_PyCrossInterpreterData_RegisterClass(PyTypeObject *cls,
Eric Snow7f8bfc92018-01-29 18:23:44 -07001720 crossinterpdatafunc getdata)
1721{
1722 if (!PyType_Check(cls)) {
1723 PyErr_Format(PyExc_ValueError, "only classes may be registered");
1724 return -1;
1725 }
1726 if (getdata == NULL) {
1727 PyErr_Format(PyExc_ValueError, "missing 'getdata' func");
1728 return -1;
1729 }
1730
1731 // Make sure the class isn't ever deallocated.
1732 Py_INCREF((PyObject *)cls);
1733
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001734 struct _xidregistry *xidregistry = &_PyRuntime.xidregistry ;
1735 PyThread_acquire_lock(xidregistry->mutex, WAIT_LOCK);
1736 if (xidregistry->head == NULL) {
1737 _register_builtins_for_crossinterpreter_data(xidregistry);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001738 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001739 int res = _register_xidata(xidregistry, cls, getdata);
1740 PyThread_release_lock(xidregistry->mutex);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001741 return res;
1742}
1743
Eric Snow6d2cd902018-05-16 15:04:57 -04001744/* Cross-interpreter objects are looked up by exact match on the class.
1745 We can reassess this policy when we move from a global registry to a
1746 tp_* slot. */
1747
Eric Snow7f8bfc92018-01-29 18:23:44 -07001748crossinterpdatafunc
1749_PyCrossInterpreterData_Lookup(PyObject *obj)
1750{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001751 struct _xidregistry *xidregistry = &_PyRuntime.xidregistry ;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001752 PyObject *cls = PyObject_Type(obj);
1753 crossinterpdatafunc getdata = NULL;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001754 PyThread_acquire_lock(xidregistry->mutex, WAIT_LOCK);
1755 struct _xidregitem *cur = xidregistry->head;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001756 if (cur == NULL) {
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001757 _register_builtins_for_crossinterpreter_data(xidregistry);
1758 cur = xidregistry->head;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001759 }
1760 for(; cur != NULL; cur = cur->next) {
1761 if (cur->cls == (PyTypeObject *)cls) {
1762 getdata = cur->getdata;
1763 break;
1764 }
1765 }
Eric Snow4e9da0d2018-02-02 21:49:49 -07001766 Py_DECREF(cls);
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001767 PyThread_release_lock(xidregistry->mutex);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001768 return getdata;
1769}
1770
1771/* cross-interpreter data for builtin types */
1772
Eric Snow6d2cd902018-05-16 15:04:57 -04001773struct _shared_bytes_data {
1774 char *bytes;
1775 Py_ssize_t len;
1776};
1777
Eric Snow7f8bfc92018-01-29 18:23:44 -07001778static PyObject *
1779_new_bytes_object(_PyCrossInterpreterData *data)
1780{
Eric Snow6d2cd902018-05-16 15:04:57 -04001781 struct _shared_bytes_data *shared = (struct _shared_bytes_data *)(data->data);
1782 return PyBytes_FromStringAndSize(shared->bytes, shared->len);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001783}
1784
1785static int
1786_bytes_shared(PyObject *obj, _PyCrossInterpreterData *data)
1787{
Eric Snow6d2cd902018-05-16 15:04:57 -04001788 struct _shared_bytes_data *shared = PyMem_NEW(struct _shared_bytes_data, 1);
1789 if (PyBytes_AsStringAndSize(obj, &shared->bytes, &shared->len) < 0) {
1790 return -1;
1791 }
1792 data->data = (void *)shared;
Eric Snow63799132018-06-01 18:45:20 -06001793 Py_INCREF(obj);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001794 data->obj = obj; // Will be "released" (decref'ed) when data released.
1795 data->new_object = _new_bytes_object;
Eric Snow6d2cd902018-05-16 15:04:57 -04001796 data->free = PyMem_Free;
1797 return 0;
1798}
1799
1800struct _shared_str_data {
1801 int kind;
1802 const void *buffer;
1803 Py_ssize_t len;
1804};
1805
1806static PyObject *
1807_new_str_object(_PyCrossInterpreterData *data)
1808{
1809 struct _shared_str_data *shared = (struct _shared_str_data *)(data->data);
1810 return PyUnicode_FromKindAndData(shared->kind, shared->buffer, shared->len);
1811}
1812
1813static int
1814_str_shared(PyObject *obj, _PyCrossInterpreterData *data)
1815{
1816 struct _shared_str_data *shared = PyMem_NEW(struct _shared_str_data, 1);
1817 shared->kind = PyUnicode_KIND(obj);
1818 shared->buffer = PyUnicode_DATA(obj);
An Long29c11722020-06-13 20:26:01 +08001819 shared->len = PyUnicode_GET_LENGTH(obj);
Eric Snow6d2cd902018-05-16 15:04:57 -04001820 data->data = (void *)shared;
Eric Snow63799132018-06-01 18:45:20 -06001821 Py_INCREF(obj);
Eric Snow6d2cd902018-05-16 15:04:57 -04001822 data->obj = obj; // Will be "released" (decref'ed) when data released.
1823 data->new_object = _new_str_object;
1824 data->free = PyMem_Free;
1825 return 0;
1826}
1827
1828static PyObject *
1829_new_long_object(_PyCrossInterpreterData *data)
1830{
Alexey Izbyshev16f842d2019-02-12 19:06:43 +03001831 return PyLong_FromSsize_t((Py_ssize_t)(data->data));
Eric Snow6d2cd902018-05-16 15:04:57 -04001832}
1833
1834static int
1835_long_shared(PyObject *obj, _PyCrossInterpreterData *data)
1836{
Alexey Izbyshev16f842d2019-02-12 19:06:43 +03001837 /* Note that this means the size of shareable ints is bounded by
1838 * sys.maxsize. Hence on 32-bit architectures that is half the
1839 * size of maximum shareable ints on 64-bit.
1840 */
1841 Py_ssize_t value = PyLong_AsSsize_t(obj);
Eric Snow6d2cd902018-05-16 15:04:57 -04001842 if (value == -1 && PyErr_Occurred()) {
1843 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1844 PyErr_SetString(PyExc_OverflowError, "try sending as bytes");
1845 }
1846 return -1;
1847 }
1848 data->data = (void *)value;
1849 data->obj = NULL;
1850 data->new_object = _new_long_object;
1851 data->free = NULL;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001852 return 0;
1853}
1854
1855static PyObject *
1856_new_none_object(_PyCrossInterpreterData *data)
1857{
1858 // XXX Singleton refcounts are problematic across interpreters...
1859 Py_INCREF(Py_None);
1860 return Py_None;
1861}
1862
1863static int
1864_none_shared(PyObject *obj, _PyCrossInterpreterData *data)
1865{
1866 data->data = NULL;
1867 // data->obj remains NULL
1868 data->new_object = _new_none_object;
1869 data->free = NULL; // There is nothing to free.
1870 return 0;
1871}
1872
1873static void
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001874_register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry)
Eric Snow7f8bfc92018-01-29 18:23:44 -07001875{
1876 // None
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001877 if (_register_xidata(xidregistry, (PyTypeObject *)PyObject_Type(Py_None), _none_shared) != 0) {
Eric Snow7f8bfc92018-01-29 18:23:44 -07001878 Py_FatalError("could not register None for cross-interpreter sharing");
1879 }
1880
Eric Snow6d2cd902018-05-16 15:04:57 -04001881 // int
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001882 if (_register_xidata(xidregistry, &PyLong_Type, _long_shared) != 0) {
Eric Snow6d2cd902018-05-16 15:04:57 -04001883 Py_FatalError("could not register int for cross-interpreter sharing");
1884 }
1885
Eric Snow7f8bfc92018-01-29 18:23:44 -07001886 // bytes
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001887 if (_register_xidata(xidregistry, &PyBytes_Type, _bytes_shared) != 0) {
Eric Snow7f8bfc92018-01-29 18:23:44 -07001888 Py_FatalError("could not register bytes for cross-interpreter sharing");
1889 }
Eric Snow6d2cd902018-05-16 15:04:57 -04001890
1891 // str
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001892 if (_register_xidata(xidregistry, &PyUnicode_Type, _str_shared) != 0) {
Eric Snow6d2cd902018-05-16 15:04:57 -04001893 Py_FatalError("could not register str for cross-interpreter sharing");
1894 }
Eric Snow7f8bfc92018-01-29 18:23:44 -07001895}
1896
1897
Victor Stinner0b72b232020-03-12 23:18:39 +01001898_PyFrameEvalFunction
1899_PyInterpreterState_GetEvalFrameFunc(PyInterpreterState *interp)
1900{
1901 return interp->eval_frame;
1902}
1903
1904
1905void
1906_PyInterpreterState_SetEvalFrameFunc(PyInterpreterState *interp,
1907 _PyFrameEvalFunction eval_frame)
1908{
1909 interp->eval_frame = eval_frame;
1910}
1911
Victor Stinnerda7933e2020-04-13 03:04:28 +02001912
1913const PyConfig*
1914_PyInterpreterState_GetConfig(PyInterpreterState *interp)
1915{
1916 return &interp->config;
1917}
1918
1919
1920PyStatus
1921_PyInterpreterState_SetConfig(PyInterpreterState *interp,
1922 const PyConfig *config)
1923{
1924 return _PyConfig_Copy(&interp->config, config);
1925}
1926
1927
1928const PyConfig*
1929_Py_GetConfig(void)
1930{
1931 assert(PyGILState_Check());
1932 PyThreadState *tstate = _PyThreadState_GET();
1933 return _PyInterpreterState_GetConfig(tstate->interp);
1934}
1935
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001936#ifdef __cplusplus
1937}
1938#endif