blob: d0cbf5cb8364bf475125130bbf647aef46058e0e [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 Stinner01b1cc12019-11-20 02:27:56 +0100271void
272PyInterpreterState_Clear(PyInterpreterState *interp)
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 /* Use the current Python thread state to call audit hooks,
277 not the current Python thread state of 'interp'. */
278 PyThreadState *tstate = _PyThreadState_GET();
279 if (_PySys_Audit(tstate, "cpython.PyInterpreterState_Clear", NULL) < 0) {
280 _PyErr_Clear(tstate);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700281 }
282
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200283 HEAD_LOCK(runtime);
284 for (PyThreadState *p = interp->tstate_head; p != NULL; p = p->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000285 PyThreadState_Clear(p);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200286 }
287 HEAD_UNLOCK(runtime);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700288
289 Py_CLEAR(interp->audit_hooks);
290
Victor Stinner331a6a52019-05-27 16:39:22 +0200291 PyConfig_Clear(&interp->config);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 Py_CLEAR(interp->codec_search_path);
293 Py_CLEAR(interp->codec_search_cache);
294 Py_CLEAR(interp->codec_error_registry);
Eric Snow93c92f72017-09-13 23:46:04 -0700295 Py_CLEAR(interp->modules);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296 Py_CLEAR(interp->modules_by_index);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 Py_CLEAR(interp->sysdict);
298 Py_CLEAR(interp->builtins);
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200299 Py_CLEAR(interp->builtins_copy);
Brett Cannonfd074152012-04-14 14:10:13 -0400300 Py_CLEAR(interp->importlib);
Serhiy Storchaka133138a2016-08-02 22:51:21 +0300301 Py_CLEAR(interp->import_func);
Eric Snowd2fdd1f2019-03-15 17:47:43 -0600302 Py_CLEAR(interp->dict);
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200303#ifdef HAVE_FORK
304 Py_CLEAR(interp->before_forkers);
305 Py_CLEAR(interp->after_forkers_parent);
306 Py_CLEAR(interp->after_forkers_child);
307#endif
Victor Stinner7b3c2522020-03-07 00:24:23 +0100308 if (_PyRuntimeState_GetFinalizing(runtime) == NULL) {
Eric Snow86ea5812019-05-10 13:29:55 -0400309 _PyWarnings_Fini(interp);
310 }
Eric Snow5be45a62019-03-08 22:47:07 -0700311 // XXX Once we have one allocator per interpreter (i.e.
312 // per-interpreter GC) we must ensure that all of the interpreter's
313 // objects have been cleaned up at the point.
Guido van Rossum25ce5661997-08-02 03:10:38 +0000314}
315
316
317static void
Victor Stinner9da74302019-11-20 11:17:17 +0100318zapthreads(PyInterpreterState *interp, int check_current)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000319{
Victor Stinner9da74302019-11-20 11:17:17 +0100320 PyThreadState *tstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000321 /* No need to lock the mutex here because this should only happen
322 when the threads are all really dead (XXX famous last words). */
Victor Stinner9da74302019-11-20 11:17:17 +0100323 while ((tstate = interp->tstate_head) != NULL) {
324 _PyThreadState_Delete(tstate, check_current);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000326}
327
328
Victor Stinner01b1cc12019-11-20 02:27:56 +0100329void
330PyInterpreterState_Delete(PyInterpreterState *interp)
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200331{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100332 _PyRuntimeState *runtime = interp->runtime;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200333 struct pyinterpreters *interpreters = &runtime->interpreters;
Victor Stinner9da74302019-11-20 11:17:17 +0100334 zapthreads(interp, 0);
335
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200336 _PyEval_FiniState(&interp->ceval);
337
Victor Stinner9da74302019-11-20 11:17:17 +0100338 /* Delete current thread. After this, many C API calls become crashy. */
339 _PyThreadState_Swap(&runtime->gilstate, NULL);
340
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200341 HEAD_LOCK(runtime);
342 PyInterpreterState **p;
343 for (p = &interpreters->head; ; p = &(*p)->next) {
344 if (*p == NULL) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100345 Py_FatalError("NULL interpreter");
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200346 }
347 if (*p == interp) {
348 break;
349 }
350 }
351 if (interp->tstate_head != NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100352 Py_FatalError("remaining threads");
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200353 }
354 *p = interp->next;
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200355
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200356 if (interpreters->main == interp) {
357 interpreters->main = NULL;
358 if (interpreters->head != NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100359 Py_FatalError("remaining subinterpreters");
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200360 }
361 }
362 HEAD_UNLOCK(runtime);
Victor Stinnerdda5d6e2020-04-08 17:54:59 +0200363
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200364 if (interp->id_mutex != NULL) {
365 PyThread_free_lock(interp->id_mutex);
366 }
367 PyMem_RawFree(interp);
368}
369
370
Victor Stinner26881c82020-06-02 15:51:37 +0200371#ifdef HAVE_FORK
Eric Snow59032962018-09-14 14:17:20 -0700372/*
373 * Delete all interpreter states except the main interpreter. If there
374 * is a current interpreter state, it *must* be the main interpreter.
375 */
Victor Stinner26881c82020-06-02 15:51:37 +0200376PyStatus
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200377_PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime)
Eric Snow59032962018-09-14 14:17:20 -0700378{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200379 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200380 struct pyinterpreters *interpreters = &runtime->interpreters;
381
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200382 PyThreadState *tstate = _PyThreadState_Swap(gilstate, NULL);
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200383 if (tstate != NULL && tstate->interp != interpreters->main) {
Victor Stinner26881c82020-06-02 15:51:37 +0200384 return _PyStatus_ERR("not main interpreter");
Eric Snow59032962018-09-14 14:17:20 -0700385 }
386
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200387 HEAD_LOCK(runtime);
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200388 PyInterpreterState *interp = interpreters->head;
389 interpreters->head = NULL;
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100390 while (interp != NULL) {
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200391 if (interp == interpreters->main) {
392 interpreters->main->next = NULL;
393 interpreters->head = interp;
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100394 interp = interp->next;
Eric Snow59032962018-09-14 14:17:20 -0700395 continue;
396 }
397
Victor Stinner01b1cc12019-11-20 02:27:56 +0100398 PyInterpreterState_Clear(interp); // XXX must activate?
Victor Stinner9da74302019-11-20 11:17:17 +0100399 zapthreads(interp, 1);
Eric Snow59032962018-09-14 14:17:20 -0700400 if (interp->id_mutex != NULL) {
401 PyThread_free_lock(interp->id_mutex);
402 }
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100403 PyInterpreterState *prev_interp = interp;
404 interp = interp->next;
405 PyMem_RawFree(prev_interp);
Eric Snow59032962018-09-14 14:17:20 -0700406 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200407 HEAD_UNLOCK(runtime);
Eric Snow59032962018-09-14 14:17:20 -0700408
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200409 if (interpreters->head == NULL) {
Victor Stinner26881c82020-06-02 15:51:37 +0200410 return _PyStatus_ERR("missing main interpreter");
Eric Snow59032962018-09-14 14:17:20 -0700411 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200412 _PyThreadState_Swap(gilstate, tstate);
Victor Stinner26881c82020-06-02 15:51:37 +0200413 return _PyStatus_OK();
Eric Snow59032962018-09-14 14:17:20 -0700414}
Victor Stinner26881c82020-06-02 15:51:37 +0200415#endif
Eric Snow59032962018-09-14 14:17:20 -0700416
417
Victor Stinnercaba55b2018-08-03 15:33:52 +0200418PyInterpreterState *
Victor Stinnerbe793732020-03-13 18:15:33 +0100419PyInterpreterState_Get(void)
Victor Stinnercaba55b2018-08-03 15:33:52 +0200420{
Victor Stinner50b48572018-11-01 01:51:40 +0100421 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner3026cad2020-06-01 16:02:40 +0200422 _Py_EnsureTstateNotNULL(tstate);
Victor Stinnercaba55b2018-08-03 15:33:52 +0200423 PyInterpreterState *interp = tstate->interp;
424 if (interp == NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100425 Py_FatalError("no current interpreter");
Victor Stinnercaba55b2018-08-03 15:33:52 +0200426 }
427 return interp;
428}
429
430
Eric Snowe3774162017-05-22 19:46:40 -0700431int64_t
432PyInterpreterState_GetID(PyInterpreterState *interp)
433{
434 if (interp == NULL) {
435 PyErr_SetString(PyExc_RuntimeError, "no interpreter provided");
436 return -1;
437 }
438 return interp->id;
439}
440
441
Eric Snow5be45a62019-03-08 22:47:07 -0700442static PyInterpreterState *
Victor Stinner1a1bd2e2020-04-17 19:13:06 +0200443interp_look_up_id(_PyRuntimeState *runtime, int64_t requested_id)
Eric Snowb05b7112019-03-01 12:35:10 -0700444{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200445 PyInterpreterState *interp = runtime->interpreters.head;
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100446 while (interp != NULL) {
Victor Stinner1a1bd2e2020-04-17 19:13:06 +0200447 int64_t id = PyInterpreterState_GetID(interp);
Eric Snow5be45a62019-03-08 22:47:07 -0700448 if (id < 0) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100449 return NULL;
Eric Snow5be45a62019-03-08 22:47:07 -0700450 }
451 if (requested_id == id) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100452 return interp;
Eric Snow5be45a62019-03-08 22:47:07 -0700453 }
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100454 interp = PyInterpreterState_Next(interp);
Eric Snowb05b7112019-03-01 12:35:10 -0700455 }
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100456 return NULL;
Eric Snowb05b7112019-03-01 12:35:10 -0700457}
458
Eric Snow5be45a62019-03-08 22:47:07 -0700459PyInterpreterState *
Victor Stinner1a1bd2e2020-04-17 19:13:06 +0200460_PyInterpreterState_LookUpID(int64_t requested_id)
Eric Snow5be45a62019-03-08 22:47:07 -0700461{
462 PyInterpreterState *interp = NULL;
463 if (requested_id >= 0) {
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200464 _PyRuntimeState *runtime = &_PyRuntime;
465 HEAD_LOCK(runtime);
466 interp = interp_look_up_id(runtime, requested_id);
467 HEAD_UNLOCK(runtime);
Eric Snow5be45a62019-03-08 22:47:07 -0700468 }
469 if (interp == NULL && !PyErr_Occurred()) {
470 PyErr_Format(PyExc_RuntimeError,
471 "unrecognized interpreter ID %lld", requested_id);
472 }
473 return interp;
474}
475
Eric Snow4c6955e2018-02-16 18:53:40 -0700476
477int
478_PyInterpreterState_IDInitref(PyInterpreterState *interp)
479{
480 if (interp->id_mutex != NULL) {
481 return 0;
482 }
483 interp->id_mutex = PyThread_allocate_lock();
484 if (interp->id_mutex == NULL) {
485 PyErr_SetString(PyExc_RuntimeError,
486 "failed to create init interpreter ID mutex");
487 return -1;
488 }
489 interp->id_refcount = 0;
490 return 0;
491}
492
493
494void
495_PyInterpreterState_IDIncref(PyInterpreterState *interp)
496{
497 if (interp->id_mutex == NULL) {
498 return;
499 }
500 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
501 interp->id_refcount += 1;
502 PyThread_release_lock(interp->id_mutex);
503}
504
505
506void
507_PyInterpreterState_IDDecref(PyInterpreterState *interp)
508{
509 if (interp->id_mutex == NULL) {
510 return;
511 }
Victor Stinner0fd2c302019-06-04 03:15:09 +0200512 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
Eric Snow4c6955e2018-02-16 18:53:40 -0700513 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
514 assert(interp->id_refcount != 0);
515 interp->id_refcount -= 1;
516 int64_t refcount = interp->id_refcount;
517 PyThread_release_lock(interp->id_mutex);
518
Eric Snowc11183c2019-03-15 16:35:46 -0600519 if (refcount == 0 && interp->requires_idref) {
Eric Snowf53d9f22018-02-20 16:30:17 -0700520 // XXX Using the "head" thread isn't strictly correct.
521 PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
522 // XXX Possible GILState issues?
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200523 PyThreadState *save_tstate = _PyThreadState_Swap(gilstate, tstate);
Eric Snow4c6955e2018-02-16 18:53:40 -0700524 Py_EndInterpreter(tstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200525 _PyThreadState_Swap(gilstate, save_tstate);
Eric Snow4c6955e2018-02-16 18:53:40 -0700526 }
527}
528
Eric Snowc11183c2019-03-15 16:35:46 -0600529int
530_PyInterpreterState_RequiresIDRef(PyInterpreterState *interp)
531{
532 return interp->requires_idref;
533}
534
535void
536_PyInterpreterState_RequireIDRef(PyInterpreterState *interp, int required)
537{
538 interp->requires_idref = required ? 1 : 0;
539}
540
Eric Snowc11183c2019-03-15 16:35:46 -0600541PyObject *
542_PyInterpreterState_GetMainModule(PyInterpreterState *interp)
543{
544 if (interp->modules == NULL) {
545 PyErr_SetString(PyExc_RuntimeError, "interpreter not initialized");
546 return NULL;
547 }
548 return PyMapping_GetItemString(interp->modules, "__main__");
549}
550
Eric Snowd2fdd1f2019-03-15 17:47:43 -0600551PyObject *
552PyInterpreterState_GetDict(PyInterpreterState *interp)
553{
554 if (interp->dict == NULL) {
555 interp->dict = PyDict_New();
556 if (interp->dict == NULL) {
557 PyErr_Clear();
558 }
559 }
560 /* Returning NULL means no per-interpreter dict is available. */
561 return interp->dict;
562}
563
Victor Stinner45b9be52010-03-03 23:28:07 +0000564static PyThreadState *
565new_threadstate(PyInterpreterState *interp, int init)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000566{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100567 _PyRuntimeState *runtime = interp->runtime;
Victor Stinner1a7425f2013-07-07 16:25:15 +0200568 PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState));
Victor Stinner8bb32302019-04-24 16:47:40 +0200569 if (tstate == NULL) {
570 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000572
Victor Stinner8bb32302019-04-24 16:47:40 +0200573 tstate->interp = interp;
574
575 tstate->frame = NULL;
576 tstate->recursion_depth = 0;
577 tstate->overflowed = 0;
578 tstate->recursion_critical = 0;
579 tstate->stackcheck_counter = 0;
580 tstate->tracing = 0;
581 tstate->use_tracing = 0;
582 tstate->gilstate_counter = 0;
583 tstate->async_exc = NULL;
584 tstate->thread_id = PyThread_get_thread_ident();
585
586 tstate->dict = NULL;
587
588 tstate->curexc_type = NULL;
589 tstate->curexc_value = NULL;
590 tstate->curexc_traceback = NULL;
591
592 tstate->exc_state.exc_type = NULL;
593 tstate->exc_state.exc_value = NULL;
594 tstate->exc_state.exc_traceback = NULL;
595 tstate->exc_state.previous_item = NULL;
596 tstate->exc_info = &tstate->exc_state;
597
598 tstate->c_profilefunc = NULL;
599 tstate->c_tracefunc = NULL;
600 tstate->c_profileobj = NULL;
601 tstate->c_traceobj = NULL;
602
603 tstate->trash_delete_nesting = 0;
604 tstate->trash_delete_later = NULL;
605 tstate->on_delete = NULL;
606 tstate->on_delete_data = NULL;
607
608 tstate->coroutine_origin_tracking_depth = 0;
609
Victor Stinner8bb32302019-04-24 16:47:40 +0200610 tstate->async_gen_firstiter = NULL;
611 tstate->async_gen_finalizer = NULL;
612
613 tstate->context = NULL;
614 tstate->context_ver = 1;
615
Victor Stinner8bb32302019-04-24 16:47:40 +0200616 if (init) {
Victor Stinner01b1cc12019-11-20 02:27:56 +0100617 _PyThreadState_Init(tstate);
Victor Stinner8bb32302019-04-24 16:47:40 +0200618 }
619
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200620 HEAD_LOCK(runtime);
Stefan Krahb3b9ade2020-03-02 21:22:36 +0100621 tstate->id = ++interp->tstate_next_unique_id;
Victor Stinner8bb32302019-04-24 16:47:40 +0200622 tstate->prev = NULL;
623 tstate->next = interp->tstate_head;
624 if (tstate->next)
625 tstate->next->prev = tstate;
626 interp->tstate_head = tstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200627 HEAD_UNLOCK(runtime);
Victor Stinner8bb32302019-04-24 16:47:40 +0200628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000630}
631
Victor Stinner45b9be52010-03-03 23:28:07 +0000632PyThreadState *
633PyThreadState_New(PyInterpreterState *interp)
634{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 return new_threadstate(interp, 1);
Victor Stinner45b9be52010-03-03 23:28:07 +0000636}
637
638PyThreadState *
639_PyThreadState_Prealloc(PyInterpreterState *interp)
640{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 return new_threadstate(interp, 0);
Victor Stinner45b9be52010-03-03 23:28:07 +0000642}
643
644void
Victor Stinner01b1cc12019-11-20 02:27:56 +0100645_PyThreadState_Init(PyThreadState *tstate)
Victor Stinner45b9be52010-03-03 23:28:07 +0000646{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100647 _PyGILState_NoteThreadState(&tstate->interp->runtime->gilstate, tstate);
Victor Stinner45b9be52010-03-03 23:28:07 +0000648}
649
Martin v. Löwis1a214512008-06-11 05:26:20 +0000650PyObject*
Martin v. Löwis7800f752012-06-22 12:20:55 +0200651PyState_FindModule(struct PyModuleDef* module)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000652{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200653 Py_ssize_t index = module->m_base.m_index;
Victor Stinner81a7be32020-04-14 15:14:01 +0200654 PyInterpreterState *state = _PyInterpreterState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 PyObject *res;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000656 if (module->m_slots) {
657 return NULL;
658 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 if (index == 0)
660 return NULL;
661 if (state->modules_by_index == NULL)
662 return NULL;
Antoine Pitrou75506e82012-08-20 19:30:46 +0200663 if (index >= PyList_GET_SIZE(state->modules_by_index))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 return NULL;
665 res = PyList_GET_ITEM(state->modules_by_index, index);
666 return res==Py_None ? NULL : res;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000667}
668
669int
Victor Stinner82c83bd2019-11-22 18:52:27 +0100670_PyState_AddModule(PyThreadState *tstate, PyObject* module, struct PyModuleDef* def)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000671{
Berker Peksag4b7b5652016-08-22 18:05:56 +0300672 if (!def) {
Victor Stinner71a35222020-03-26 22:46:14 +0100673 assert(_PyErr_Occurred(tstate));
Berker Peksag4b7b5652016-08-22 18:05:56 +0300674 return -1;
675 }
Nick Coghland5cacbb2015-05-23 22:24:10 +1000676 if (def->m_slots) {
Victor Stinner71a35222020-03-26 22:46:14 +0100677 _PyErr_SetString(tstate,
678 PyExc_SystemError,
679 "PyState_AddModule called on module with slots");
Nick Coghland5cacbb2015-05-23 22:24:10 +1000680 return -1;
681 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100682
683 PyInterpreterState *interp = tstate->interp;
684 if (!interp->modules_by_index) {
685 interp->modules_by_index = PyList_New(0);
686 if (!interp->modules_by_index) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 return -1;
Victor Stinner82c83bd2019-11-22 18:52:27 +0100688 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100690
691 while (PyList_GET_SIZE(interp->modules_by_index) <= def->m_base.m_index) {
692 if (PyList_Append(interp->modules_by_index, Py_None) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 return -1;
Victor Stinner82c83bd2019-11-22 18:52:27 +0100694 }
695 }
696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 Py_INCREF(module);
Victor Stinner82c83bd2019-11-22 18:52:27 +0100698 return PyList_SetItem(interp->modules_by_index,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000700}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000701
Martin v. Löwis7800f752012-06-22 12:20:55 +0200702int
703PyState_AddModule(PyObject* module, struct PyModuleDef* def)
704{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200705 if (!def) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100706 Py_FatalError("module definition is NULL");
Martin v. Löwis7800f752012-06-22 12:20:55 +0200707 return -1;
708 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100709
710 PyThreadState *tstate = _PyThreadState_GET();
711 PyInterpreterState *interp = tstate->interp;
712 Py_ssize_t index = def->m_base.m_index;
713 if (interp->modules_by_index &&
714 index < PyList_GET_SIZE(interp->modules_by_index) &&
715 module == PyList_GET_ITEM(interp->modules_by_index, index))
716 {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100717 _Py_FatalErrorFormat(__func__, "module %p already added", module);
Benjamin Peterson39de95b2019-09-12 00:43:22 +0100718 return -1;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200719 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100720 return _PyState_AddModule(tstate, module, def);
Martin v. Löwis7800f752012-06-22 12:20:55 +0200721}
722
723int
724PyState_RemoveModule(struct PyModuleDef* def)
725{
Victor Stinner71a35222020-03-26 22:46:14 +0100726 PyThreadState *tstate = _PyThreadState_GET();
727 PyInterpreterState *interp = tstate->interp;
728
Nick Coghland5cacbb2015-05-23 22:24:10 +1000729 if (def->m_slots) {
Victor Stinner71a35222020-03-26 22:46:14 +0100730 _PyErr_SetString(tstate,
731 PyExc_SystemError,
732 "PyState_RemoveModule called on module with slots");
Nick Coghland5cacbb2015-05-23 22:24:10 +1000733 return -1;
734 }
Victor Stinner71a35222020-03-26 22:46:14 +0100735
736 Py_ssize_t index = def->m_base.m_index;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200737 if (index == 0) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100738 Py_FatalError("invalid module index");
Martin v. Löwis7800f752012-06-22 12:20:55 +0200739 }
Victor Stinner71a35222020-03-26 22:46:14 +0100740 if (interp->modules_by_index == NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100741 Py_FatalError("Interpreters module-list not accessible.");
Martin v. Löwis7800f752012-06-22 12:20:55 +0200742 }
Victor Stinner71a35222020-03-26 22:46:14 +0100743 if (index > PyList_GET_SIZE(interp->modules_by_index)) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100744 Py_FatalError("Module index out of bounds.");
Martin v. Löwis7800f752012-06-22 12:20:55 +0200745 }
Victor Stinner71a35222020-03-26 22:46:14 +0100746
Zackery Spytz2a893432018-12-05 00:14:00 -0700747 Py_INCREF(Py_None);
Victor Stinner71a35222020-03-26 22:46:14 +0100748 return PyList_SetItem(interp->modules_by_index, index, Py_None);
Martin v. Löwis7800f752012-06-22 12:20:55 +0200749}
750
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200751/* Used by PyImport_Cleanup() */
Antoine Pitrou40322e62013-08-11 00:30:09 +0200752void
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200753_PyInterpreterState_ClearModules(PyInterpreterState *interp)
Antoine Pitrou40322e62013-08-11 00:30:09 +0200754{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200755 if (!interp->modules_by_index) {
756 return;
757 }
758
759 Py_ssize_t i;
760 for (i = 0; i < PyList_GET_SIZE(interp->modules_by_index); i++) {
761 PyObject *m = PyList_GET_ITEM(interp->modules_by_index, i);
762 if (PyModule_Check(m)) {
763 /* cleanup the saved copy of module dicts */
764 PyModuleDef *md = PyModule_GetDef(m);
765 if (md) {
766 Py_CLEAR(md->m_base.m_copy);
Antoine Pitrou40322e62013-08-11 00:30:09 +0200767 }
768 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200769 }
770
771 /* Setting modules_by_index to NULL could be dangerous, so we
772 clear the list instead. */
773 if (PyList_SetSlice(interp->modules_by_index,
774 0, PyList_GET_SIZE(interp->modules_by_index),
775 NULL)) {
776 PyErr_WriteUnraisable(interp->modules_by_index);
Antoine Pitrou40322e62013-08-11 00:30:09 +0200777 }
778}
779
Guido van Rossuma027efa1997-05-05 20:56:21 +0000780void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000781PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000782{
Victor Stinnerda7933e2020-04-13 03:04:28 +0200783 int verbose = _PyInterpreterState_GetConfig(tstate->interp)->verbose;
Victor Stinner53b7d4e2018-07-25 01:37:05 +0200784
Victor Stinner5804f872020-03-24 16:32:26 +0100785 if (verbose && tstate->frame != NULL) {
786 /* bpo-20526: After the main thread calls
787 _PyRuntimeState_SetFinalizing() in Py_FinalizeEx(), threads must
788 exit when trying to take the GIL. If a thread exit in the middle of
789 _PyEval_EvalFrameDefault(), tstate->frame is not reset to its
790 previous value. It is more likely with daemon threads, but it can
791 happen with regular threads if threading._shutdown() fails
792 (ex: interrupted by CTRL+C). */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 fprintf(stderr,
794 "PyThreadState_Clear: warning: thread still has a frame\n");
Victor Stinner5804f872020-03-24 16:32:26 +0100795 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000796
Victor Stinner5804f872020-03-24 16:32:26 +0100797 /* Don't clear tstate->frame: it is a borrowed reference */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 Py_CLEAR(tstate->dict);
800 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 Py_CLEAR(tstate->curexc_type);
803 Py_CLEAR(tstate->curexc_value);
804 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000805
Mark Shannonae3087c2017-10-22 22:41:51 +0100806 Py_CLEAR(tstate->exc_state.exc_type);
807 Py_CLEAR(tstate->exc_state.exc_value);
808 Py_CLEAR(tstate->exc_state.exc_traceback);
Serhiy Storchakabdf42982017-10-26 16:59:40 +0300809
Mark Shannonae3087c2017-10-22 22:41:51 +0100810 /* The stack of exception states should contain just this thread. */
Victor Stinner53b7d4e2018-07-25 01:37:05 +0200811 if (verbose && tstate->exc_info != &tstate->exc_state) {
Mark Shannonae3087c2017-10-22 22:41:51 +0100812 fprintf(stderr,
813 "PyThreadState_Clear: warning: thread still has a generator\n");
814 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000815
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 tstate->c_profilefunc = NULL;
817 tstate->c_tracefunc = NULL;
818 Py_CLEAR(tstate->c_profileobj);
819 Py_CLEAR(tstate->c_traceobj);
Yury Selivanov75445082015-05-11 22:57:16 -0400820
Yury Selivanoveb636452016-09-08 22:01:51 -0700821 Py_CLEAR(tstate->async_gen_firstiter);
822 Py_CLEAR(tstate->async_gen_finalizer);
Yury Selivanovf23746a2018-01-22 19:11:18 -0500823
824 Py_CLEAR(tstate->context);
Victor Stinner4d96b462020-02-01 02:30:25 +0100825
826 if (tstate->on_delete != NULL) {
827 tstate->on_delete(tstate->on_delete_data);
828 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000829}
830
831
Joannah Nanjekye8855e472019-10-04 08:35:42 -0300832/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
Guido van Rossum29757862001-01-23 01:46:06 +0000833static void
Victor Stinner9da74302019-11-20 11:17:17 +0100834tstate_delete_common(PyThreadState *tstate,
835 struct _gilstate_runtime_state *gilstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000836{
Victor Stinner3026cad2020-06-01 16:02:40 +0200837 _Py_EnsureTstateNotNULL(tstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200838 PyInterpreterState *interp = tstate->interp;
839 if (interp == NULL) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100840 Py_FatalError("NULL interpreter");
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200841 }
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100842 _PyRuntimeState *runtime = interp->runtime;
843
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200844 HEAD_LOCK(runtime);
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100845 if (tstate->prev) {
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200846 tstate->prev->next = tstate->next;
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100847 }
848 else {
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200849 interp->tstate_head = tstate->next;
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100850 }
851 if (tstate->next) {
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200852 tstate->next->prev = tstate->prev;
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100853 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200854 HEAD_UNLOCK(runtime);
Victor Stinner4d96b462020-02-01 02:30:25 +0100855
Victor Stinner9da74302019-11-20 11:17:17 +0100856 if (gilstate->autoInterpreterState &&
857 PyThread_tss_get(&gilstate->autoTSSkey) == tstate)
858 {
859 PyThread_tss_set(&gilstate->autoTSSkey, NULL);
860 }
861}
862
863
864static void
865_PyThreadState_Delete(PyThreadState *tstate, int check_current)
866{
867 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
868 if (check_current) {
869 if (tstate == _PyRuntimeGILState_GetThreadState(gilstate)) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100870 _Py_FatalErrorFormat(__func__, "tstate %p is still current", tstate);
Victor Stinner9da74302019-11-20 11:17:17 +0100871 }
872 }
873 tstate_delete_common(tstate, gilstate);
Victor Stinner23ef89d2020-03-18 02:26:04 +0100874 PyMem_RawFree(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000875}
876
877
Victor Stinner01b1cc12019-11-20 02:27:56 +0100878void
879PyThreadState_Delete(PyThreadState *tstate)
Guido van Rossum29757862001-01-23 01:46:06 +0000880{
Victor Stinner9da74302019-11-20 11:17:17 +0100881 _PyThreadState_Delete(tstate, 1);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200882}
883
884
Joannah Nanjekye2bc43cd2019-09-05 13:06:49 -0300885void
Victor Stinner23ef89d2020-03-18 02:26:04 +0100886_PyThreadState_DeleteCurrent(PyThreadState *tstate)
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200887{
Victor Stinner3026cad2020-06-01 16:02:40 +0200888 _Py_EnsureTstateNotNULL(tstate);
Victor Stinner23ef89d2020-03-18 02:26:04 +0100889 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
Victor Stinner9da74302019-11-20 11:17:17 +0100890 tstate_delete_common(tstate, gilstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200891 _PyRuntimeGILState_SetThreadState(gilstate, NULL);
Victor Stinner23ef89d2020-03-18 02:26:04 +0100892 _PyEval_ReleaseLock(tstate);
893 PyMem_RawFree(tstate);
Guido van Rossum29757862001-01-23 01:46:06 +0000894}
Guido van Rossum29757862001-01-23 01:46:06 +0000895
Joannah Nanjekye8855e472019-10-04 08:35:42 -0300896void
897PyThreadState_DeleteCurrent(void)
898{
Victor Stinner23ef89d2020-03-18 02:26:04 +0100899 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
900 PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate);
901 _PyThreadState_DeleteCurrent(tstate);
Joannah Nanjekye8855e472019-10-04 08:35:42 -0300902}
903
Guido van Rossum29757862001-01-23 01:46:06 +0000904
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200905/*
906 * Delete all thread states except the one passed as argument.
907 * Note that, if there is a current thread state, it *must* be the one
908 * passed as argument. Also, this won't touch any other interpreters
909 * than the current one, since we don't know which thread state should
Min ho Kim39d87b52019-08-31 06:21:19 +1000910 * be kept in those other interpreters.
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200911 */
912void
Victor Stinner0fd2c302019-06-04 03:15:09 +0200913_PyThreadState_DeleteExcept(_PyRuntimeState *runtime, PyThreadState *tstate)
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200914{
915 PyInterpreterState *interp = tstate->interp;
Victor Stinner9ad58ac2020-03-09 23:37:49 +0100916
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200917 HEAD_LOCK(runtime);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200918 /* Remove all thread states, except tstate, from the linked list of
919 thread states. This will allow calling PyThreadState_Clear()
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200920 without holding the lock. */
Victor Stinner9ad58ac2020-03-09 23:37:49 +0100921 PyThreadState *list = interp->tstate_head;
922 if (list == tstate) {
923 list = tstate->next;
924 }
925 if (tstate->prev) {
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200926 tstate->prev->next = tstate->next;
Victor Stinner9ad58ac2020-03-09 23:37:49 +0100927 }
928 if (tstate->next) {
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200929 tstate->next->prev = tstate->prev;
Victor Stinner9ad58ac2020-03-09 23:37:49 +0100930 }
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200931 tstate->prev = tstate->next = NULL;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200932 interp->tstate_head = tstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200933 HEAD_UNLOCK(runtime);
Victor Stinner9ad58ac2020-03-09 23:37:49 +0100934
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200935 /* Clear and deallocate all stale thread states. Even if this
936 executes Python code, we should be safe since it executes
937 in the current thread, not one of the stale threads. */
Victor Stinner9ad58ac2020-03-09 23:37:49 +0100938 PyThreadState *p, *next;
939 for (p = list; p; p = next) {
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200940 next = p->next;
941 PyThreadState_Clear(p);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200942 PyMem_RawFree(p);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200943 }
944}
945
946
Victor Stinnere838a932020-05-05 19:56:48 +0200947#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
948PyThreadState*
949_PyThreadState_GetTSS(void) {
950 return PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey);
951}
952#endif
953
954
Guido van Rossuma027efa1997-05-05 20:56:21 +0000955PyThreadState *
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100956_PyThreadState_UncheckedGet(void)
957{
Victor Stinner50b48572018-11-01 01:51:40 +0100958 return _PyThreadState_GET();
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100959}
960
961
962PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000963PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000964{
Victor Stinner50b48572018-11-01 01:51:40 +0100965 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner3026cad2020-06-01 16:02:40 +0200966 _Py_EnsureTstateNotNULL(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000968}
969
970
Victor Stinner09532fe2019-05-10 23:39:09 +0200971PyThreadState *
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200972_PyThreadState_Swap(struct _gilstate_runtime_state *gilstate, PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000973{
Victor Stinnere838a932020-05-05 19:56:48 +0200974#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
975 PyThreadState *oldts = _PyThreadState_GetTSS();
976#else
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200977 PyThreadState *oldts = _PyRuntimeGILState_GetThreadState(gilstate);
Victor Stinnere838a932020-05-05 19:56:48 +0200978#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000979
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200980 _PyRuntimeGILState_SetThreadState(gilstate, newts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 /* It should not be possible for more than one thread state
982 to be used for a thread. Check this the best we can in debug
983 builds.
984 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200985#if defined(Py_DEBUG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 if (newts) {
987 /* This can be called from PyEval_RestoreThread(). Similar
988 to it, we need to ensure errno doesn't change.
989 */
990 int err = errno;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200991 PyThreadState *check = _PyGILState_GetThisThreadState(gilstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 if (check && check->interp == newts->interp && check != newts)
993 Py_FatalError("Invalid thread state for this thread");
994 errno = err;
995 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000996#endif
Victor Stinnere838a932020-05-05 19:56:48 +0200997#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
998 PyThread_tss_set(&gilstate->autoTSSkey, newts);
999#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001001}
Guido van Rossumede04391998-04-10 20:18:25 +00001002
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001003PyThreadState *
1004PyThreadState_Swap(PyThreadState *newts)
1005{
1006 return _PyThreadState_Swap(&_PyRuntime.gilstate, newts);
1007}
1008
Guido van Rossumede04391998-04-10 20:18:25 +00001009/* An extension mechanism to store arbitrary additional per-thread state.
1010 PyThreadState_GetDict() returns a dictionary that can be used to hold such
1011 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +00001012 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
1013 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +00001014
1015PyObject *
Victor Stinner0e427c62020-03-25 21:22:55 +01001016_PyThreadState_GetDict(PyThreadState *tstate)
1017{
1018 assert(tstate != NULL);
1019 if (tstate->dict == NULL) {
1020 tstate->dict = PyDict_New();
1021 if (tstate->dict == NULL) {
1022 _PyErr_Clear(tstate);
1023 }
1024 }
1025 return tstate->dict;
1026}
1027
1028
1029PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001030PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +00001031{
Victor Stinner50b48572018-11-01 01:51:40 +01001032 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner0e427c62020-03-25 21:22:55 +01001033 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 }
Victor Stinner0e427c62020-03-25 21:22:55 +01001036 return _PyThreadState_GetDict(tstate);
Guido van Rossumede04391998-04-10 20:18:25 +00001037}
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001038
1039
Victor Stinner8fb02b62020-03-13 23:38:08 +01001040PyInterpreterState *
1041PyThreadState_GetInterpreter(PyThreadState *tstate)
1042{
1043 assert(tstate != NULL);
Victor Stinner8fb02b62020-03-13 23:38:08 +01001044 return tstate->interp;
1045}
1046
1047
Victor Stinner4386b902020-04-29 03:01:43 +02001048PyFrameObject*
Victor Stinnerfd1e1a12020-03-20 15:51:45 +01001049PyThreadState_GetFrame(PyThreadState *tstate)
1050{
1051 assert(tstate != NULL);
Victor Stinner4386b902020-04-29 03:01:43 +02001052 PyFrameObject *frame = tstate->frame;
1053 Py_XINCREF(frame);
1054 return frame;
Victor Stinnerfd1e1a12020-03-20 15:51:45 +01001055}
1056
1057
Victor Stinner5c3cda02020-03-25 21:23:53 +01001058uint64_t
1059PyThreadState_GetID(PyThreadState *tstate)
1060{
1061 assert(tstate != NULL);
1062 return tstate->id;
1063}
1064
1065
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001066/* Asynchronously raise an exception in a thread.
1067 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +00001068 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001069 to call this, or use ctypes. Must be called with the GIL held.
1070 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
1071 match any known thread id). Can be called with exc=NULL to clear an
1072 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001073
1074int
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +02001075PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc)
1076{
Victor Stinner09532fe2019-05-10 23:39:09 +02001077 _PyRuntimeState *runtime = &_PyRuntime;
1078 PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 /* Although the GIL is held, a few C API functions can be called
1081 * without the GIL held, and in particular some that create and
1082 * destroy thread and interpreter states. Those can mutate the
1083 * list of thread states we're traversing, so to prevent that we lock
1084 * head_mutex for the duration.
1085 */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001086 HEAD_LOCK(runtime);
Victor Stinner56bfdeb2020-03-18 09:26:25 +01001087 for (PyThreadState *tstate = interp->tstate_head; tstate != NULL; tstate = tstate->next) {
1088 if (tstate->thread_id != id) {
1089 continue;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 }
Victor Stinner56bfdeb2020-03-18 09:26:25 +01001091
1092 /* Tricky: we need to decref the current value
1093 * (if any) in tstate->async_exc, but that can in turn
1094 * allow arbitrary Python code to run, including
1095 * perhaps calls to this function. To prevent
1096 * deadlock, we need to release head_mutex before
1097 * the decref.
1098 */
1099 PyObject *old_exc = tstate->async_exc;
1100 Py_XINCREF(exc);
1101 tstate->async_exc = exc;
1102 HEAD_UNLOCK(runtime);
1103
1104 Py_XDECREF(old_exc);
1105 _PyEval_SignalAsyncExc(tstate);
1106 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001108 HEAD_UNLOCK(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001110}
1111
1112
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001113/* Routines for advanced debuggers, requested by David Beazley.
1114 Don't use unless you know what you are doing! */
1115
1116PyInterpreterState *
1117PyInterpreterState_Head(void)
1118{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001119 return _PyRuntime.interpreters.head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001120}
1121
1122PyInterpreterState *
Eric Snow6b4be192017-05-22 21:36:03 -07001123PyInterpreterState_Main(void)
1124{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001125 return _PyRuntime.interpreters.main;
Eric Snow6b4be192017-05-22 21:36:03 -07001126}
1127
1128PyInterpreterState *
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001129PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001131}
1132
1133PyThreadState *
1134PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001136}
1137
1138PyThreadState *
1139PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001141}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001142
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001143/* The implementation of sys._current_frames(). This is intended to be
1144 called with the GIL held, as it will be when called via
1145 sys._current_frames(). It's possible it would work fine even without
1146 the GIL held, but haven't thought enough about that.
1147*/
1148PyObject *
1149_PyThread_CurrentFrames(void)
1150{
Victor Stinner71a35222020-03-26 22:46:14 +01001151 PyThreadState *tstate = _PyThreadState_GET();
1152 if (_PySys_Audit(tstate, "sys._current_frames", NULL) < 0) {
Steve Dowerb82e17e2019-05-23 08:45:22 -07001153 return NULL;
1154 }
1155
Victor Stinner71a35222020-03-26 22:46:14 +01001156 PyObject *result = PyDict_New();
1157 if (result == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 return NULL;
Victor Stinner71a35222020-03-26 22:46:14 +01001159 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 /* for i in all interpreters:
1162 * for t in all of i's thread states:
1163 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +02001164 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001165 * need to grab head_mutex for the duration.
1166 */
Victor Stinner71a35222020-03-26 22:46:14 +01001167 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001168 HEAD_LOCK(runtime);
Victor Stinner71a35222020-03-26 22:46:14 +01001169 PyInterpreterState *i;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001170 for (i = runtime->interpreters.head; i != NULL; i = i->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 PyThreadState *t;
1172 for (t = i->tstate_head; t != NULL; t = t->next) {
Victor Stinner4386b902020-04-29 03:01:43 +02001173 PyFrameObject *frame = t->frame;
Victor Stinner71a35222020-03-26 22:46:14 +01001174 if (frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 continue;
Victor Stinner71a35222020-03-26 22:46:14 +01001176 }
1177 PyObject *id = PyLong_FromUnsignedLong(t->thread_id);
1178 if (id == NULL) {
1179 goto fail;
1180 }
1181 int stat = PyDict_SetItem(result, id, (PyObject *)frame);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 Py_DECREF(id);
Victor Stinner71a35222020-03-26 22:46:14 +01001183 if (stat < 0) {
1184 goto fail;
1185 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 }
1187 }
Victor Stinner71a35222020-03-26 22:46:14 +01001188 goto done;
1189
1190fail:
1191 Py_CLEAR(result);
1192
1193done:
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001194 HEAD_UNLOCK(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001196}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001197
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001198/* Python "auto thread state" API. */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001199
1200/* Keep this as a static, as it is not reliable! It can only
1201 ever be compared to the state for the *current* thread.
1202 * If not equal, then it doesn't matter that the actual
1203 value may change immediately after comparison, as it can't
1204 possibly change to the current thread's state.
1205 * If equal, then the current thread holds the lock, so the value can't
1206 change until we yield the lock.
1207*/
1208static int
1209PyThreadState_IsCurrent(PyThreadState *tstate)
1210{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 /* Must be the tstate for this thread */
Victor Stinner0fd2c302019-06-04 03:15:09 +02001212 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001213 assert(_PyGILState_GetThisThreadState(gilstate) == tstate);
1214 return tstate == _PyRuntimeGILState_GetThreadState(gilstate);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001215}
1216
Tim Peters4c1f5ec2004-10-09 17:25:05 +00001217/* Internal initialization/finalization functions called by
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001218 Py_Initialize/Py_FinalizeEx
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001219*/
Victor Stinner4e53abb2020-03-10 23:49:16 +01001220PyStatus
Victor Stinner01b1cc12019-11-20 02:27:56 +01001221_PyGILState_Init(PyThreadState *tstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001222{
Victor Stinnerdda5d6e2020-04-08 17:54:59 +02001223 if (!_Py_IsMainInterpreter(tstate)) {
1224 /* Currently, PyGILState is shared by all interpreters. The main
1225 * interpreter is responsible to initialize it. */
1226 return _PyStatus_OK();
1227 }
1228
Victor Stinner8bb32302019-04-24 16:47:40 +02001229 /* must init with valid states */
Victor Stinner0fd2c302019-06-04 03:15:09 +02001230 assert(tstate != NULL);
Victor Stinnerb45d2592019-06-20 00:05:23 +02001231 assert(tstate->interp != NULL);
Victor Stinner8bb32302019-04-24 16:47:40 +02001232
Victor Stinner01b1cc12019-11-20 02:27:56 +01001233 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
Victor Stinner8bb32302019-04-24 16:47:40 +02001234
1235 if (PyThread_tss_create(&gilstate->autoTSSkey) != 0) {
Victor Stinner4e53abb2020-03-10 23:49:16 +01001236 return _PyStatus_NO_MEMORY();
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001237 }
Victor Stinnerb45d2592019-06-20 00:05:23 +02001238 gilstate->autoInterpreterState = tstate->interp;
Victor Stinner8bb32302019-04-24 16:47:40 +02001239 assert(PyThread_tss_get(&gilstate->autoTSSkey) == NULL);
1240 assert(tstate->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +00001241
Victor Stinner8bb32302019-04-24 16:47:40 +02001242 _PyGILState_NoteThreadState(gilstate, tstate);
Victor Stinner4e53abb2020-03-10 23:49:16 +01001243 return _PyStatus_OK();
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001244}
1245
Victor Stinner861d9ab2016-03-16 22:45:24 +01001246PyInterpreterState *
1247_PyGILState_GetInterpreterStateUnsafe(void)
1248{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001249 return _PyRuntime.gilstate.autoInterpreterState;
Victor Stinner861d9ab2016-03-16 22:45:24 +01001250}
1251
Tim Peters19717fa2004-10-09 17:38:29 +00001252void
Victor Stinner7eee5be2019-11-20 10:38:34 +01001253_PyGILState_Fini(PyThreadState *tstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001254{
Victor Stinner7eee5be2019-11-20 10:38:34 +01001255 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
Victor Stinner8e91c242019-04-24 17:24:01 +02001256 PyThread_tss_delete(&gilstate->autoTSSkey);
1257 gilstate->autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001258}
1259
Victor Stinner26881c82020-06-02 15:51:37 +02001260#ifdef HAVE_FORK
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001261/* Reset the TSS key - called by PyOS_AfterFork_Child().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001262 * This should not be necessary, but some - buggy - pthread implementations
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001263 * don't reset TSS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001264 */
Victor Stinner26881c82020-06-02 15:51:37 +02001265PyStatus
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001266_PyGILState_Reinit(_PyRuntimeState *runtime)
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001267{
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001268 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001269 PyThreadState *tstate = _PyGILState_GetThisThreadState(gilstate);
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001270
1271 PyThread_tss_delete(&gilstate->autoTSSkey);
1272 if (PyThread_tss_create(&gilstate->autoTSSkey) != 0) {
Victor Stinner26881c82020-06-02 15:51:37 +02001273 return _PyStatus_NO_MEMORY();
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001274 }
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001275
Charles-François Natalia233df82011-11-22 19:49:51 +01001276 /* If the thread had an associated auto thread state, reassociate it with
1277 * the new key. */
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001278 if (tstate &&
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001279 PyThread_tss_set(&gilstate->autoTSSkey, (void *)tstate) != 0)
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001280 {
Victor Stinner26881c82020-06-02 15:51:37 +02001281 return _PyStatus_ERR("failed to set autoTSSkey");
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001282 }
Victor Stinner26881c82020-06-02 15:51:37 +02001283 return _PyStatus_OK();
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001284}
Victor Stinner26881c82020-06-02 15:51:37 +02001285#endif
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001286
Michael W. Hudson188d4362005-06-20 16:52:57 +00001287/* When a thread state is created for a thread by some mechanism other than
1288 PyGILState_Ensure, it's important that the GILState machinery knows about
1289 it so it doesn't try to create another thread state for the thread (this is
1290 a better fix for SF bug #1010677 than the first one attempted).
1291*/
Thomas Wouters89f507f2006-12-13 04:49:30 +00001292static void
Victor Stinner8bb32302019-04-24 16:47:40 +02001293_PyGILState_NoteThreadState(struct _gilstate_runtime_state *gilstate, PyThreadState* tstate)
Michael W. Hudson188d4362005-06-20 16:52:57 +00001294{
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001295 /* If autoTSSkey isn't initialized, this must be the very first
Antoine Pitrou079ce542010-09-08 12:37:10 +00001296 threadstate created in Py_Initialize(). Don't do anything for now
1297 (we'll be back here when _PyGILState_Init is called). */
Victor Stinner8bb32302019-04-24 16:47:40 +02001298 if (!gilstate->autoInterpreterState) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 return;
Victor Stinner8bb32302019-04-24 16:47:40 +02001300 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001301
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001302 /* Stick the thread state for this thread in thread specific storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +00001303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 The only situation where you can legitimately have more than one
1305 thread state for an OS level thread is when there are multiple
Victor Stinner590cebe2013-12-13 11:08:56 +01001306 interpreters.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001307
Victor Stinner590cebe2013-12-13 11:08:56 +01001308 You shouldn't really be using the PyGILState_ APIs anyway (see issues
1309 #10915 and #15751).
Michael W. Hudson188d4362005-06-20 16:52:57 +00001310
Victor Stinner590cebe2013-12-13 11:08:56 +01001311 The first thread state created for that given OS level thread will
1312 "win", which seems reasonable behaviour.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 */
Victor Stinner8bb32302019-04-24 16:47:40 +02001314 if (PyThread_tss_get(&gilstate->autoTSSkey) == NULL) {
1315 if ((PyThread_tss_set(&gilstate->autoTSSkey, (void *)tstate)) != 0) {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001316 Py_FatalError("Couldn't create autoTSSkey mapping");
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001317 }
Victor Stinner590cebe2013-12-13 11:08:56 +01001318 }
Michael W. Hudson188d4362005-06-20 16:52:57 +00001319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 /* PyGILState_Release must not try to delete this thread state. */
1321 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +00001322}
1323
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001324/* The public functions */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001325static PyThreadState *
1326_PyGILState_GetThisThreadState(struct _gilstate_runtime_state *gilstate)
1327{
1328 if (gilstate->autoInterpreterState == NULL)
1329 return NULL;
1330 return (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey);
1331}
1332
Tim Peters19717fa2004-10-09 17:38:29 +00001333PyThreadState *
1334PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001335{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001336 return _PyGILState_GetThisThreadState(&_PyRuntime.gilstate);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001337}
1338
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -07001339int
1340PyGILState_Check(void)
1341{
Victor Stinner1c4cbdf2020-04-13 11:45:21 +02001342 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
1343 if (!gilstate->check_enabled) {
Victor Stinner8a1be612016-03-14 22:07:55 +01001344 return 1;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001345 }
Victor Stinner8a1be612016-03-14 22:07:55 +01001346
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001347 if (!PyThread_tss_is_created(&gilstate->autoTSSkey)) {
1348 return 1;
1349 }
Victor Stinner8a1be612016-03-14 22:07:55 +01001350
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001351 PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate);
1352 if (tstate == NULL) {
1353 return 0;
1354 }
1355
1356 return (tstate == _PyGILState_GetThisThreadState(gilstate));
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -07001357}
1358
Tim Peters19717fa2004-10-09 17:38:29 +00001359PyGILState_STATE
1360PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001361{
Victor Stinner175a7042020-03-10 00:37:48 +01001362 _PyRuntimeState *runtime = &_PyRuntime;
1363 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 /* Note that we do not auto-init Python here - apart from
1366 potential races with 2 threads auto-initializing, pep-311
1367 spells out other issues. Embedders are expected to have
Victor Stinner175a7042020-03-10 00:37:48 +01001368 called Py_Initialize(). */
1369
1370 /* Ensure that _PyEval_InitThreads() and _PyGILState_Init() have been
1371 called by Py_Initialize() */
Victor Stinnere838a932020-05-05 19:56:48 +02001372#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
Victor Stinner175a7042020-03-10 00:37:48 +01001373 assert(_PyEval_ThreadsInitialized(runtime));
Victor Stinnere838a932020-05-05 19:56:48 +02001374#endif
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001375 assert(gilstate->autoInterpreterState);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001376
Victor Stinner175a7042020-03-10 00:37:48 +01001377 PyThreadState *tcur = (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey);
1378 int current;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001379 if (tcur == NULL) {
Victor Stinner175a7042020-03-10 00:37:48 +01001380 /* Create a new Python thread state for this thread */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001381 tcur = PyThreadState_New(gilstate->autoInterpreterState);
Victor Stinner175a7042020-03-10 00:37:48 +01001382 if (tcur == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 Py_FatalError("Couldn't create thread-state for new thread");
Victor Stinner175a7042020-03-10 00:37:48 +01001384 }
1385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 /* This is our thread state! We'll need to delete it in the
1387 matching call to PyGILState_Release(). */
1388 tcur->gilstate_counter = 0;
1389 current = 0; /* new thread state is never current */
1390 }
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001391 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 current = PyThreadState_IsCurrent(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001393 }
1394
1395 if (current == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 PyEval_RestoreThread(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001397 }
1398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 /* Update our counter in the thread-state - no need for locks:
1400 - tcur will remain valid as we hold the GIL.
1401 - the counter is safe as we are the only thread "allowed"
1402 to modify this value
1403 */
1404 ++tcur->gilstate_counter;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001407}
1408
Tim Peters19717fa2004-10-09 17:38:29 +00001409void
1410PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001411{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001412 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner23ef89d2020-03-18 02:26:04 +01001413 PyThreadState *tstate = PyThread_tss_get(&runtime->gilstate.autoTSSkey);
1414 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 Py_FatalError("auto-releasing thread-state, "
1416 "but no thread-state for this thread");
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001417 }
1418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419 /* We must hold the GIL and have our thread state current */
1420 /* XXX - remove the check - the assert should be fine,
1421 but while this is very new (April 2003), the extra check
1422 by release-only users can't hurt.
1423 */
Victor Stinner23ef89d2020-03-18 02:26:04 +01001424 if (!PyThreadState_IsCurrent(tstate)) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +01001425 _Py_FatalErrorFormat(__func__,
1426 "thread state %p must be current when releasing",
1427 tstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001428 }
Victor Stinner23ef89d2020-03-18 02:26:04 +01001429 assert(PyThreadState_IsCurrent(tstate));
1430 --tstate->gilstate_counter;
1431 assert(tstate->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 /* If we're going to destroy this thread-state, we must
1434 * clear it while the GIL is held, as destructors may run.
1435 */
Victor Stinner23ef89d2020-03-18 02:26:04 +01001436 if (tstate->gilstate_counter == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 /* can't have been locked when we created it */
1438 assert(oldstate == PyGILState_UNLOCKED);
Victor Stinner23ef89d2020-03-18 02:26:04 +01001439 PyThreadState_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001440 /* Delete the thread-state. Note this releases the GIL too!
1441 * It's vital that the GIL be held here, to avoid shutdown
1442 * races; see bugs 225673 and 1061968 (that nasty bug has a
1443 * habit of coming back).
1444 */
Victor Stinner23ef89d2020-03-18 02:26:04 +01001445 assert(_PyRuntimeGILState_GetThreadState(&runtime->gilstate) == tstate);
1446 _PyThreadState_DeleteCurrent(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001447 }
1448 /* Release the lock if necessary */
1449 else if (oldstate == PyGILState_UNLOCKED)
1450 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001451}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001452
Benjamin Peterson3bf01752012-04-13 18:06:36 -04001453
Eric Snow7f8bfc92018-01-29 18:23:44 -07001454/**************************/
1455/* cross-interpreter data */
1456/**************************/
1457
1458/* cross-interpreter data */
1459
1460crossinterpdatafunc _PyCrossInterpreterData_Lookup(PyObject *);
1461
1462/* This is a separate func from _PyCrossInterpreterData_Lookup in order
1463 to keep the registry code separate. */
1464static crossinterpdatafunc
1465_lookup_getdata(PyObject *obj)
1466{
1467 crossinterpdatafunc getdata = _PyCrossInterpreterData_Lookup(obj);
1468 if (getdata == NULL && PyErr_Occurred() == 0)
1469 PyErr_Format(PyExc_ValueError,
1470 "%S does not support cross-interpreter data", obj);
1471 return getdata;
1472}
1473
1474int
1475_PyObject_CheckCrossInterpreterData(PyObject *obj)
1476{
1477 crossinterpdatafunc getdata = _lookup_getdata(obj);
1478 if (getdata == NULL) {
1479 return -1;
1480 }
1481 return 0;
1482}
1483
1484static int
Victor Stinner71a35222020-03-26 22:46:14 +01001485_check_xidata(PyThreadState *tstate, _PyCrossInterpreterData *data)
Eric Snow7f8bfc92018-01-29 18:23:44 -07001486{
1487 // data->data can be anything, including NULL, so we don't check it.
1488
1489 // data->obj may be NULL, so we don't check it.
1490
1491 if (data->interp < 0) {
Victor Stinner71a35222020-03-26 22:46:14 +01001492 _PyErr_SetString(tstate, PyExc_SystemError, "missing interp");
Eric Snow7f8bfc92018-01-29 18:23:44 -07001493 return -1;
1494 }
1495
1496 if (data->new_object == NULL) {
Victor Stinner71a35222020-03-26 22:46:14 +01001497 _PyErr_SetString(tstate, PyExc_SystemError, "missing new_object func");
Eric Snow7f8bfc92018-01-29 18:23:44 -07001498 return -1;
1499 }
1500
1501 // data->free may be NULL, so we don't check it.
1502
1503 return 0;
1504}
1505
1506int
1507_PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data)
1508{
Victor Stinner71a35222020-03-26 22:46:14 +01001509 // PyThreadState_Get() aborts if tstate is NULL.
1510 PyThreadState *tstate = PyThreadState_Get();
1511 PyInterpreterState *interp = tstate->interp;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001512
1513 // Reset data before re-populating.
1514 *data = (_PyCrossInterpreterData){0};
1515 data->free = PyMem_RawFree; // Set a default that may be overridden.
1516
1517 // Call the "getdata" func for the object.
1518 Py_INCREF(obj);
1519 crossinterpdatafunc getdata = _lookup_getdata(obj);
1520 if (getdata == NULL) {
1521 Py_DECREF(obj);
1522 return -1;
1523 }
1524 int res = getdata(obj, data);
1525 Py_DECREF(obj);
1526 if (res != 0) {
1527 return -1;
1528 }
1529
1530 // Fill in the blanks and validate the result.
Eric Snow7f8bfc92018-01-29 18:23:44 -07001531 data->interp = interp->id;
Victor Stinner71a35222020-03-26 22:46:14 +01001532 if (_check_xidata(tstate, data) != 0) {
Eric Snow7f8bfc92018-01-29 18:23:44 -07001533 _PyCrossInterpreterData_Release(data);
1534 return -1;
1535 }
1536
1537 return 0;
1538}
1539
Victor Stinnere225beb2019-06-03 18:14:24 +02001540static void
Eric Snow63799132018-06-01 18:45:20 -06001541_release_xidata(void *arg)
1542{
1543 _PyCrossInterpreterData *data = (_PyCrossInterpreterData *)arg;
1544 if (data->free != NULL) {
1545 data->free(data->data);
1546 }
1547 Py_XDECREF(data->obj);
Victor Stinnere225beb2019-06-03 18:14:24 +02001548}
1549
1550static void
1551_call_in_interpreter(struct _gilstate_runtime_state *gilstate,
1552 PyInterpreterState *interp,
1553 void (*func)(void *), void *arg)
1554{
1555 /* We would use Py_AddPendingCall() if it weren't specific to the
1556 * main interpreter (see bpo-33608). In the meantime we take a
1557 * naive approach.
1558 */
1559 PyThreadState *save_tstate = NULL;
1560 if (interp != _PyRuntimeGILState_GetThreadState(gilstate)->interp) {
1561 // XXX Using the "head" thread isn't strictly correct.
1562 PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
1563 // XXX Possible GILState issues?
1564 save_tstate = _PyThreadState_Swap(gilstate, tstate);
1565 }
1566
1567 func(arg);
1568
1569 // Switch back.
1570 if (save_tstate != NULL) {
1571 _PyThreadState_Swap(gilstate, save_tstate);
1572 }
Eric Snow63799132018-06-01 18:45:20 -06001573}
1574
Eric Snow7f8bfc92018-01-29 18:23:44 -07001575void
1576_PyCrossInterpreterData_Release(_PyCrossInterpreterData *data)
1577{
1578 if (data->data == NULL && data->obj == NULL) {
1579 // Nothing to release!
1580 return;
1581 }
1582
Victor Stinnere225beb2019-06-03 18:14:24 +02001583 // Switch to the original interpreter.
Eric Snow7f8bfc92018-01-29 18:23:44 -07001584 PyInterpreterState *interp = _PyInterpreterState_LookUpID(data->interp);
1585 if (interp == NULL) {
Min ho Kimc4cacc82019-07-31 08:16:13 +10001586 // The interpreter was already destroyed.
Eric Snow7f8bfc92018-01-29 18:23:44 -07001587 if (data->free != NULL) {
1588 // XXX Someone leaked some memory...
1589 }
1590 return;
1591 }
Eric Snowf53d9f22018-02-20 16:30:17 -07001592
Eric Snow7f8bfc92018-01-29 18:23:44 -07001593 // "Release" the data and/or the object.
Victor Stinnere225beb2019-06-03 18:14:24 +02001594 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
1595 _call_in_interpreter(gilstate, interp, _release_xidata, data);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001596}
1597
1598PyObject *
1599_PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *data)
1600{
1601 return data->new_object(data);
1602}
1603
1604/* registry of {type -> crossinterpdatafunc} */
1605
1606/* For now we use a global registry of shareable classes. An
1607 alternative would be to add a tp_* slot for a class's
1608 crossinterpdatafunc. It would be simpler and more efficient. */
1609
1610static int
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001611_register_xidata(struct _xidregistry *xidregistry, PyTypeObject *cls,
1612 crossinterpdatafunc getdata)
Eric Snow7f8bfc92018-01-29 18:23:44 -07001613{
1614 // Note that we effectively replace already registered classes
1615 // rather than failing.
1616 struct _xidregitem *newhead = PyMem_RawMalloc(sizeof(struct _xidregitem));
1617 if (newhead == NULL)
1618 return -1;
1619 newhead->cls = cls;
1620 newhead->getdata = getdata;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001621 newhead->next = xidregistry->head;
1622 xidregistry->head = newhead;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001623 return 0;
1624}
1625
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001626static void _register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001627
1628int
Eric Snowc11183c2019-03-15 16:35:46 -06001629_PyCrossInterpreterData_RegisterClass(PyTypeObject *cls,
Eric Snow7f8bfc92018-01-29 18:23:44 -07001630 crossinterpdatafunc getdata)
1631{
1632 if (!PyType_Check(cls)) {
1633 PyErr_Format(PyExc_ValueError, "only classes may be registered");
1634 return -1;
1635 }
1636 if (getdata == NULL) {
1637 PyErr_Format(PyExc_ValueError, "missing 'getdata' func");
1638 return -1;
1639 }
1640
1641 // Make sure the class isn't ever deallocated.
1642 Py_INCREF((PyObject *)cls);
1643
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001644 struct _xidregistry *xidregistry = &_PyRuntime.xidregistry ;
1645 PyThread_acquire_lock(xidregistry->mutex, WAIT_LOCK);
1646 if (xidregistry->head == NULL) {
1647 _register_builtins_for_crossinterpreter_data(xidregistry);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001648 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001649 int res = _register_xidata(xidregistry, cls, getdata);
1650 PyThread_release_lock(xidregistry->mutex);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001651 return res;
1652}
1653
Eric Snow6d2cd902018-05-16 15:04:57 -04001654/* Cross-interpreter objects are looked up by exact match on the class.
1655 We can reassess this policy when we move from a global registry to a
1656 tp_* slot. */
1657
Eric Snow7f8bfc92018-01-29 18:23:44 -07001658crossinterpdatafunc
1659_PyCrossInterpreterData_Lookup(PyObject *obj)
1660{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001661 struct _xidregistry *xidregistry = &_PyRuntime.xidregistry ;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001662 PyObject *cls = PyObject_Type(obj);
1663 crossinterpdatafunc getdata = NULL;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001664 PyThread_acquire_lock(xidregistry->mutex, WAIT_LOCK);
1665 struct _xidregitem *cur = xidregistry->head;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001666 if (cur == NULL) {
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001667 _register_builtins_for_crossinterpreter_data(xidregistry);
1668 cur = xidregistry->head;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001669 }
1670 for(; cur != NULL; cur = cur->next) {
1671 if (cur->cls == (PyTypeObject *)cls) {
1672 getdata = cur->getdata;
1673 break;
1674 }
1675 }
Eric Snow4e9da0d2018-02-02 21:49:49 -07001676 Py_DECREF(cls);
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001677 PyThread_release_lock(xidregistry->mutex);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001678 return getdata;
1679}
1680
1681/* cross-interpreter data for builtin types */
1682
Eric Snow6d2cd902018-05-16 15:04:57 -04001683struct _shared_bytes_data {
1684 char *bytes;
1685 Py_ssize_t len;
1686};
1687
Eric Snow7f8bfc92018-01-29 18:23:44 -07001688static PyObject *
1689_new_bytes_object(_PyCrossInterpreterData *data)
1690{
Eric Snow6d2cd902018-05-16 15:04:57 -04001691 struct _shared_bytes_data *shared = (struct _shared_bytes_data *)(data->data);
1692 return PyBytes_FromStringAndSize(shared->bytes, shared->len);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001693}
1694
1695static int
1696_bytes_shared(PyObject *obj, _PyCrossInterpreterData *data)
1697{
Eric Snow6d2cd902018-05-16 15:04:57 -04001698 struct _shared_bytes_data *shared = PyMem_NEW(struct _shared_bytes_data, 1);
1699 if (PyBytes_AsStringAndSize(obj, &shared->bytes, &shared->len) < 0) {
1700 return -1;
1701 }
1702 data->data = (void *)shared;
Eric Snow63799132018-06-01 18:45:20 -06001703 Py_INCREF(obj);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001704 data->obj = obj; // Will be "released" (decref'ed) when data released.
1705 data->new_object = _new_bytes_object;
Eric Snow6d2cd902018-05-16 15:04:57 -04001706 data->free = PyMem_Free;
1707 return 0;
1708}
1709
1710struct _shared_str_data {
1711 int kind;
1712 const void *buffer;
1713 Py_ssize_t len;
1714};
1715
1716static PyObject *
1717_new_str_object(_PyCrossInterpreterData *data)
1718{
1719 struct _shared_str_data *shared = (struct _shared_str_data *)(data->data);
1720 return PyUnicode_FromKindAndData(shared->kind, shared->buffer, shared->len);
1721}
1722
1723static int
1724_str_shared(PyObject *obj, _PyCrossInterpreterData *data)
1725{
1726 struct _shared_str_data *shared = PyMem_NEW(struct _shared_str_data, 1);
1727 shared->kind = PyUnicode_KIND(obj);
1728 shared->buffer = PyUnicode_DATA(obj);
An Long29c11722020-06-13 20:26:01 +08001729 shared->len = PyUnicode_GET_LENGTH(obj);
Eric Snow6d2cd902018-05-16 15:04:57 -04001730 data->data = (void *)shared;
Eric Snow63799132018-06-01 18:45:20 -06001731 Py_INCREF(obj);
Eric Snow6d2cd902018-05-16 15:04:57 -04001732 data->obj = obj; // Will be "released" (decref'ed) when data released.
1733 data->new_object = _new_str_object;
1734 data->free = PyMem_Free;
1735 return 0;
1736}
1737
1738static PyObject *
1739_new_long_object(_PyCrossInterpreterData *data)
1740{
Alexey Izbyshev16f842d2019-02-12 19:06:43 +03001741 return PyLong_FromSsize_t((Py_ssize_t)(data->data));
Eric Snow6d2cd902018-05-16 15:04:57 -04001742}
1743
1744static int
1745_long_shared(PyObject *obj, _PyCrossInterpreterData *data)
1746{
Alexey Izbyshev16f842d2019-02-12 19:06:43 +03001747 /* Note that this means the size of shareable ints is bounded by
1748 * sys.maxsize. Hence on 32-bit architectures that is half the
1749 * size of maximum shareable ints on 64-bit.
1750 */
1751 Py_ssize_t value = PyLong_AsSsize_t(obj);
Eric Snow6d2cd902018-05-16 15:04:57 -04001752 if (value == -1 && PyErr_Occurred()) {
1753 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1754 PyErr_SetString(PyExc_OverflowError, "try sending as bytes");
1755 }
1756 return -1;
1757 }
1758 data->data = (void *)value;
1759 data->obj = NULL;
1760 data->new_object = _new_long_object;
1761 data->free = NULL;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001762 return 0;
1763}
1764
1765static PyObject *
1766_new_none_object(_PyCrossInterpreterData *data)
1767{
1768 // XXX Singleton refcounts are problematic across interpreters...
1769 Py_INCREF(Py_None);
1770 return Py_None;
1771}
1772
1773static int
1774_none_shared(PyObject *obj, _PyCrossInterpreterData *data)
1775{
1776 data->data = NULL;
1777 // data->obj remains NULL
1778 data->new_object = _new_none_object;
1779 data->free = NULL; // There is nothing to free.
1780 return 0;
1781}
1782
1783static void
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001784_register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry)
Eric Snow7f8bfc92018-01-29 18:23:44 -07001785{
1786 // None
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001787 if (_register_xidata(xidregistry, (PyTypeObject *)PyObject_Type(Py_None), _none_shared) != 0) {
Eric Snow7f8bfc92018-01-29 18:23:44 -07001788 Py_FatalError("could not register None for cross-interpreter sharing");
1789 }
1790
Eric Snow6d2cd902018-05-16 15:04:57 -04001791 // int
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001792 if (_register_xidata(xidregistry, &PyLong_Type, _long_shared) != 0) {
Eric Snow6d2cd902018-05-16 15:04:57 -04001793 Py_FatalError("could not register int for cross-interpreter sharing");
1794 }
1795
Eric Snow7f8bfc92018-01-29 18:23:44 -07001796 // bytes
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001797 if (_register_xidata(xidregistry, &PyBytes_Type, _bytes_shared) != 0) {
Eric Snow7f8bfc92018-01-29 18:23:44 -07001798 Py_FatalError("could not register bytes for cross-interpreter sharing");
1799 }
Eric Snow6d2cd902018-05-16 15:04:57 -04001800
1801 // str
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001802 if (_register_xidata(xidregistry, &PyUnicode_Type, _str_shared) != 0) {
Eric Snow6d2cd902018-05-16 15:04:57 -04001803 Py_FatalError("could not register str for cross-interpreter sharing");
1804 }
Eric Snow7f8bfc92018-01-29 18:23:44 -07001805}
1806
1807
Victor Stinner0b72b232020-03-12 23:18:39 +01001808_PyFrameEvalFunction
1809_PyInterpreterState_GetEvalFrameFunc(PyInterpreterState *interp)
1810{
1811 return interp->eval_frame;
1812}
1813
1814
1815void
1816_PyInterpreterState_SetEvalFrameFunc(PyInterpreterState *interp,
1817 _PyFrameEvalFunction eval_frame)
1818{
1819 interp->eval_frame = eval_frame;
1820}
1821
Victor Stinnerda7933e2020-04-13 03:04:28 +02001822
1823const PyConfig*
1824_PyInterpreterState_GetConfig(PyInterpreterState *interp)
1825{
1826 return &interp->config;
1827}
1828
1829
1830PyStatus
1831_PyInterpreterState_SetConfig(PyInterpreterState *interp,
1832 const PyConfig *config)
1833{
1834 return _PyConfig_Copy(&interp->config, config);
1835}
1836
1837
1838const PyConfig*
1839_Py_GetConfig(void)
1840{
1841 assert(PyGILState_Check());
1842 PyThreadState *tstate = _PyThreadState_GET();
1843 return _PyInterpreterState_GetConfig(tstate->interp);
1844}
1845
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001846#ifdef __cplusplus
1847}
1848#endif