blob: 2b84c168bf752a2db68c353bd7d8610c96afbf4e [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 Stinner621cebe2018-11-12 16:53:38 +01009#include "pycore_pymem.h"
10#include "pycore_pystate.h"
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
Victor Stinner23ef89d2020-03-18 02:26:04 +010042static void
43ensure_tstate_not_null(const char *func, PyThreadState *tstate)
44{
45 if (tstate == NULL) {
46 _Py_FatalErrorFunc(func,
47 "current thread state is NULL (released GIL?)");
48 }
49}
50
51
Victor Stinner10c8e6a2019-04-26 01:53:18 +020052/* Forward declarations */
53static PyThreadState *_PyGILState_GetThisThreadState(struct _gilstate_runtime_state *gilstate);
Victor Stinner9da74302019-11-20 11:17:17 +010054static void _PyThreadState_Delete(PyThreadState *tstate, int check_current);
Victor Stinner10c8e6a2019-04-26 01:53:18 +020055
56
Victor Stinner331a6a52019-05-27 16:39:22 +020057static PyStatus
Victor Stinner5d39e042017-11-29 17:20:38 +010058_PyRuntimeState_Init_impl(_PyRuntimeState *runtime)
Eric Snow2ebc5ce2017-09-07 23:51:28 -060059{
Steve Dowerb82e17e2019-05-23 08:45:22 -070060 /* We preserve the hook across init, because there is
61 currently no public API to set it between runtime
62 initialization and interpreter initialization. */
63 void *open_code_hook = runtime->open_code_hook;
64 void *open_code_userdata = runtime->open_code_userdata;
65 _Py_AuditHookEntry *audit_hook_head = runtime->audit_hook_head;
66
Eric Snow2ebc5ce2017-09-07 23:51:28 -060067 memset(runtime, 0, sizeof(*runtime));
Victor Stinner8a1be612016-03-14 22:07:55 +010068
Steve Dowerb82e17e2019-05-23 08:45:22 -070069 runtime->open_code_hook = open_code_hook;
70 runtime->open_code_userdata = open_code_userdata;
71 runtime->audit_hook_head = audit_hook_head;
72
Victor Stinnerdab84232020-03-17 18:56:44 +010073 _PyEval_InitRuntimeState(&runtime->ceval);
Victor Stinner441b10c2019-09-28 04:28:35 +020074
Victor Stinner3c30a762019-10-01 10:56:37 +020075 PyPreConfig_InitPythonConfig(&runtime->preconfig);
Michael W. Hudson188d4362005-06-20 16:52:57 +000076
Eric Snow2ebc5ce2017-09-07 23:51:28 -060077 runtime->gilstate.check_enabled = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -080078
Masayuki Yamamoto731e1892017-10-06 19:41:34 +090079 /* A TSS key must be initialized with Py_tss_NEEDS_INIT
80 in accordance with the specification. */
Victor Stinnerf7e5b562017-11-15 15:48:08 -080081 Py_tss_t initial = Py_tss_NEEDS_INIT;
82 runtime->gilstate.autoTSSkey = initial;
Guido van Rossum1d5ad901999-06-18 14:22:24 +000083
Eric Snow2ebc5ce2017-09-07 23:51:28 -060084 runtime->interpreters.mutex = PyThread_allocate_lock();
Victor Stinnerf7e5b562017-11-15 15:48:08 -080085 if (runtime->interpreters.mutex == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +020086 return _PyStatus_ERR("Can't initialize threads for interpreter");
Victor Stinnerf7e5b562017-11-15 15:48:08 -080087 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -060088 runtime->interpreters.next_id = -1;
Eric Snow7f8bfc92018-01-29 18:23:44 -070089
90 runtime->xidregistry.mutex = PyThread_allocate_lock();
91 if (runtime->xidregistry.mutex == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +020092 return _PyStatus_ERR("Can't initialize threads for cross-interpreter data registry");
Eric Snow7f8bfc92018-01-29 18:23:44 -070093 }
94
Eric Snow8479a342019-03-08 23:44:33 -070095 // Set it to the ID of the main thread of the main interpreter.
96 runtime->main_thread = PyThread_get_thread_ident();
Eric Snow5be45a62019-03-08 22:47:07 -070097
Victor Stinner331a6a52019-05-27 16:39:22 +020098 return _PyStatus_OK();
Eric Snow2ebc5ce2017-09-07 23:51:28 -060099}
Eric Snow05351c12017-09-05 21:43:08 -0700100
Victor Stinner331a6a52019-05-27 16:39:22 +0200101PyStatus
Victor Stinner5d39e042017-11-29 17:20:38 +0100102_PyRuntimeState_Init(_PyRuntimeState *runtime)
103{
104 /* Force default allocator, since _PyRuntimeState_Fini() must
105 use the same allocator than this function. */
106 PyMemAllocatorEx old_alloc;
107 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
108
Victor Stinner331a6a52019-05-27 16:39:22 +0200109 PyStatus status = _PyRuntimeState_Init_impl(runtime);
Victor Stinner5d39e042017-11-29 17:20:38 +0100110
111 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinner331a6a52019-05-27 16:39:22 +0200112 return status;
Victor Stinner5d39e042017-11-29 17:20:38 +0100113}
114
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600115void
116_PyRuntimeState_Fini(_PyRuntimeState *runtime)
117{
Victor Stinner5d39e042017-11-29 17:20:38 +0100118 /* Force the allocator used by _PyRuntimeState_Init(). */
119 PyMemAllocatorEx old_alloc;
120 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinnerccb04422017-11-16 03:20:31 -0800121
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600122 if (runtime->interpreters.mutex != NULL) {
123 PyThread_free_lock(runtime->interpreters.mutex);
124 runtime->interpreters.mutex = NULL;
125 }
Victor Stinnerccb04422017-11-16 03:20:31 -0800126
Stéphane Wirtel943395f2019-03-19 11:51:32 +0100127 if (runtime->xidregistry.mutex != NULL) {
128 PyThread_free_lock(runtime->xidregistry.mutex);
129 runtime->xidregistry.mutex = NULL;
130 }
131
Victor Stinnerccb04422017-11-16 03:20:31 -0800132 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600133}
134
Eric Snow8479a342019-03-08 23:44:33 -0700135/* This function is called from PyOS_AfterFork_Child to ensure that
136 * newly created child processes do not share locks with the parent.
137 */
138
139void
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200140_PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime)
Eric Snow8479a342019-03-08 23:44:33 -0700141{
142 // This was initially set in _PyRuntimeState_Init().
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200143 runtime->main_thread = PyThread_get_thread_ident();
Eric Snow8479a342019-03-08 23:44:33 -0700144
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200145 /* Force default allocator, since _PyRuntimeState_Fini() must
146 use the same allocator than this function. */
147 PyMemAllocatorEx old_alloc;
148 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
149
150 runtime->interpreters.mutex = PyThread_allocate_lock();
151 runtime->interpreters.main->id_mutex = PyThread_allocate_lock();
152 runtime->xidregistry.mutex = PyThread_allocate_lock();
153
154 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
155
156 if (runtime->interpreters.mutex == NULL) {
Eric Snow8479a342019-03-08 23:44:33 -0700157 Py_FatalError("Can't initialize lock for runtime interpreters");
158 }
159
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200160 if (runtime->interpreters.main->id_mutex == NULL) {
Eric Snow8479a342019-03-08 23:44:33 -0700161 Py_FatalError("Can't initialize ID lock for main interpreter");
162 }
163
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200164 if (runtime->xidregistry.mutex == NULL) {
Eric Snow8479a342019-03-08 23:44:33 -0700165 Py_FatalError("Can't initialize lock for cross-interpreter data registry");
166 }
167}
168
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200169#define HEAD_LOCK(runtime) \
170 PyThread_acquire_lock((runtime)->interpreters.mutex, WAIT_LOCK)
171#define HEAD_UNLOCK(runtime) \
172 PyThread_release_lock((runtime)->interpreters.mutex)
Eric Snow05351c12017-09-05 21:43:08 -0700173
Victor Stinner8bb32302019-04-24 16:47:40 +0200174/* Forward declaration */
175static void _PyGILState_NoteThreadState(
176 struct _gilstate_runtime_state *gilstate, PyThreadState* tstate);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000177
Victor Stinner331a6a52019-05-27 16:39:22 +0200178PyStatus
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600179_PyInterpreterState_Enable(_PyRuntimeState *runtime)
Eric Snowe3774162017-05-22 19:46:40 -0700180{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200181 struct pyinterpreters *interpreters = &runtime->interpreters;
182 interpreters->next_id = 0;
Victor Stinner5d926472018-03-06 14:31:37 +0100183
184 /* Py_Finalize() calls _PyRuntimeState_Fini() which clears the mutex.
185 Create a new mutex if needed. */
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200186 if (interpreters->mutex == NULL) {
Victor Stinner5d926472018-03-06 14:31:37 +0100187 /* Force default allocator, since _PyRuntimeState_Fini() must
188 use the same allocator than this function. */
189 PyMemAllocatorEx old_alloc;
190 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
191
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200192 interpreters->mutex = PyThread_allocate_lock();
Victor Stinner5d926472018-03-06 14:31:37 +0100193
194 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
195
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200196 if (interpreters->mutex == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +0200197 return _PyStatus_ERR("Can't initialize threads for interpreter");
Victor Stinnera7368ac2017-11-15 18:11:45 -0800198 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600199 }
Victor Stinner5d926472018-03-06 14:31:37 +0100200
Victor Stinner331a6a52019-05-27 16:39:22 +0200201 return _PyStatus_OK();
Eric Snowe3774162017-05-22 19:46:40 -0700202}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000203
204PyInterpreterState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000205PyInterpreterState_New(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000206{
Victor Stinner71a35222020-03-26 22:46:14 +0100207 PyThreadState *tstate = _PyThreadState_GET();
208 /* tstate is NULL when Py_InitializeFromConfig() calls
209 PyInterpreterState_New() to create the main interpreter. */
210 if (_PySys_Audit(tstate, "cpython.PyInterpreterState_New", NULL) < 0) {
Steve Dowerb82e17e2019-05-23 08:45:22 -0700211 return NULL;
212 }
213
Andy Lester7668a8b2020-03-24 23:26:44 -0500214 PyInterpreterState *interp = PyMem_RawCalloc(1, sizeof(PyInterpreterState));
Victor Stinnerd4341102017-11-23 00:12:09 +0100215 if (interp == NULL) {
216 return NULL;
217 }
218
Eric Snow4c6955e2018-02-16 18:53:40 -0700219 interp->id_refcount = -1;
Victor Stinner022be022019-05-22 23:58:50 +0200220
Victor Stinner71a35222020-03-26 22:46:14 +0100221 /* Don't get runtime from tstate since tstate can be NULL */
Victor Stinner01b1cc12019-11-20 02:27:56 +0100222 _PyRuntimeState *runtime = &_PyRuntime;
223 interp->runtime = runtime;
224
Victor Stinnerdab84232020-03-17 18:56:44 +0100225 _PyEval_InitState(&interp->ceval);
Victor Stinner72474072019-11-20 12:25:50 +0100226 _PyGC_InitState(&interp->gc);
Victor Stinner8462a492019-10-01 12:06:16 +0200227 PyConfig_InitPythonConfig(&interp->config);
Victor Stinner022be022019-05-22 23:58:50 +0200228
Victor Stinnerd4341102017-11-23 00:12:09 +0100229 interp->eval_frame = _PyEval_EvalFrameDefault;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000230#ifdef HAVE_DLOPEN
Serhiy Storchakac2f7d872016-05-04 09:44:44 +0300231#if HAVE_DECL_RTLD_NOW
Victor Stinnerd4341102017-11-23 00:12:09 +0100232 interp->dlopenflags = RTLD_NOW;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000233#else
Victor Stinnerd4341102017-11-23 00:12:09 +0100234 interp->dlopenflags = RTLD_LAZY;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000235#endif
236#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000237
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200238 struct pyinterpreters *interpreters = &runtime->interpreters;
239
240 HEAD_LOCK(runtime);
241 if (interpreters->next_id < 0) {
Victor Stinnerd4341102017-11-23 00:12:09 +0100242 /* overflow or Py_Initialize() not called! */
Victor Stinner71a35222020-03-26 22:46:14 +0100243 if (tstate != NULL) {
244 _PyErr_SetString(tstate, PyExc_RuntimeError,
245 "failed to get an interpreter ID");
246 }
Pablo Galindo95d630e2018-08-31 22:49:29 +0100247 PyMem_RawFree(interp);
Victor Stinnerd4341102017-11-23 00:12:09 +0100248 interp = NULL;
Victor Stinnerd4341102017-11-23 00:12:09 +0100249 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200250 else {
251 interp->id = interpreters->next_id;
252 interpreters->next_id += 1;
253 interp->next = interpreters->head;
254 if (interpreters->main == NULL) {
255 interpreters->main = interp;
256 }
257 interpreters->head = interp;
258 }
259 HEAD_UNLOCK(runtime);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000260
Pablo Galindo95d630e2018-08-31 22:49:29 +0100261 if (interp == NULL) {
262 return NULL;
263 }
264
Yury Selivanovf23746a2018-01-22 19:11:18 -0500265 interp->tstate_next_unique_id = 0;
266
Steve Dowerb82e17e2019-05-23 08:45:22 -0700267 interp->audit_hooks = NULL;
268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000269 return interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000270}
271
272
Victor Stinner01b1cc12019-11-20 02:27:56 +0100273void
274PyInterpreterState_Clear(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000275{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100276 _PyRuntimeState *runtime = interp->runtime;
277
Victor Stinner71a35222020-03-26 22:46:14 +0100278 /* Use the current Python thread state to call audit hooks,
279 not the current Python thread state of 'interp'. */
280 PyThreadState *tstate = _PyThreadState_GET();
281 if (_PySys_Audit(tstate, "cpython.PyInterpreterState_Clear", NULL) < 0) {
282 _PyErr_Clear(tstate);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700283 }
284
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200285 HEAD_LOCK(runtime);
286 for (PyThreadState *p = interp->tstate_head; p != NULL; p = p->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 PyThreadState_Clear(p);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200288 }
289 HEAD_UNLOCK(runtime);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700290
291 Py_CLEAR(interp->audit_hooks);
292
Victor Stinner331a6a52019-05-27 16:39:22 +0200293 PyConfig_Clear(&interp->config);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 Py_CLEAR(interp->codec_search_path);
295 Py_CLEAR(interp->codec_search_cache);
296 Py_CLEAR(interp->codec_error_registry);
Eric Snow93c92f72017-09-13 23:46:04 -0700297 Py_CLEAR(interp->modules);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 Py_CLEAR(interp->modules_by_index);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 Py_CLEAR(interp->sysdict);
300 Py_CLEAR(interp->builtins);
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200301 Py_CLEAR(interp->builtins_copy);
Brett Cannonfd074152012-04-14 14:10:13 -0400302 Py_CLEAR(interp->importlib);
Serhiy Storchaka133138a2016-08-02 22:51:21 +0300303 Py_CLEAR(interp->import_func);
Eric Snowd2fdd1f2019-03-15 17:47:43 -0600304 Py_CLEAR(interp->dict);
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200305#ifdef HAVE_FORK
306 Py_CLEAR(interp->before_forkers);
307 Py_CLEAR(interp->after_forkers_parent);
308 Py_CLEAR(interp->after_forkers_child);
309#endif
Victor Stinner7b3c2522020-03-07 00:24:23 +0100310 if (_PyRuntimeState_GetFinalizing(runtime) == NULL) {
Eric Snow86ea5812019-05-10 13:29:55 -0400311 _PyWarnings_Fini(interp);
312 }
Eric Snow5be45a62019-03-08 22:47:07 -0700313 // XXX Once we have one allocator per interpreter (i.e.
314 // per-interpreter GC) we must ensure that all of the interpreter's
315 // objects have been cleaned up at the point.
Guido van Rossum25ce5661997-08-02 03:10:38 +0000316}
317
318
319static void
Victor Stinner9da74302019-11-20 11:17:17 +0100320zapthreads(PyInterpreterState *interp, int check_current)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000321{
Victor Stinner9da74302019-11-20 11:17:17 +0100322 PyThreadState *tstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000323 /* No need to lock the mutex here because this should only happen
324 when the threads are all really dead (XXX famous last words). */
Victor Stinner9da74302019-11-20 11:17:17 +0100325 while ((tstate = interp->tstate_head) != NULL) {
326 _PyThreadState_Delete(tstate, check_current);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000328}
329
330
Victor Stinner01b1cc12019-11-20 02:27:56 +0100331void
332PyInterpreterState_Delete(PyInterpreterState *interp)
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200333{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100334 _PyRuntimeState *runtime = interp->runtime;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200335 struct pyinterpreters *interpreters = &runtime->interpreters;
Victor Stinner9da74302019-11-20 11:17:17 +0100336 zapthreads(interp, 0);
337
338 /* 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;
355 if (interpreters->main == interp) {
356 interpreters->main = NULL;
357 if (interpreters->head != NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100358 Py_FatalError("remaining subinterpreters");
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200359 }
360 }
361 HEAD_UNLOCK(runtime);
362 if (interp->id_mutex != NULL) {
363 PyThread_free_lock(interp->id_mutex);
364 }
365 PyMem_RawFree(interp);
366}
367
368
Eric Snow59032962018-09-14 14:17:20 -0700369/*
370 * Delete all interpreter states except the main interpreter. If there
371 * is a current interpreter state, it *must* be the main interpreter.
372 */
373void
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200374_PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime)
Eric Snow59032962018-09-14 14:17:20 -0700375{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200376 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200377 struct pyinterpreters *interpreters = &runtime->interpreters;
378
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200379 PyThreadState *tstate = _PyThreadState_Swap(gilstate, NULL);
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200380 if (tstate != NULL && tstate->interp != interpreters->main) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100381 Py_FatalError("not main interpreter");
Eric Snow59032962018-09-14 14:17:20 -0700382 }
383
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200384 HEAD_LOCK(runtime);
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200385 PyInterpreterState *interp = interpreters->head;
386 interpreters->head = NULL;
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100387 while (interp != NULL) {
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200388 if (interp == interpreters->main) {
389 interpreters->main->next = NULL;
390 interpreters->head = interp;
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100391 interp = interp->next;
Eric Snow59032962018-09-14 14:17:20 -0700392 continue;
393 }
394
Victor Stinner01b1cc12019-11-20 02:27:56 +0100395 PyInterpreterState_Clear(interp); // XXX must activate?
Victor Stinner9da74302019-11-20 11:17:17 +0100396 zapthreads(interp, 1);
Eric Snow59032962018-09-14 14:17:20 -0700397 if (interp->id_mutex != NULL) {
398 PyThread_free_lock(interp->id_mutex);
399 }
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100400 PyInterpreterState *prev_interp = interp;
401 interp = interp->next;
402 PyMem_RawFree(prev_interp);
Eric Snow59032962018-09-14 14:17:20 -0700403 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200404 HEAD_UNLOCK(runtime);
Eric Snow59032962018-09-14 14:17:20 -0700405
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200406 if (interpreters->head == NULL) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100407 Py_FatalError("missing main interpreter");
Eric Snow59032962018-09-14 14:17:20 -0700408 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200409 _PyThreadState_Swap(gilstate, tstate);
Eric Snow59032962018-09-14 14:17:20 -0700410}
411
412
Victor Stinnercaba55b2018-08-03 15:33:52 +0200413PyInterpreterState *
Victor Stinnerbe793732020-03-13 18:15:33 +0100414PyInterpreterState_Get(void)
Victor Stinnercaba55b2018-08-03 15:33:52 +0200415{
Victor Stinner50b48572018-11-01 01:51:40 +0100416 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner23ef89d2020-03-18 02:26:04 +0100417 ensure_tstate_not_null(__func__, tstate);
Victor Stinnercaba55b2018-08-03 15:33:52 +0200418 PyInterpreterState *interp = tstate->interp;
419 if (interp == NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100420 Py_FatalError("no current interpreter");
Victor Stinnercaba55b2018-08-03 15:33:52 +0200421 }
422 return interp;
423}
424
425
Eric Snowe3774162017-05-22 19:46:40 -0700426int64_t
427PyInterpreterState_GetID(PyInterpreterState *interp)
428{
429 if (interp == NULL) {
430 PyErr_SetString(PyExc_RuntimeError, "no interpreter provided");
431 return -1;
432 }
433 return interp->id;
434}
435
436
Eric Snow5be45a62019-03-08 22:47:07 -0700437static PyInterpreterState *
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200438interp_look_up_id(_PyRuntimeState *runtime, PY_INT64_T requested_id)
Eric Snowb05b7112019-03-01 12:35:10 -0700439{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200440 PyInterpreterState *interp = runtime->interpreters.head;
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100441 while (interp != NULL) {
442 PY_INT64_T id = PyInterpreterState_GetID(interp);
Eric Snow5be45a62019-03-08 22:47:07 -0700443 if (id < 0) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100444 return NULL;
Eric Snow5be45a62019-03-08 22:47:07 -0700445 }
446 if (requested_id == id) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100447 return interp;
Eric Snow5be45a62019-03-08 22:47:07 -0700448 }
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100449 interp = PyInterpreterState_Next(interp);
Eric Snowb05b7112019-03-01 12:35:10 -0700450 }
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100451 return NULL;
Eric Snowb05b7112019-03-01 12:35:10 -0700452}
453
Eric Snow5be45a62019-03-08 22:47:07 -0700454PyInterpreterState *
455_PyInterpreterState_LookUpID(PY_INT64_T requested_id)
456{
457 PyInterpreterState *interp = NULL;
458 if (requested_id >= 0) {
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200459 _PyRuntimeState *runtime = &_PyRuntime;
460 HEAD_LOCK(runtime);
461 interp = interp_look_up_id(runtime, requested_id);
462 HEAD_UNLOCK(runtime);
Eric Snow5be45a62019-03-08 22:47:07 -0700463 }
464 if (interp == NULL && !PyErr_Occurred()) {
465 PyErr_Format(PyExc_RuntimeError,
466 "unrecognized interpreter ID %lld", requested_id);
467 }
468 return interp;
469}
470
Eric Snow4c6955e2018-02-16 18:53:40 -0700471
472int
473_PyInterpreterState_IDInitref(PyInterpreterState *interp)
474{
475 if (interp->id_mutex != NULL) {
476 return 0;
477 }
478 interp->id_mutex = PyThread_allocate_lock();
479 if (interp->id_mutex == NULL) {
480 PyErr_SetString(PyExc_RuntimeError,
481 "failed to create init interpreter ID mutex");
482 return -1;
483 }
484 interp->id_refcount = 0;
485 return 0;
486}
487
488
489void
490_PyInterpreterState_IDIncref(PyInterpreterState *interp)
491{
492 if (interp->id_mutex == NULL) {
493 return;
494 }
495 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
496 interp->id_refcount += 1;
497 PyThread_release_lock(interp->id_mutex);
498}
499
500
501void
502_PyInterpreterState_IDDecref(PyInterpreterState *interp)
503{
504 if (interp->id_mutex == NULL) {
505 return;
506 }
Victor Stinner0fd2c302019-06-04 03:15:09 +0200507 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
Eric Snow4c6955e2018-02-16 18:53:40 -0700508 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
509 assert(interp->id_refcount != 0);
510 interp->id_refcount -= 1;
511 int64_t refcount = interp->id_refcount;
512 PyThread_release_lock(interp->id_mutex);
513
Eric Snowc11183c2019-03-15 16:35:46 -0600514 if (refcount == 0 && interp->requires_idref) {
Eric Snowf53d9f22018-02-20 16:30:17 -0700515 // XXX Using the "head" thread isn't strictly correct.
516 PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
517 // XXX Possible GILState issues?
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200518 PyThreadState *save_tstate = _PyThreadState_Swap(gilstate, tstate);
Eric Snow4c6955e2018-02-16 18:53:40 -0700519 Py_EndInterpreter(tstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200520 _PyThreadState_Swap(gilstate, save_tstate);
Eric Snow4c6955e2018-02-16 18:53:40 -0700521 }
522}
523
Eric Snowc11183c2019-03-15 16:35:46 -0600524int
525_PyInterpreterState_RequiresIDRef(PyInterpreterState *interp)
526{
527 return interp->requires_idref;
528}
529
530void
531_PyInterpreterState_RequireIDRef(PyInterpreterState *interp, int required)
532{
533 interp->requires_idref = required ? 1 : 0;
534}
535
Eric Snowc11183c2019-03-15 16:35:46 -0600536PyObject *
537_PyInterpreterState_GetMainModule(PyInterpreterState *interp)
538{
539 if (interp->modules == NULL) {
540 PyErr_SetString(PyExc_RuntimeError, "interpreter not initialized");
541 return NULL;
542 }
543 return PyMapping_GetItemString(interp->modules, "__main__");
544}
545
Eric Snowd2fdd1f2019-03-15 17:47:43 -0600546PyObject *
547PyInterpreterState_GetDict(PyInterpreterState *interp)
548{
549 if (interp->dict == NULL) {
550 interp->dict = PyDict_New();
551 if (interp->dict == NULL) {
552 PyErr_Clear();
553 }
554 }
555 /* Returning NULL means no per-interpreter dict is available. */
556 return interp->dict;
557}
558
Victor Stinner45b9be52010-03-03 23:28:07 +0000559static PyThreadState *
560new_threadstate(PyInterpreterState *interp, int init)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000561{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100562 _PyRuntimeState *runtime = interp->runtime;
Victor Stinner1a7425f2013-07-07 16:25:15 +0200563 PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState));
Victor Stinner8bb32302019-04-24 16:47:40 +0200564 if (tstate == NULL) {
565 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000567
Victor Stinner8bb32302019-04-24 16:47:40 +0200568 tstate->interp = interp;
569
570 tstate->frame = NULL;
571 tstate->recursion_depth = 0;
572 tstate->overflowed = 0;
573 tstate->recursion_critical = 0;
574 tstate->stackcheck_counter = 0;
575 tstate->tracing = 0;
576 tstate->use_tracing = 0;
577 tstate->gilstate_counter = 0;
578 tstate->async_exc = NULL;
579 tstate->thread_id = PyThread_get_thread_ident();
580
581 tstate->dict = NULL;
582
583 tstate->curexc_type = NULL;
584 tstate->curexc_value = NULL;
585 tstate->curexc_traceback = NULL;
586
587 tstate->exc_state.exc_type = NULL;
588 tstate->exc_state.exc_value = NULL;
589 tstate->exc_state.exc_traceback = NULL;
590 tstate->exc_state.previous_item = NULL;
591 tstate->exc_info = &tstate->exc_state;
592
593 tstate->c_profilefunc = NULL;
594 tstate->c_tracefunc = NULL;
595 tstate->c_profileobj = NULL;
596 tstate->c_traceobj = NULL;
597
598 tstate->trash_delete_nesting = 0;
599 tstate->trash_delete_later = NULL;
600 tstate->on_delete = NULL;
601 tstate->on_delete_data = NULL;
602
603 tstate->coroutine_origin_tracking_depth = 0;
604
Victor Stinner8bb32302019-04-24 16:47:40 +0200605 tstate->async_gen_firstiter = NULL;
606 tstate->async_gen_finalizer = NULL;
607
608 tstate->context = NULL;
609 tstate->context_ver = 1;
610
Victor Stinner8bb32302019-04-24 16:47:40 +0200611 if (init) {
Victor Stinner01b1cc12019-11-20 02:27:56 +0100612 _PyThreadState_Init(tstate);
Victor Stinner8bb32302019-04-24 16:47:40 +0200613 }
614
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200615 HEAD_LOCK(runtime);
Stefan Krahb3b9ade2020-03-02 21:22:36 +0100616 tstate->id = ++interp->tstate_next_unique_id;
Victor Stinner8bb32302019-04-24 16:47:40 +0200617 tstate->prev = NULL;
618 tstate->next = interp->tstate_head;
619 if (tstate->next)
620 tstate->next->prev = tstate;
621 interp->tstate_head = tstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200622 HEAD_UNLOCK(runtime);
Victor Stinner8bb32302019-04-24 16:47:40 +0200623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000625}
626
Victor Stinner45b9be52010-03-03 23:28:07 +0000627PyThreadState *
628PyThreadState_New(PyInterpreterState *interp)
629{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 return new_threadstate(interp, 1);
Victor Stinner45b9be52010-03-03 23:28:07 +0000631}
632
633PyThreadState *
634_PyThreadState_Prealloc(PyInterpreterState *interp)
635{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 return new_threadstate(interp, 0);
Victor Stinner45b9be52010-03-03 23:28:07 +0000637}
638
639void
Victor Stinner01b1cc12019-11-20 02:27:56 +0100640_PyThreadState_Init(PyThreadState *tstate)
Victor Stinner45b9be52010-03-03 23:28:07 +0000641{
Victor Stinner01b1cc12019-11-20 02:27:56 +0100642 _PyGILState_NoteThreadState(&tstate->interp->runtime->gilstate, tstate);
Victor Stinner45b9be52010-03-03 23:28:07 +0000643}
644
Martin v. Löwis1a214512008-06-11 05:26:20 +0000645PyObject*
Martin v. Löwis7800f752012-06-22 12:20:55 +0200646PyState_FindModule(struct PyModuleDef* module)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000647{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200648 Py_ssize_t index = module->m_base.m_index;
Victor Stinner9204fb82018-10-30 15:13:17 +0100649 PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 PyObject *res;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000651 if (module->m_slots) {
652 return NULL;
653 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 if (index == 0)
655 return NULL;
656 if (state->modules_by_index == NULL)
657 return NULL;
Antoine Pitrou75506e82012-08-20 19:30:46 +0200658 if (index >= PyList_GET_SIZE(state->modules_by_index))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 return NULL;
660 res = PyList_GET_ITEM(state->modules_by_index, index);
661 return res==Py_None ? NULL : res;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000662}
663
664int
Victor Stinner82c83bd2019-11-22 18:52:27 +0100665_PyState_AddModule(PyThreadState *tstate, PyObject* module, struct PyModuleDef* def)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000666{
Berker Peksag4b7b5652016-08-22 18:05:56 +0300667 if (!def) {
Victor Stinner71a35222020-03-26 22:46:14 +0100668 assert(_PyErr_Occurred(tstate));
Berker Peksag4b7b5652016-08-22 18:05:56 +0300669 return -1;
670 }
Nick Coghland5cacbb2015-05-23 22:24:10 +1000671 if (def->m_slots) {
Victor Stinner71a35222020-03-26 22:46:14 +0100672 _PyErr_SetString(tstate,
673 PyExc_SystemError,
674 "PyState_AddModule called on module with slots");
Nick Coghland5cacbb2015-05-23 22:24:10 +1000675 return -1;
676 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100677
678 PyInterpreterState *interp = tstate->interp;
679 if (!interp->modules_by_index) {
680 interp->modules_by_index = PyList_New(0);
681 if (!interp->modules_by_index) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 return -1;
Victor Stinner82c83bd2019-11-22 18:52:27 +0100683 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100685
686 while (PyList_GET_SIZE(interp->modules_by_index) <= def->m_base.m_index) {
687 if (PyList_Append(interp->modules_by_index, Py_None) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 return -1;
Victor Stinner82c83bd2019-11-22 18:52:27 +0100689 }
690 }
691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 Py_INCREF(module);
Victor Stinner82c83bd2019-11-22 18:52:27 +0100693 return PyList_SetItem(interp->modules_by_index,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000695}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000696
Martin v. Löwis7800f752012-06-22 12:20:55 +0200697int
698PyState_AddModule(PyObject* module, struct PyModuleDef* def)
699{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200700 if (!def) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100701 Py_FatalError("module definition is NULL");
Martin v. Löwis7800f752012-06-22 12:20:55 +0200702 return -1;
703 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100704
705 PyThreadState *tstate = _PyThreadState_GET();
706 PyInterpreterState *interp = tstate->interp;
707 Py_ssize_t index = def->m_base.m_index;
708 if (interp->modules_by_index &&
709 index < PyList_GET_SIZE(interp->modules_by_index) &&
710 module == PyList_GET_ITEM(interp->modules_by_index, index))
711 {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100712 _Py_FatalErrorFormat(__func__, "module %p already added", module);
Benjamin Peterson39de95b2019-09-12 00:43:22 +0100713 return -1;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200714 }
Victor Stinner82c83bd2019-11-22 18:52:27 +0100715 return _PyState_AddModule(tstate, module, def);
Martin v. Löwis7800f752012-06-22 12:20:55 +0200716}
717
718int
719PyState_RemoveModule(struct PyModuleDef* def)
720{
Victor Stinner71a35222020-03-26 22:46:14 +0100721 PyThreadState *tstate = _PyThreadState_GET();
722 PyInterpreterState *interp = tstate->interp;
723
Nick Coghland5cacbb2015-05-23 22:24:10 +1000724 if (def->m_slots) {
Victor Stinner71a35222020-03-26 22:46:14 +0100725 _PyErr_SetString(tstate,
726 PyExc_SystemError,
727 "PyState_RemoveModule called on module with slots");
Nick Coghland5cacbb2015-05-23 22:24:10 +1000728 return -1;
729 }
Victor Stinner71a35222020-03-26 22:46:14 +0100730
731 Py_ssize_t index = def->m_base.m_index;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200732 if (index == 0) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100733 Py_FatalError("invalid module index");
Martin v. Löwis7800f752012-06-22 12:20:55 +0200734 }
Victor Stinner71a35222020-03-26 22:46:14 +0100735 if (interp->modules_by_index == NULL) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100736 Py_FatalError("Interpreters module-list not accessible.");
Martin v. Löwis7800f752012-06-22 12:20:55 +0200737 }
Victor Stinner71a35222020-03-26 22:46:14 +0100738 if (index > PyList_GET_SIZE(interp->modules_by_index)) {
Victor Stinner9e5d30c2020-03-07 00:54:20 +0100739 Py_FatalError("Module index out of bounds.");
Martin v. Löwis7800f752012-06-22 12:20:55 +0200740 }
Victor Stinner71a35222020-03-26 22:46:14 +0100741
Zackery Spytz2a893432018-12-05 00:14:00 -0700742 Py_INCREF(Py_None);
Victor Stinner71a35222020-03-26 22:46:14 +0100743 return PyList_SetItem(interp->modules_by_index, index, Py_None);
Martin v. Löwis7800f752012-06-22 12:20:55 +0200744}
745
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200746/* Used by PyImport_Cleanup() */
Antoine Pitrou40322e62013-08-11 00:30:09 +0200747void
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200748_PyInterpreterState_ClearModules(PyInterpreterState *interp)
Antoine Pitrou40322e62013-08-11 00:30:09 +0200749{
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200750 if (!interp->modules_by_index) {
751 return;
752 }
753
754 Py_ssize_t i;
755 for (i = 0; i < PyList_GET_SIZE(interp->modules_by_index); i++) {
756 PyObject *m = PyList_GET_ITEM(interp->modules_by_index, i);
757 if (PyModule_Check(m)) {
758 /* cleanup the saved copy of module dicts */
759 PyModuleDef *md = PyModule_GetDef(m);
760 if (md) {
761 Py_CLEAR(md->m_base.m_copy);
Antoine Pitrou40322e62013-08-11 00:30:09 +0200762 }
763 }
Victor Stinner0a28f8d2019-06-19 02:54:39 +0200764 }
765
766 /* Setting modules_by_index to NULL could be dangerous, so we
767 clear the list instead. */
768 if (PyList_SetSlice(interp->modules_by_index,
769 0, PyList_GET_SIZE(interp->modules_by_index),
770 NULL)) {
771 PyErr_WriteUnraisable(interp->modules_by_index);
Antoine Pitrou40322e62013-08-11 00:30:09 +0200772 }
773}
774
Guido van Rossuma027efa1997-05-05 20:56:21 +0000775void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000776PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000777{
Victor Stinner331a6a52019-05-27 16:39:22 +0200778 int verbose = tstate->interp->config.verbose;
Victor Stinner53b7d4e2018-07-25 01:37:05 +0200779
Victor Stinner5804f872020-03-24 16:32:26 +0100780 if (verbose && tstate->frame != NULL) {
781 /* bpo-20526: After the main thread calls
782 _PyRuntimeState_SetFinalizing() in Py_FinalizeEx(), threads must
783 exit when trying to take the GIL. If a thread exit in the middle of
784 _PyEval_EvalFrameDefault(), tstate->frame is not reset to its
785 previous value. It is more likely with daemon threads, but it can
786 happen with regular threads if threading._shutdown() fails
787 (ex: interrupted by CTRL+C). */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 fprintf(stderr,
789 "PyThreadState_Clear: warning: thread still has a frame\n");
Victor Stinner5804f872020-03-24 16:32:26 +0100790 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000791
Victor Stinner5804f872020-03-24 16:32:26 +0100792 /* Don't clear tstate->frame: it is a borrowed reference */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 Py_CLEAR(tstate->dict);
795 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 Py_CLEAR(tstate->curexc_type);
798 Py_CLEAR(tstate->curexc_value);
799 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000800
Mark Shannonae3087c2017-10-22 22:41:51 +0100801 Py_CLEAR(tstate->exc_state.exc_type);
802 Py_CLEAR(tstate->exc_state.exc_value);
803 Py_CLEAR(tstate->exc_state.exc_traceback);
Serhiy Storchakabdf42982017-10-26 16:59:40 +0300804
Mark Shannonae3087c2017-10-22 22:41:51 +0100805 /* The stack of exception states should contain just this thread. */
Victor Stinner53b7d4e2018-07-25 01:37:05 +0200806 if (verbose && tstate->exc_info != &tstate->exc_state) {
Mark Shannonae3087c2017-10-22 22:41:51 +0100807 fprintf(stderr,
808 "PyThreadState_Clear: warning: thread still has a generator\n");
809 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 tstate->c_profilefunc = NULL;
812 tstate->c_tracefunc = NULL;
813 Py_CLEAR(tstate->c_profileobj);
814 Py_CLEAR(tstate->c_traceobj);
Yury Selivanov75445082015-05-11 22:57:16 -0400815
Yury Selivanoveb636452016-09-08 22:01:51 -0700816 Py_CLEAR(tstate->async_gen_firstiter);
817 Py_CLEAR(tstate->async_gen_finalizer);
Yury Selivanovf23746a2018-01-22 19:11:18 -0500818
819 Py_CLEAR(tstate->context);
Victor Stinner4d96b462020-02-01 02:30:25 +0100820
821 if (tstate->on_delete != NULL) {
822 tstate->on_delete(tstate->on_delete_data);
823 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000824}
825
826
Joannah Nanjekye8855e472019-10-04 08:35:42 -0300827/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
Guido van Rossum29757862001-01-23 01:46:06 +0000828static void
Victor Stinner9da74302019-11-20 11:17:17 +0100829tstate_delete_common(PyThreadState *tstate,
830 struct _gilstate_runtime_state *gilstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000831{
Victor Stinner23ef89d2020-03-18 02:26:04 +0100832 ensure_tstate_not_null(__func__, tstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200833 PyInterpreterState *interp = tstate->interp;
834 if (interp == NULL) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100835 Py_FatalError("NULL interpreter");
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200836 }
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100837 _PyRuntimeState *runtime = interp->runtime;
838
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200839 HEAD_LOCK(runtime);
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100840 if (tstate->prev) {
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200841 tstate->prev->next = tstate->next;
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100842 }
843 else {
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200844 interp->tstate_head = tstate->next;
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100845 }
846 if (tstate->next) {
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200847 tstate->next->prev = tstate->prev;
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100848 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200849 HEAD_UNLOCK(runtime);
Victor Stinner4d96b462020-02-01 02:30:25 +0100850
Victor Stinner9da74302019-11-20 11:17:17 +0100851 if (gilstate->autoInterpreterState &&
852 PyThread_tss_get(&gilstate->autoTSSkey) == tstate)
853 {
854 PyThread_tss_set(&gilstate->autoTSSkey, NULL);
855 }
856}
857
858
859static void
860_PyThreadState_Delete(PyThreadState *tstate, int check_current)
861{
862 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
863 if (check_current) {
864 if (tstate == _PyRuntimeGILState_GetThreadState(gilstate)) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +0100865 _Py_FatalErrorFormat(__func__, "tstate %p is still current", tstate);
Victor Stinner9da74302019-11-20 11:17:17 +0100866 }
867 }
868 tstate_delete_common(tstate, gilstate);
Victor Stinner23ef89d2020-03-18 02:26:04 +0100869 PyMem_RawFree(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000870}
871
872
Victor Stinner01b1cc12019-11-20 02:27:56 +0100873void
874PyThreadState_Delete(PyThreadState *tstate)
Guido van Rossum29757862001-01-23 01:46:06 +0000875{
Victor Stinner9da74302019-11-20 11:17:17 +0100876 _PyThreadState_Delete(tstate, 1);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200877}
878
879
Joannah Nanjekye2bc43cd2019-09-05 13:06:49 -0300880void
Victor Stinner23ef89d2020-03-18 02:26:04 +0100881_PyThreadState_DeleteCurrent(PyThreadState *tstate)
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200882{
Victor Stinner23ef89d2020-03-18 02:26:04 +0100883 ensure_tstate_not_null(__func__, tstate);
884 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
Victor Stinner9da74302019-11-20 11:17:17 +0100885 tstate_delete_common(tstate, gilstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200886 _PyRuntimeGILState_SetThreadState(gilstate, NULL);
Victor Stinner23ef89d2020-03-18 02:26:04 +0100887 _PyEval_ReleaseLock(tstate);
888 PyMem_RawFree(tstate);
Guido van Rossum29757862001-01-23 01:46:06 +0000889}
Guido van Rossum29757862001-01-23 01:46:06 +0000890
Joannah Nanjekye8855e472019-10-04 08:35:42 -0300891void
892PyThreadState_DeleteCurrent(void)
893{
Victor Stinner23ef89d2020-03-18 02:26:04 +0100894 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
895 PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate);
896 _PyThreadState_DeleteCurrent(tstate);
Joannah Nanjekye8855e472019-10-04 08:35:42 -0300897}
898
Guido van Rossum29757862001-01-23 01:46:06 +0000899
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200900/*
901 * Delete all thread states except the one passed as argument.
902 * Note that, if there is a current thread state, it *must* be the one
903 * passed as argument. Also, this won't touch any other interpreters
904 * than the current one, since we don't know which thread state should
Min ho Kim39d87b52019-08-31 06:21:19 +1000905 * be kept in those other interpreters.
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200906 */
907void
Victor Stinner0fd2c302019-06-04 03:15:09 +0200908_PyThreadState_DeleteExcept(_PyRuntimeState *runtime, PyThreadState *tstate)
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200909{
910 PyInterpreterState *interp = tstate->interp;
Victor Stinner9ad58ac2020-03-09 23:37:49 +0100911
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200912 HEAD_LOCK(runtime);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200913 /* Remove all thread states, except tstate, from the linked list of
914 thread states. This will allow calling PyThreadState_Clear()
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200915 without holding the lock. */
Victor Stinner9ad58ac2020-03-09 23:37:49 +0100916 PyThreadState *list = interp->tstate_head;
917 if (list == tstate) {
918 list = tstate->next;
919 }
920 if (tstate->prev) {
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200921 tstate->prev->next = tstate->next;
Victor Stinner9ad58ac2020-03-09 23:37:49 +0100922 }
923 if (tstate->next) {
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200924 tstate->next->prev = tstate->prev;
Victor Stinner9ad58ac2020-03-09 23:37:49 +0100925 }
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200926 tstate->prev = tstate->next = NULL;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200927 interp->tstate_head = tstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200928 HEAD_UNLOCK(runtime);
Victor Stinner9ad58ac2020-03-09 23:37:49 +0100929
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200930 /* Clear and deallocate all stale thread states. Even if this
931 executes Python code, we should be safe since it executes
932 in the current thread, not one of the stale threads. */
Victor Stinner9ad58ac2020-03-09 23:37:49 +0100933 PyThreadState *p, *next;
934 for (p = list; p; p = next) {
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200935 next = p->next;
936 PyThreadState_Clear(p);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200937 PyMem_RawFree(p);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200938 }
939}
940
941
Guido van Rossuma027efa1997-05-05 20:56:21 +0000942PyThreadState *
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100943_PyThreadState_UncheckedGet(void)
944{
Victor Stinner50b48572018-11-01 01:51:40 +0100945 return _PyThreadState_GET();
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100946}
947
948
949PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000950PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000951{
Victor Stinner50b48572018-11-01 01:51:40 +0100952 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner23ef89d2020-03-18 02:26:04 +0100953 ensure_tstate_not_null(__func__, tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000955}
956
957
Victor Stinner09532fe2019-05-10 23:39:09 +0200958PyThreadState *
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200959_PyThreadState_Swap(struct _gilstate_runtime_state *gilstate, PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000960{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200961 PyThreadState *oldts = _PyRuntimeGILState_GetThreadState(gilstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000962
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200963 _PyRuntimeGILState_SetThreadState(gilstate, newts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 /* It should not be possible for more than one thread state
965 to be used for a thread. Check this the best we can in debug
966 builds.
967 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200968#if defined(Py_DEBUG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 if (newts) {
970 /* This can be called from PyEval_RestoreThread(). Similar
971 to it, we need to ensure errno doesn't change.
972 */
973 int err = errno;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200974 PyThreadState *check = _PyGILState_GetThisThreadState(gilstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 if (check && check->interp == newts->interp && check != newts)
976 Py_FatalError("Invalid thread state for this thread");
977 errno = err;
978 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000979#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000981}
Guido van Rossumede04391998-04-10 20:18:25 +0000982
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200983PyThreadState *
984PyThreadState_Swap(PyThreadState *newts)
985{
986 return _PyThreadState_Swap(&_PyRuntime.gilstate, newts);
987}
988
Guido van Rossumede04391998-04-10 20:18:25 +0000989/* An extension mechanism to store arbitrary additional per-thread state.
990 PyThreadState_GetDict() returns a dictionary that can be used to hold such
991 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +0000992 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
993 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +0000994
995PyObject *
Victor Stinner0e427c62020-03-25 21:22:55 +0100996_PyThreadState_GetDict(PyThreadState *tstate)
997{
998 assert(tstate != NULL);
999 if (tstate->dict == NULL) {
1000 tstate->dict = PyDict_New();
1001 if (tstate->dict == NULL) {
1002 _PyErr_Clear(tstate);
1003 }
1004 }
1005 return tstate->dict;
1006}
1007
1008
1009PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001010PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +00001011{
Victor Stinner50b48572018-11-01 01:51:40 +01001012 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner0e427c62020-03-25 21:22:55 +01001013 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 }
Victor Stinner0e427c62020-03-25 21:22:55 +01001016 return _PyThreadState_GetDict(tstate);
Guido van Rossumede04391998-04-10 20:18:25 +00001017}
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001018
1019
Victor Stinner8fb02b62020-03-13 23:38:08 +01001020PyInterpreterState *
1021PyThreadState_GetInterpreter(PyThreadState *tstate)
1022{
1023 assert(tstate != NULL);
Victor Stinner8fb02b62020-03-13 23:38:08 +01001024 return tstate->interp;
1025}
1026
1027
Victor Stinnerfd1e1a12020-03-20 15:51:45 +01001028struct _frame*
1029PyThreadState_GetFrame(PyThreadState *tstate)
1030{
1031 assert(tstate != NULL);
Victor Stinner6723e932020-03-20 17:46:56 +01001032 return tstate->frame;
Victor Stinnerfd1e1a12020-03-20 15:51:45 +01001033}
1034
1035
Victor Stinner5c3cda02020-03-25 21:23:53 +01001036uint64_t
1037PyThreadState_GetID(PyThreadState *tstate)
1038{
1039 assert(tstate != NULL);
1040 return tstate->id;
1041}
1042
1043
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001044/* Asynchronously raise an exception in a thread.
1045 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +00001046 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001047 to call this, or use ctypes. Must be called with the GIL held.
1048 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
1049 match any known thread id). Can be called with exc=NULL to clear an
1050 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001051
1052int
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +02001053PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc)
1054{
Victor Stinner09532fe2019-05-10 23:39:09 +02001055 _PyRuntimeState *runtime = &_PyRuntime;
1056 PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 /* Although the GIL is held, a few C API functions can be called
1059 * without the GIL held, and in particular some that create and
1060 * destroy thread and interpreter states. Those can mutate the
1061 * list of thread states we're traversing, so to prevent that we lock
1062 * head_mutex for the duration.
1063 */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001064 HEAD_LOCK(runtime);
Victor Stinner56bfdeb2020-03-18 09:26:25 +01001065 for (PyThreadState *tstate = interp->tstate_head; tstate != NULL; tstate = tstate->next) {
1066 if (tstate->thread_id != id) {
1067 continue;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 }
Victor Stinner56bfdeb2020-03-18 09:26:25 +01001069
1070 /* Tricky: we need to decref the current value
1071 * (if any) in tstate->async_exc, but that can in turn
1072 * allow arbitrary Python code to run, including
1073 * perhaps calls to this function. To prevent
1074 * deadlock, we need to release head_mutex before
1075 * the decref.
1076 */
1077 PyObject *old_exc = tstate->async_exc;
1078 Py_XINCREF(exc);
1079 tstate->async_exc = exc;
1080 HEAD_UNLOCK(runtime);
1081
1082 Py_XDECREF(old_exc);
1083 _PyEval_SignalAsyncExc(tstate);
1084 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001086 HEAD_UNLOCK(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001088}
1089
1090
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001091/* Routines for advanced debuggers, requested by David Beazley.
1092 Don't use unless you know what you are doing! */
1093
1094PyInterpreterState *
1095PyInterpreterState_Head(void)
1096{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001097 return _PyRuntime.interpreters.head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001098}
1099
1100PyInterpreterState *
Eric Snow6b4be192017-05-22 21:36:03 -07001101PyInterpreterState_Main(void)
1102{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001103 return _PyRuntime.interpreters.main;
Eric Snow6b4be192017-05-22 21:36:03 -07001104}
1105
1106PyInterpreterState *
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001107PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001109}
1110
1111PyThreadState *
1112PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001114}
1115
1116PyThreadState *
1117PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001119}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001120
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001121/* The implementation of sys._current_frames(). This is intended to be
1122 called with the GIL held, as it will be when called via
1123 sys._current_frames(). It's possible it would work fine even without
1124 the GIL held, but haven't thought enough about that.
1125*/
1126PyObject *
1127_PyThread_CurrentFrames(void)
1128{
Victor Stinner71a35222020-03-26 22:46:14 +01001129 PyThreadState *tstate = _PyThreadState_GET();
1130 if (_PySys_Audit(tstate, "sys._current_frames", NULL) < 0) {
Steve Dowerb82e17e2019-05-23 08:45:22 -07001131 return NULL;
1132 }
1133
Victor Stinner71a35222020-03-26 22:46:14 +01001134 PyObject *result = PyDict_New();
1135 if (result == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 return NULL;
Victor Stinner71a35222020-03-26 22:46:14 +01001137 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 /* for i in all interpreters:
1140 * for t in all of i's thread states:
1141 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +02001142 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 * need to grab head_mutex for the duration.
1144 */
Victor Stinner71a35222020-03-26 22:46:14 +01001145 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001146 HEAD_LOCK(runtime);
Victor Stinner71a35222020-03-26 22:46:14 +01001147 PyInterpreterState *i;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001148 for (i = runtime->interpreters.head; i != NULL; i = i->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 PyThreadState *t;
1150 for (t = i->tstate_head; t != NULL; t = t->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 struct _frame *frame = t->frame;
Victor Stinner71a35222020-03-26 22:46:14 +01001152 if (frame == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 continue;
Victor Stinner71a35222020-03-26 22:46:14 +01001154 }
1155 PyObject *id = PyLong_FromUnsignedLong(t->thread_id);
1156 if (id == NULL) {
1157 goto fail;
1158 }
1159 int stat = PyDict_SetItem(result, id, (PyObject *)frame);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 Py_DECREF(id);
Victor Stinner71a35222020-03-26 22:46:14 +01001161 if (stat < 0) {
1162 goto fail;
1163 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 }
1165 }
Victor Stinner71a35222020-03-26 22:46:14 +01001166 goto done;
1167
1168fail:
1169 Py_CLEAR(result);
1170
1171done:
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001172 HEAD_UNLOCK(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001174}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001175
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001176/* Python "auto thread state" API. */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001177
1178/* Keep this as a static, as it is not reliable! It can only
1179 ever be compared to the state for the *current* thread.
1180 * If not equal, then it doesn't matter that the actual
1181 value may change immediately after comparison, as it can't
1182 possibly change to the current thread's state.
1183 * If equal, then the current thread holds the lock, so the value can't
1184 change until we yield the lock.
1185*/
1186static int
1187PyThreadState_IsCurrent(PyThreadState *tstate)
1188{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 /* Must be the tstate for this thread */
Victor Stinner0fd2c302019-06-04 03:15:09 +02001190 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001191 assert(_PyGILState_GetThisThreadState(gilstate) == tstate);
1192 return tstate == _PyRuntimeGILState_GetThreadState(gilstate);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001193}
1194
Tim Peters4c1f5ec2004-10-09 17:25:05 +00001195/* Internal initialization/finalization functions called by
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001196 Py_Initialize/Py_FinalizeEx
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001197*/
Victor Stinner4e53abb2020-03-10 23:49:16 +01001198PyStatus
Victor Stinner01b1cc12019-11-20 02:27:56 +01001199_PyGILState_Init(PyThreadState *tstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001200{
Victor Stinner8bb32302019-04-24 16:47:40 +02001201 /* must init with valid states */
Victor Stinner0fd2c302019-06-04 03:15:09 +02001202 assert(tstate != NULL);
Victor Stinnerb45d2592019-06-20 00:05:23 +02001203 assert(tstate->interp != NULL);
Victor Stinner8bb32302019-04-24 16:47:40 +02001204
Victor Stinner01b1cc12019-11-20 02:27:56 +01001205 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
Victor Stinner8bb32302019-04-24 16:47:40 +02001206
1207 if (PyThread_tss_create(&gilstate->autoTSSkey) != 0) {
Victor Stinner4e53abb2020-03-10 23:49:16 +01001208 return _PyStatus_NO_MEMORY();
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001209 }
Victor Stinnerb45d2592019-06-20 00:05:23 +02001210 gilstate->autoInterpreterState = tstate->interp;
Victor Stinner8bb32302019-04-24 16:47:40 +02001211 assert(PyThread_tss_get(&gilstate->autoTSSkey) == NULL);
1212 assert(tstate->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +00001213
Victor Stinner8bb32302019-04-24 16:47:40 +02001214 _PyGILState_NoteThreadState(gilstate, tstate);
Victor Stinner4e53abb2020-03-10 23:49:16 +01001215 return _PyStatus_OK();
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001216}
1217
Victor Stinner861d9ab2016-03-16 22:45:24 +01001218PyInterpreterState *
1219_PyGILState_GetInterpreterStateUnsafe(void)
1220{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001221 return _PyRuntime.gilstate.autoInterpreterState;
Victor Stinner861d9ab2016-03-16 22:45:24 +01001222}
1223
Tim Peters19717fa2004-10-09 17:38:29 +00001224void
Victor Stinner7eee5be2019-11-20 10:38:34 +01001225_PyGILState_Fini(PyThreadState *tstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001226{
Victor Stinner7eee5be2019-11-20 10:38:34 +01001227 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
Victor Stinner8e91c242019-04-24 17:24:01 +02001228 PyThread_tss_delete(&gilstate->autoTSSkey);
1229 gilstate->autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001230}
1231
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001232/* Reset the TSS key - called by PyOS_AfterFork_Child().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001233 * This should not be necessary, but some - buggy - pthread implementations
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001234 * don't reset TSS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001235 */
1236void
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001237_PyGILState_Reinit(_PyRuntimeState *runtime)
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001238{
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001239 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001240 PyThreadState *tstate = _PyGILState_GetThisThreadState(gilstate);
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001241
1242 PyThread_tss_delete(&gilstate->autoTSSkey);
1243 if (PyThread_tss_create(&gilstate->autoTSSkey) != 0) {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001244 Py_FatalError("Could not allocate TSS entry");
1245 }
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001246
Charles-François Natalia233df82011-11-22 19:49:51 +01001247 /* If the thread had an associated auto thread state, reassociate it with
1248 * the new key. */
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001249 if (tstate &&
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001250 PyThread_tss_set(&gilstate->autoTSSkey, (void *)tstate) != 0)
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001251 {
1252 Py_FatalError("Couldn't create autoTSSkey mapping");
1253 }
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001254}
1255
Michael W. Hudson188d4362005-06-20 16:52:57 +00001256/* When a thread state is created for a thread by some mechanism other than
1257 PyGILState_Ensure, it's important that the GILState machinery knows about
1258 it so it doesn't try to create another thread state for the thread (this is
1259 a better fix for SF bug #1010677 than the first one attempted).
1260*/
Thomas Wouters89f507f2006-12-13 04:49:30 +00001261static void
Victor Stinner8bb32302019-04-24 16:47:40 +02001262_PyGILState_NoteThreadState(struct _gilstate_runtime_state *gilstate, PyThreadState* tstate)
Michael W. Hudson188d4362005-06-20 16:52:57 +00001263{
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001264 /* If autoTSSkey isn't initialized, this must be the very first
Antoine Pitrou079ce542010-09-08 12:37:10 +00001265 threadstate created in Py_Initialize(). Don't do anything for now
1266 (we'll be back here when _PyGILState_Init is called). */
Victor Stinner8bb32302019-04-24 16:47:40 +02001267 if (!gilstate->autoInterpreterState) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 return;
Victor Stinner8bb32302019-04-24 16:47:40 +02001269 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001270
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001271 /* Stick the thread state for this thread in thread specific storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +00001272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 The only situation where you can legitimately have more than one
1274 thread state for an OS level thread is when there are multiple
Victor Stinner590cebe2013-12-13 11:08:56 +01001275 interpreters.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001276
Victor Stinner590cebe2013-12-13 11:08:56 +01001277 You shouldn't really be using the PyGILState_ APIs anyway (see issues
1278 #10915 and #15751).
Michael W. Hudson188d4362005-06-20 16:52:57 +00001279
Victor Stinner590cebe2013-12-13 11:08:56 +01001280 The first thread state created for that given OS level thread will
1281 "win", which seems reasonable behaviour.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 */
Victor Stinner8bb32302019-04-24 16:47:40 +02001283 if (PyThread_tss_get(&gilstate->autoTSSkey) == NULL) {
1284 if ((PyThread_tss_set(&gilstate->autoTSSkey, (void *)tstate)) != 0) {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001285 Py_FatalError("Couldn't create autoTSSkey mapping");
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001286 }
Victor Stinner590cebe2013-12-13 11:08:56 +01001287 }
Michael W. Hudson188d4362005-06-20 16:52:57 +00001288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 /* PyGILState_Release must not try to delete this thread state. */
1290 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +00001291}
1292
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001293/* The public functions */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001294static PyThreadState *
1295_PyGILState_GetThisThreadState(struct _gilstate_runtime_state *gilstate)
1296{
1297 if (gilstate->autoInterpreterState == NULL)
1298 return NULL;
1299 return (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey);
1300}
1301
Tim Peters19717fa2004-10-09 17:38:29 +00001302PyThreadState *
1303PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001304{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001305 return _PyGILState_GetThisThreadState(&_PyRuntime.gilstate);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001306}
1307
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -07001308int
1309PyGILState_Check(void)
1310{
Victor Stinner8a1be612016-03-14 22:07:55 +01001311
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001312 if (!_PyGILState_check_enabled) {
Victor Stinner8a1be612016-03-14 22:07:55 +01001313 return 1;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001314 }
Victor Stinner8a1be612016-03-14 22:07:55 +01001315
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001316 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
1317 if (!PyThread_tss_is_created(&gilstate->autoTSSkey)) {
1318 return 1;
1319 }
Victor Stinner8a1be612016-03-14 22:07:55 +01001320
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001321 PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate);
1322 if (tstate == NULL) {
1323 return 0;
1324 }
1325
1326 return (tstate == _PyGILState_GetThisThreadState(gilstate));
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -07001327}
1328
Tim Peters19717fa2004-10-09 17:38:29 +00001329PyGILState_STATE
1330PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001331{
Victor Stinner175a7042020-03-10 00:37:48 +01001332 _PyRuntimeState *runtime = &_PyRuntime;
1333 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 /* Note that we do not auto-init Python here - apart from
1336 potential races with 2 threads auto-initializing, pep-311
1337 spells out other issues. Embedders are expected to have
Victor Stinner175a7042020-03-10 00:37:48 +01001338 called Py_Initialize(). */
1339
1340 /* Ensure that _PyEval_InitThreads() and _PyGILState_Init() have been
1341 called by Py_Initialize() */
1342 assert(_PyEval_ThreadsInitialized(runtime));
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001343 assert(gilstate->autoInterpreterState);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001344
Victor Stinner175a7042020-03-10 00:37:48 +01001345 PyThreadState *tcur = (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey);
1346 int current;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 if (tcur == NULL) {
Victor Stinner175a7042020-03-10 00:37:48 +01001348 /* Create a new Python thread state for this thread */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001349 tcur = PyThreadState_New(gilstate->autoInterpreterState);
Victor Stinner175a7042020-03-10 00:37:48 +01001350 if (tcur == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 Py_FatalError("Couldn't create thread-state for new thread");
Victor Stinner175a7042020-03-10 00:37:48 +01001352 }
1353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 /* This is our thread state! We'll need to delete it in the
1355 matching call to PyGILState_Release(). */
1356 tcur->gilstate_counter = 0;
1357 current = 0; /* new thread state is never current */
1358 }
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001359 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 current = PyThreadState_IsCurrent(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001361 }
1362
1363 if (current == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 PyEval_RestoreThread(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001365 }
1366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 /* Update our counter in the thread-state - no need for locks:
1368 - tcur will remain valid as we hold the GIL.
1369 - the counter is safe as we are the only thread "allowed"
1370 to modify this value
1371 */
1372 ++tcur->gilstate_counter;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001375}
1376
Tim Peters19717fa2004-10-09 17:38:29 +00001377void
1378PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001379{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001380 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner23ef89d2020-03-18 02:26:04 +01001381 PyThreadState *tstate = PyThread_tss_get(&runtime->gilstate.autoTSSkey);
1382 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 Py_FatalError("auto-releasing thread-state, "
1384 "but no thread-state for this thread");
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001385 }
1386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 /* We must hold the GIL and have our thread state current */
1388 /* XXX - remove the check - the assert should be fine,
1389 but while this is very new (April 2003), the extra check
1390 by release-only users can't hurt.
1391 */
Victor Stinner23ef89d2020-03-18 02:26:04 +01001392 if (!PyThreadState_IsCurrent(tstate)) {
Victor Stinner87d3b9d2020-03-25 19:27:36 +01001393 _Py_FatalErrorFormat(__func__,
1394 "thread state %p must be current when releasing",
1395 tstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001396 }
Victor Stinner23ef89d2020-03-18 02:26:04 +01001397 assert(PyThreadState_IsCurrent(tstate));
1398 --tstate->gilstate_counter;
1399 assert(tstate->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 /* If we're going to destroy this thread-state, we must
1402 * clear it while the GIL is held, as destructors may run.
1403 */
Victor Stinner23ef89d2020-03-18 02:26:04 +01001404 if (tstate->gilstate_counter == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001405 /* can't have been locked when we created it */
1406 assert(oldstate == PyGILState_UNLOCKED);
Victor Stinner23ef89d2020-03-18 02:26:04 +01001407 PyThreadState_Clear(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001408 /* Delete the thread-state. Note this releases the GIL too!
1409 * It's vital that the GIL be held here, to avoid shutdown
1410 * races; see bugs 225673 and 1061968 (that nasty bug has a
1411 * habit of coming back).
1412 */
Victor Stinner23ef89d2020-03-18 02:26:04 +01001413 assert(_PyRuntimeGILState_GetThreadState(&runtime->gilstate) == tstate);
1414 _PyThreadState_DeleteCurrent(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 }
1416 /* Release the lock if necessary */
1417 else if (oldstate == PyGILState_UNLOCKED)
1418 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001419}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001420
Benjamin Peterson3bf01752012-04-13 18:06:36 -04001421
Eric Snow7f8bfc92018-01-29 18:23:44 -07001422/**************************/
1423/* cross-interpreter data */
1424/**************************/
1425
1426/* cross-interpreter data */
1427
1428crossinterpdatafunc _PyCrossInterpreterData_Lookup(PyObject *);
1429
1430/* This is a separate func from _PyCrossInterpreterData_Lookup in order
1431 to keep the registry code separate. */
1432static crossinterpdatafunc
1433_lookup_getdata(PyObject *obj)
1434{
1435 crossinterpdatafunc getdata = _PyCrossInterpreterData_Lookup(obj);
1436 if (getdata == NULL && PyErr_Occurred() == 0)
1437 PyErr_Format(PyExc_ValueError,
1438 "%S does not support cross-interpreter data", obj);
1439 return getdata;
1440}
1441
1442int
1443_PyObject_CheckCrossInterpreterData(PyObject *obj)
1444{
1445 crossinterpdatafunc getdata = _lookup_getdata(obj);
1446 if (getdata == NULL) {
1447 return -1;
1448 }
1449 return 0;
1450}
1451
1452static int
Victor Stinner71a35222020-03-26 22:46:14 +01001453_check_xidata(PyThreadState *tstate, _PyCrossInterpreterData *data)
Eric Snow7f8bfc92018-01-29 18:23:44 -07001454{
1455 // data->data can be anything, including NULL, so we don't check it.
1456
1457 // data->obj may be NULL, so we don't check it.
1458
1459 if (data->interp < 0) {
Victor Stinner71a35222020-03-26 22:46:14 +01001460 _PyErr_SetString(tstate, PyExc_SystemError, "missing interp");
Eric Snow7f8bfc92018-01-29 18:23:44 -07001461 return -1;
1462 }
1463
1464 if (data->new_object == NULL) {
Victor Stinner71a35222020-03-26 22:46:14 +01001465 _PyErr_SetString(tstate, PyExc_SystemError, "missing new_object func");
Eric Snow7f8bfc92018-01-29 18:23:44 -07001466 return -1;
1467 }
1468
1469 // data->free may be NULL, so we don't check it.
1470
1471 return 0;
1472}
1473
1474int
1475_PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data)
1476{
Victor Stinner71a35222020-03-26 22:46:14 +01001477 // PyThreadState_Get() aborts if tstate is NULL.
1478 PyThreadState *tstate = PyThreadState_Get();
1479 PyInterpreterState *interp = tstate->interp;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001480
1481 // Reset data before re-populating.
1482 *data = (_PyCrossInterpreterData){0};
1483 data->free = PyMem_RawFree; // Set a default that may be overridden.
1484
1485 // Call the "getdata" func for the object.
1486 Py_INCREF(obj);
1487 crossinterpdatafunc getdata = _lookup_getdata(obj);
1488 if (getdata == NULL) {
1489 Py_DECREF(obj);
1490 return -1;
1491 }
1492 int res = getdata(obj, data);
1493 Py_DECREF(obj);
1494 if (res != 0) {
1495 return -1;
1496 }
1497
1498 // Fill in the blanks and validate the result.
Eric Snow7f8bfc92018-01-29 18:23:44 -07001499 data->interp = interp->id;
Victor Stinner71a35222020-03-26 22:46:14 +01001500 if (_check_xidata(tstate, data) != 0) {
Eric Snow7f8bfc92018-01-29 18:23:44 -07001501 _PyCrossInterpreterData_Release(data);
1502 return -1;
1503 }
1504
1505 return 0;
1506}
1507
Victor Stinnere225beb2019-06-03 18:14:24 +02001508static void
Eric Snow63799132018-06-01 18:45:20 -06001509_release_xidata(void *arg)
1510{
1511 _PyCrossInterpreterData *data = (_PyCrossInterpreterData *)arg;
1512 if (data->free != NULL) {
1513 data->free(data->data);
1514 }
1515 Py_XDECREF(data->obj);
Victor Stinnere225beb2019-06-03 18:14:24 +02001516}
1517
1518static void
1519_call_in_interpreter(struct _gilstate_runtime_state *gilstate,
1520 PyInterpreterState *interp,
1521 void (*func)(void *), void *arg)
1522{
1523 /* We would use Py_AddPendingCall() if it weren't specific to the
1524 * main interpreter (see bpo-33608). In the meantime we take a
1525 * naive approach.
1526 */
1527 PyThreadState *save_tstate = NULL;
1528 if (interp != _PyRuntimeGILState_GetThreadState(gilstate)->interp) {
1529 // XXX Using the "head" thread isn't strictly correct.
1530 PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
1531 // XXX Possible GILState issues?
1532 save_tstate = _PyThreadState_Swap(gilstate, tstate);
1533 }
1534
1535 func(arg);
1536
1537 // Switch back.
1538 if (save_tstate != NULL) {
1539 _PyThreadState_Swap(gilstate, save_tstate);
1540 }
Eric Snow63799132018-06-01 18:45:20 -06001541}
1542
Eric Snow7f8bfc92018-01-29 18:23:44 -07001543void
1544_PyCrossInterpreterData_Release(_PyCrossInterpreterData *data)
1545{
1546 if (data->data == NULL && data->obj == NULL) {
1547 // Nothing to release!
1548 return;
1549 }
1550
Victor Stinnere225beb2019-06-03 18:14:24 +02001551 // Switch to the original interpreter.
Eric Snow7f8bfc92018-01-29 18:23:44 -07001552 PyInterpreterState *interp = _PyInterpreterState_LookUpID(data->interp);
1553 if (interp == NULL) {
Min ho Kimc4cacc82019-07-31 08:16:13 +10001554 // The interpreter was already destroyed.
Eric Snow7f8bfc92018-01-29 18:23:44 -07001555 if (data->free != NULL) {
1556 // XXX Someone leaked some memory...
1557 }
1558 return;
1559 }
Eric Snowf53d9f22018-02-20 16:30:17 -07001560
Eric Snow7f8bfc92018-01-29 18:23:44 -07001561 // "Release" the data and/or the object.
Victor Stinnere225beb2019-06-03 18:14:24 +02001562 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
1563 _call_in_interpreter(gilstate, interp, _release_xidata, data);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001564}
1565
1566PyObject *
1567_PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *data)
1568{
1569 return data->new_object(data);
1570}
1571
1572/* registry of {type -> crossinterpdatafunc} */
1573
1574/* For now we use a global registry of shareable classes. An
1575 alternative would be to add a tp_* slot for a class's
1576 crossinterpdatafunc. It would be simpler and more efficient. */
1577
1578static int
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001579_register_xidata(struct _xidregistry *xidregistry, PyTypeObject *cls,
1580 crossinterpdatafunc getdata)
Eric Snow7f8bfc92018-01-29 18:23:44 -07001581{
1582 // Note that we effectively replace already registered classes
1583 // rather than failing.
1584 struct _xidregitem *newhead = PyMem_RawMalloc(sizeof(struct _xidregitem));
1585 if (newhead == NULL)
1586 return -1;
1587 newhead->cls = cls;
1588 newhead->getdata = getdata;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001589 newhead->next = xidregistry->head;
1590 xidregistry->head = newhead;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001591 return 0;
1592}
1593
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001594static void _register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001595
1596int
Eric Snowc11183c2019-03-15 16:35:46 -06001597_PyCrossInterpreterData_RegisterClass(PyTypeObject *cls,
Eric Snow7f8bfc92018-01-29 18:23:44 -07001598 crossinterpdatafunc getdata)
1599{
1600 if (!PyType_Check(cls)) {
1601 PyErr_Format(PyExc_ValueError, "only classes may be registered");
1602 return -1;
1603 }
1604 if (getdata == NULL) {
1605 PyErr_Format(PyExc_ValueError, "missing 'getdata' func");
1606 return -1;
1607 }
1608
1609 // Make sure the class isn't ever deallocated.
1610 Py_INCREF((PyObject *)cls);
1611
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001612 struct _xidregistry *xidregistry = &_PyRuntime.xidregistry ;
1613 PyThread_acquire_lock(xidregistry->mutex, WAIT_LOCK);
1614 if (xidregistry->head == NULL) {
1615 _register_builtins_for_crossinterpreter_data(xidregistry);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001616 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001617 int res = _register_xidata(xidregistry, cls, getdata);
1618 PyThread_release_lock(xidregistry->mutex);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001619 return res;
1620}
1621
Eric Snow6d2cd902018-05-16 15:04:57 -04001622/* Cross-interpreter objects are looked up by exact match on the class.
1623 We can reassess this policy when we move from a global registry to a
1624 tp_* slot. */
1625
Eric Snow7f8bfc92018-01-29 18:23:44 -07001626crossinterpdatafunc
1627_PyCrossInterpreterData_Lookup(PyObject *obj)
1628{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001629 struct _xidregistry *xidregistry = &_PyRuntime.xidregistry ;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001630 PyObject *cls = PyObject_Type(obj);
1631 crossinterpdatafunc getdata = NULL;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001632 PyThread_acquire_lock(xidregistry->mutex, WAIT_LOCK);
1633 struct _xidregitem *cur = xidregistry->head;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001634 if (cur == NULL) {
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001635 _register_builtins_for_crossinterpreter_data(xidregistry);
1636 cur = xidregistry->head;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001637 }
1638 for(; cur != NULL; cur = cur->next) {
1639 if (cur->cls == (PyTypeObject *)cls) {
1640 getdata = cur->getdata;
1641 break;
1642 }
1643 }
Eric Snow4e9da0d2018-02-02 21:49:49 -07001644 Py_DECREF(cls);
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001645 PyThread_release_lock(xidregistry->mutex);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001646 return getdata;
1647}
1648
1649/* cross-interpreter data for builtin types */
1650
Eric Snow6d2cd902018-05-16 15:04:57 -04001651struct _shared_bytes_data {
1652 char *bytes;
1653 Py_ssize_t len;
1654};
1655
Eric Snow7f8bfc92018-01-29 18:23:44 -07001656static PyObject *
1657_new_bytes_object(_PyCrossInterpreterData *data)
1658{
Eric Snow6d2cd902018-05-16 15:04:57 -04001659 struct _shared_bytes_data *shared = (struct _shared_bytes_data *)(data->data);
1660 return PyBytes_FromStringAndSize(shared->bytes, shared->len);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001661}
1662
1663static int
1664_bytes_shared(PyObject *obj, _PyCrossInterpreterData *data)
1665{
Eric Snow6d2cd902018-05-16 15:04:57 -04001666 struct _shared_bytes_data *shared = PyMem_NEW(struct _shared_bytes_data, 1);
1667 if (PyBytes_AsStringAndSize(obj, &shared->bytes, &shared->len) < 0) {
1668 return -1;
1669 }
1670 data->data = (void *)shared;
Eric Snow63799132018-06-01 18:45:20 -06001671 Py_INCREF(obj);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001672 data->obj = obj; // Will be "released" (decref'ed) when data released.
1673 data->new_object = _new_bytes_object;
Eric Snow6d2cd902018-05-16 15:04:57 -04001674 data->free = PyMem_Free;
1675 return 0;
1676}
1677
1678struct _shared_str_data {
1679 int kind;
1680 const void *buffer;
1681 Py_ssize_t len;
1682};
1683
1684static PyObject *
1685_new_str_object(_PyCrossInterpreterData *data)
1686{
1687 struct _shared_str_data *shared = (struct _shared_str_data *)(data->data);
1688 return PyUnicode_FromKindAndData(shared->kind, shared->buffer, shared->len);
1689}
1690
1691static int
1692_str_shared(PyObject *obj, _PyCrossInterpreterData *data)
1693{
1694 struct _shared_str_data *shared = PyMem_NEW(struct _shared_str_data, 1);
1695 shared->kind = PyUnicode_KIND(obj);
1696 shared->buffer = PyUnicode_DATA(obj);
1697 shared->len = PyUnicode_GET_LENGTH(obj) - 1;
1698 data->data = (void *)shared;
Eric Snow63799132018-06-01 18:45:20 -06001699 Py_INCREF(obj);
Eric Snow6d2cd902018-05-16 15:04:57 -04001700 data->obj = obj; // Will be "released" (decref'ed) when data released.
1701 data->new_object = _new_str_object;
1702 data->free = PyMem_Free;
1703 return 0;
1704}
1705
1706static PyObject *
1707_new_long_object(_PyCrossInterpreterData *data)
1708{
Alexey Izbyshev16f842d2019-02-12 19:06:43 +03001709 return PyLong_FromSsize_t((Py_ssize_t)(data->data));
Eric Snow6d2cd902018-05-16 15:04:57 -04001710}
1711
1712static int
1713_long_shared(PyObject *obj, _PyCrossInterpreterData *data)
1714{
Alexey Izbyshev16f842d2019-02-12 19:06:43 +03001715 /* Note that this means the size of shareable ints is bounded by
1716 * sys.maxsize. Hence on 32-bit architectures that is half the
1717 * size of maximum shareable ints on 64-bit.
1718 */
1719 Py_ssize_t value = PyLong_AsSsize_t(obj);
Eric Snow6d2cd902018-05-16 15:04:57 -04001720 if (value == -1 && PyErr_Occurred()) {
1721 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1722 PyErr_SetString(PyExc_OverflowError, "try sending as bytes");
1723 }
1724 return -1;
1725 }
1726 data->data = (void *)value;
1727 data->obj = NULL;
1728 data->new_object = _new_long_object;
1729 data->free = NULL;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001730 return 0;
1731}
1732
1733static PyObject *
1734_new_none_object(_PyCrossInterpreterData *data)
1735{
1736 // XXX Singleton refcounts are problematic across interpreters...
1737 Py_INCREF(Py_None);
1738 return Py_None;
1739}
1740
1741static int
1742_none_shared(PyObject *obj, _PyCrossInterpreterData *data)
1743{
1744 data->data = NULL;
1745 // data->obj remains NULL
1746 data->new_object = _new_none_object;
1747 data->free = NULL; // There is nothing to free.
1748 return 0;
1749}
1750
1751static void
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001752_register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry)
Eric Snow7f8bfc92018-01-29 18:23:44 -07001753{
1754 // None
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001755 if (_register_xidata(xidregistry, (PyTypeObject *)PyObject_Type(Py_None), _none_shared) != 0) {
Eric Snow7f8bfc92018-01-29 18:23:44 -07001756 Py_FatalError("could not register None for cross-interpreter sharing");
1757 }
1758
Eric Snow6d2cd902018-05-16 15:04:57 -04001759 // int
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001760 if (_register_xidata(xidregistry, &PyLong_Type, _long_shared) != 0) {
Eric Snow6d2cd902018-05-16 15:04:57 -04001761 Py_FatalError("could not register int for cross-interpreter sharing");
1762 }
1763
Eric Snow7f8bfc92018-01-29 18:23:44 -07001764 // bytes
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001765 if (_register_xidata(xidregistry, &PyBytes_Type, _bytes_shared) != 0) {
Eric Snow7f8bfc92018-01-29 18:23:44 -07001766 Py_FatalError("could not register bytes for cross-interpreter sharing");
1767 }
Eric Snow6d2cd902018-05-16 15:04:57 -04001768
1769 // str
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001770 if (_register_xidata(xidregistry, &PyUnicode_Type, _str_shared) != 0) {
Eric Snow6d2cd902018-05-16 15:04:57 -04001771 Py_FatalError("could not register str for cross-interpreter sharing");
1772 }
Eric Snow7f8bfc92018-01-29 18:23:44 -07001773}
1774
1775
Victor Stinner0b72b232020-03-12 23:18:39 +01001776_PyFrameEvalFunction
1777_PyInterpreterState_GetEvalFrameFunc(PyInterpreterState *interp)
1778{
1779 return interp->eval_frame;
1780}
1781
1782
1783void
1784_PyInterpreterState_SetEvalFrameFunc(PyInterpreterState *interp,
1785 _PyFrameEvalFunction eval_frame)
1786{
1787 interp->eval_frame = eval_frame;
1788}
1789
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001790#ifdef __cplusplus
1791}
1792#endif