blob: f2924a8ff2632d7474cb22d69d312d598893764e [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 Stinner621cebe2018-11-12 16:53:38 +01007#include "pycore_pymem.h"
8#include "pycore_pystate.h"
Eric Snow86ea5812019-05-10 13:29:55 -04009#include "pycore_pylifecycle.h"
Guido van Rossuma027efa1997-05-05 20:56:21 +000010
Tim Peters84705582004-10-10 02:47:33 +000011/* --------------------------------------------------------------------------
12CAUTION
13
Victor Stinner1a7425f2013-07-07 16:25:15 +020014Always use PyMem_RawMalloc() and PyMem_RawFree() directly in this file. A
15number of these functions are advertised as safe to call when the GIL isn't
16held, and in a debug build Python redirects (e.g.) PyMem_NEW (etc) to Python's
17debugging obmalloc functions. Those aren't thread-safe (they rely on the GIL
18to avoid the expense of doing their own locking).
Tim Peters84705582004-10-10 02:47:33 +000019-------------------------------------------------------------------------- */
20
Martin v. Löwisf0473d52001-07-18 16:17:16 +000021#ifdef HAVE_DLOPEN
22#ifdef HAVE_DLFCN_H
23#include <dlfcn.h>
24#endif
Serhiy Storchakac2f7d872016-05-04 09:44:44 +030025#if !HAVE_DECL_RTLD_LAZY
Martin v. Löwisf0473d52001-07-18 16:17:16 +000026#define RTLD_LAZY 1
27#endif
28#endif
29
Benjamin Peterson43162b82012-04-13 11:58:27 -040030#ifdef __cplusplus
31extern "C" {
32#endif
Martin v. Löwisf0473d52001-07-18 16:17:16 +000033
Victor Stinner10c8e6a2019-04-26 01:53:18 +020034#define _PyRuntimeGILState_GetThreadState(gilstate) \
35 ((PyThreadState*)_Py_atomic_load_relaxed(&(gilstate)->tstate_current))
36#define _PyRuntimeGILState_SetThreadState(gilstate, value) \
37 _Py_atomic_store_relaxed(&(gilstate)->tstate_current, \
38 (uintptr_t)(value))
39
40/* Forward declarations */
41static PyThreadState *_PyGILState_GetThisThreadState(struct _gilstate_runtime_state *gilstate);
Victor Stinner0fd2c302019-06-04 03:15:09 +020042static void _PyThreadState_Delete(_PyRuntimeState *runtime, PyThreadState *tstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +020043
44
Victor Stinner331a6a52019-05-27 16:39:22 +020045static PyStatus
Victor Stinner5d39e042017-11-29 17:20:38 +010046_PyRuntimeState_Init_impl(_PyRuntimeState *runtime)
Eric Snow2ebc5ce2017-09-07 23:51:28 -060047{
Steve Dowerb82e17e2019-05-23 08:45:22 -070048 /* We preserve the hook across init, because there is
49 currently no public API to set it between runtime
50 initialization and interpreter initialization. */
51 void *open_code_hook = runtime->open_code_hook;
52 void *open_code_userdata = runtime->open_code_userdata;
53 _Py_AuditHookEntry *audit_hook_head = runtime->audit_hook_head;
54
Eric Snow2ebc5ce2017-09-07 23:51:28 -060055 memset(runtime, 0, sizeof(*runtime));
Victor Stinner8a1be612016-03-14 22:07:55 +010056
Steve Dowerb82e17e2019-05-23 08:45:22 -070057 runtime->open_code_hook = open_code_hook;
58 runtime->open_code_userdata = open_code_userdata;
59 runtime->audit_hook_head = audit_hook_head;
60
Eric Snow2ebc5ce2017-09-07 23:51:28 -060061 _PyGC_Initialize(&runtime->gc);
62 _PyEval_Initialize(&runtime->ceval);
Victor Stinner331a6a52019-05-27 16:39:22 +020063 PyPreConfig_InitPythonConfig(&runtime->preconfig);
Michael W. Hudson188d4362005-06-20 16:52:57 +000064
Eric Snow2ebc5ce2017-09-07 23:51:28 -060065 runtime->gilstate.check_enabled = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -080066
Masayuki Yamamoto731e1892017-10-06 19:41:34 +090067 /* A TSS key must be initialized with Py_tss_NEEDS_INIT
68 in accordance with the specification. */
Victor Stinnerf7e5b562017-11-15 15:48:08 -080069 Py_tss_t initial = Py_tss_NEEDS_INIT;
70 runtime->gilstate.autoTSSkey = initial;
Guido van Rossum1d5ad901999-06-18 14:22:24 +000071
Eric Snow2ebc5ce2017-09-07 23:51:28 -060072 runtime->interpreters.mutex = PyThread_allocate_lock();
Victor Stinnerf7e5b562017-11-15 15:48:08 -080073 if (runtime->interpreters.mutex == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +020074 return _PyStatus_ERR("Can't initialize threads for interpreter");
Victor Stinnerf7e5b562017-11-15 15:48:08 -080075 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -060076 runtime->interpreters.next_id = -1;
Eric Snow7f8bfc92018-01-29 18:23:44 -070077
78 runtime->xidregistry.mutex = PyThread_allocate_lock();
79 if (runtime->xidregistry.mutex == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +020080 return _PyStatus_ERR("Can't initialize threads for cross-interpreter data registry");
Eric Snow7f8bfc92018-01-29 18:23:44 -070081 }
82
Eric Snow8479a342019-03-08 23:44:33 -070083 // Set it to the ID of the main thread of the main interpreter.
84 runtime->main_thread = PyThread_get_thread_ident();
Eric Snow5be45a62019-03-08 22:47:07 -070085
Victor Stinner331a6a52019-05-27 16:39:22 +020086 return _PyStatus_OK();
Eric Snow2ebc5ce2017-09-07 23:51:28 -060087}
Eric Snow05351c12017-09-05 21:43:08 -070088
Victor Stinner331a6a52019-05-27 16:39:22 +020089PyStatus
Victor Stinner5d39e042017-11-29 17:20:38 +010090_PyRuntimeState_Init(_PyRuntimeState *runtime)
91{
92 /* Force default allocator, since _PyRuntimeState_Fini() must
93 use the same allocator than this function. */
94 PyMemAllocatorEx old_alloc;
95 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
96
Victor Stinner331a6a52019-05-27 16:39:22 +020097 PyStatus status = _PyRuntimeState_Init_impl(runtime);
Victor Stinner5d39e042017-11-29 17:20:38 +010098
99 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinner331a6a52019-05-27 16:39:22 +0200100 return status;
Victor Stinner5d39e042017-11-29 17:20:38 +0100101}
102
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600103void
104_PyRuntimeState_Fini(_PyRuntimeState *runtime)
105{
Victor Stinner5d39e042017-11-29 17:20:38 +0100106 /* Force the allocator used by _PyRuntimeState_Init(). */
107 PyMemAllocatorEx old_alloc;
108 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinnerccb04422017-11-16 03:20:31 -0800109
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600110 if (runtime->interpreters.mutex != NULL) {
111 PyThread_free_lock(runtime->interpreters.mutex);
112 runtime->interpreters.mutex = NULL;
113 }
Victor Stinnerccb04422017-11-16 03:20:31 -0800114
Stéphane Wirtel943395f2019-03-19 11:51:32 +0100115 if (runtime->xidregistry.mutex != NULL) {
116 PyThread_free_lock(runtime->xidregistry.mutex);
117 runtime->xidregistry.mutex = NULL;
118 }
119
Victor Stinnerccb04422017-11-16 03:20:31 -0800120 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600121}
122
Eric Snow8479a342019-03-08 23:44:33 -0700123/* This function is called from PyOS_AfterFork_Child to ensure that
124 * newly created child processes do not share locks with the parent.
125 */
126
127void
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200128_PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime)
Eric Snow8479a342019-03-08 23:44:33 -0700129{
130 // This was initially set in _PyRuntimeState_Init().
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200131 runtime->main_thread = PyThread_get_thread_ident();
Eric Snow8479a342019-03-08 23:44:33 -0700132
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200133 /* Force default allocator, since _PyRuntimeState_Fini() must
134 use the same allocator than this function. */
135 PyMemAllocatorEx old_alloc;
136 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
137
138 runtime->interpreters.mutex = PyThread_allocate_lock();
139 runtime->interpreters.main->id_mutex = PyThread_allocate_lock();
140 runtime->xidregistry.mutex = PyThread_allocate_lock();
141
142 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
143
144 if (runtime->interpreters.mutex == NULL) {
Eric Snow8479a342019-03-08 23:44:33 -0700145 Py_FatalError("Can't initialize lock for runtime interpreters");
146 }
147
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200148 if (runtime->interpreters.main->id_mutex == NULL) {
Eric Snow8479a342019-03-08 23:44:33 -0700149 Py_FatalError("Can't initialize ID lock for main interpreter");
150 }
151
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200152 if (runtime->xidregistry.mutex == NULL) {
Eric Snow8479a342019-03-08 23:44:33 -0700153 Py_FatalError("Can't initialize lock for cross-interpreter data registry");
154 }
155}
156
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200157#define HEAD_LOCK(runtime) \
158 PyThread_acquire_lock((runtime)->interpreters.mutex, WAIT_LOCK)
159#define HEAD_UNLOCK(runtime) \
160 PyThread_release_lock((runtime)->interpreters.mutex)
Eric Snow05351c12017-09-05 21:43:08 -0700161
Victor Stinner8bb32302019-04-24 16:47:40 +0200162/* Forward declaration */
163static void _PyGILState_NoteThreadState(
164 struct _gilstate_runtime_state *gilstate, PyThreadState* tstate);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000165
Victor Stinner331a6a52019-05-27 16:39:22 +0200166PyStatus
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600167_PyInterpreterState_Enable(_PyRuntimeState *runtime)
Eric Snowe3774162017-05-22 19:46:40 -0700168{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200169 struct pyinterpreters *interpreters = &runtime->interpreters;
170 interpreters->next_id = 0;
Victor Stinner5d926472018-03-06 14:31:37 +0100171
172 /* Py_Finalize() calls _PyRuntimeState_Fini() which clears the mutex.
173 Create a new mutex if needed. */
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200174 if (interpreters->mutex == NULL) {
Victor Stinner5d926472018-03-06 14:31:37 +0100175 /* Force default allocator, since _PyRuntimeState_Fini() must
176 use the same allocator than this function. */
177 PyMemAllocatorEx old_alloc;
178 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
179
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200180 interpreters->mutex = PyThread_allocate_lock();
Victor Stinner5d926472018-03-06 14:31:37 +0100181
182 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
183
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200184 if (interpreters->mutex == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +0200185 return _PyStatus_ERR("Can't initialize threads for interpreter");
Victor Stinnera7368ac2017-11-15 18:11:45 -0800186 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600187 }
Victor Stinner5d926472018-03-06 14:31:37 +0100188
Victor Stinner331a6a52019-05-27 16:39:22 +0200189 return _PyStatus_OK();
Eric Snowe3774162017-05-22 19:46:40 -0700190}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000191
192PyInterpreterState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000193PyInterpreterState_New(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000194{
Steve Dowerb82e17e2019-05-23 08:45:22 -0700195 if (PySys_Audit("cpython.PyInterpreterState_New", NULL) < 0) {
196 return NULL;
197 }
198
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200199 PyInterpreterState *interp = PyMem_RawMalloc(sizeof(PyInterpreterState));
Victor Stinnerd4341102017-11-23 00:12:09 +0100200 if (interp == NULL) {
201 return NULL;
202 }
203
Eric Snow5be45a62019-03-08 22:47:07 -0700204 memset(interp, 0, sizeof(*interp));
Eric Snow4c6955e2018-02-16 18:53:40 -0700205 interp->id_refcount = -1;
Victor Stinnerd4341102017-11-23 00:12:09 +0100206 interp->check_interval = 100;
Victor Stinner022be022019-05-22 23:58:50 +0200207
Victor Stinner331a6a52019-05-27 16:39:22 +0200208 PyStatus status = PyConfig_InitPythonConfig(&interp->config);
209 if (_PyStatus_EXCEPTION(status)) {
210 /* Don't report status to caller: PyConfig_InitPythonConfig()
211 can only fail with a memory allocation error. */
212 PyConfig_Clear(&interp->config);
Victor Stinner022be022019-05-22 23:58:50 +0200213 PyMem_RawFree(interp);
214 return NULL;
215 }
216
Victor Stinnerd4341102017-11-23 00:12:09 +0100217 interp->eval_frame = _PyEval_EvalFrameDefault;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000218#ifdef HAVE_DLOPEN
Serhiy Storchakac2f7d872016-05-04 09:44:44 +0300219#if HAVE_DECL_RTLD_NOW
Victor Stinnerd4341102017-11-23 00:12:09 +0100220 interp->dlopenflags = RTLD_NOW;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000221#else
Victor Stinnerd4341102017-11-23 00:12:09 +0100222 interp->dlopenflags = RTLD_LAZY;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000223#endif
224#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000225
Victor Stinner0fd2c302019-06-04 03:15:09 +0200226 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200227 struct pyinterpreters *interpreters = &runtime->interpreters;
228
229 HEAD_LOCK(runtime);
230 if (interpreters->next_id < 0) {
Victor Stinnerd4341102017-11-23 00:12:09 +0100231 /* overflow or Py_Initialize() not called! */
232 PyErr_SetString(PyExc_RuntimeError,
233 "failed to get an interpreter ID");
Pablo Galindo95d630e2018-08-31 22:49:29 +0100234 PyMem_RawFree(interp);
Victor Stinnerd4341102017-11-23 00:12:09 +0100235 interp = NULL;
Victor Stinnerd4341102017-11-23 00:12:09 +0100236 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200237 else {
238 interp->id = interpreters->next_id;
239 interpreters->next_id += 1;
240 interp->next = interpreters->head;
241 if (interpreters->main == NULL) {
242 interpreters->main = interp;
243 }
244 interpreters->head = interp;
245 }
246 HEAD_UNLOCK(runtime);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000247
Pablo Galindo95d630e2018-08-31 22:49:29 +0100248 if (interp == NULL) {
249 return NULL;
250 }
251
Yury Selivanovf23746a2018-01-22 19:11:18 -0500252 interp->tstate_next_unique_id = 0;
253
Steve Dowerb82e17e2019-05-23 08:45:22 -0700254 interp->audit_hooks = NULL;
255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 return interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000257}
258
259
Victor Stinner0fd2c302019-06-04 03:15:09 +0200260static void
261_PyInterpreterState_Clear(_PyRuntimeState *runtime, PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000262{
Steve Dowerb82e17e2019-05-23 08:45:22 -0700263 if (PySys_Audit("cpython.PyInterpreterState_Clear", NULL) < 0) {
264 PyErr_Clear();
265 }
266
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200267 HEAD_LOCK(runtime);
268 for (PyThreadState *p = interp->tstate_head; p != NULL; p = p->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000269 PyThreadState_Clear(p);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200270 }
271 HEAD_UNLOCK(runtime);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700272
273 Py_CLEAR(interp->audit_hooks);
274
Victor Stinner331a6a52019-05-27 16:39:22 +0200275 PyConfig_Clear(&interp->config);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000276 Py_CLEAR(interp->codec_search_path);
277 Py_CLEAR(interp->codec_search_cache);
278 Py_CLEAR(interp->codec_error_registry);
Eric Snow93c92f72017-09-13 23:46:04 -0700279 Py_CLEAR(interp->modules);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 Py_CLEAR(interp->modules_by_index);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 Py_CLEAR(interp->sysdict);
282 Py_CLEAR(interp->builtins);
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200283 Py_CLEAR(interp->builtins_copy);
Brett Cannonfd074152012-04-14 14:10:13 -0400284 Py_CLEAR(interp->importlib);
Serhiy Storchaka133138a2016-08-02 22:51:21 +0300285 Py_CLEAR(interp->import_func);
Eric Snowd2fdd1f2019-03-15 17:47:43 -0600286 Py_CLEAR(interp->dict);
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200287#ifdef HAVE_FORK
288 Py_CLEAR(interp->before_forkers);
289 Py_CLEAR(interp->after_forkers_parent);
290 Py_CLEAR(interp->after_forkers_child);
291#endif
Eric Snow86ea5812019-05-10 13:29:55 -0400292 if (runtime->finalizing == NULL) {
293 _PyWarnings_Fini(interp);
294 }
Eric Snow5be45a62019-03-08 22:47:07 -0700295 // XXX Once we have one allocator per interpreter (i.e.
296 // per-interpreter GC) we must ensure that all of the interpreter's
297 // objects have been cleaned up at the point.
Guido van Rossum25ce5661997-08-02 03:10:38 +0000298}
299
Victor Stinner0fd2c302019-06-04 03:15:09 +0200300void
301PyInterpreterState_Clear(PyInterpreterState *interp)
302{
303 _PyInterpreterState_Clear(&_PyRuntime, interp);
304}
305
Guido van Rossum25ce5661997-08-02 03:10:38 +0000306
307static void
Victor Stinner0fd2c302019-06-04 03:15:09 +0200308zapthreads(_PyRuntimeState *runtime, PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000309{
Victor Stinner0fd2c302019-06-04 03:15:09 +0200310 PyThreadState *p;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 /* No need to lock the mutex here because this should only happen
312 when the threads are all really dead (XXX famous last words). */
Victor Stinner0fd2c302019-06-04 03:15:09 +0200313 while ((p = interp->tstate_head) != NULL) {
314 _PyThreadState_Delete(runtime, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000316}
317
318
Victor Stinner0fd2c302019-06-04 03:15:09 +0200319static void
320_PyInterpreterState_Delete(_PyRuntimeState *runtime,
321 PyInterpreterState *interp)
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200322{
323 struct pyinterpreters *interpreters = &runtime->interpreters;
Victor Stinner0fd2c302019-06-04 03:15:09 +0200324 zapthreads(runtime, interp);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200325 HEAD_LOCK(runtime);
326 PyInterpreterState **p;
327 for (p = &interpreters->head; ; p = &(*p)->next) {
328 if (*p == NULL) {
329 Py_FatalError("PyInterpreterState_Delete: invalid interp");
330 }
331 if (*p == interp) {
332 break;
333 }
334 }
335 if (interp->tstate_head != NULL) {
336 Py_FatalError("PyInterpreterState_Delete: remaining threads");
337 }
338 *p = interp->next;
339 if (interpreters->main == interp) {
340 interpreters->main = NULL;
341 if (interpreters->head != NULL) {
342 Py_FatalError("PyInterpreterState_Delete: remaining subinterpreters");
343 }
344 }
345 HEAD_UNLOCK(runtime);
346 if (interp->id_mutex != NULL) {
347 PyThread_free_lock(interp->id_mutex);
348 }
349 PyMem_RawFree(interp);
350}
351
352
Victor Stinner0fd2c302019-06-04 03:15:09 +0200353void
354PyInterpreterState_Delete(PyInterpreterState *interp)
355{
356 _PyInterpreterState_Delete(&_PyRuntime, interp);
357}
358
359
Eric Snow59032962018-09-14 14:17:20 -0700360/*
361 * Delete all interpreter states except the main interpreter. If there
362 * is a current interpreter state, it *must* be the main interpreter.
363 */
364void
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200365_PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime)
Eric Snow59032962018-09-14 14:17:20 -0700366{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200367 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200368 struct pyinterpreters *interpreters = &runtime->interpreters;
369
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200370 PyThreadState *tstate = _PyThreadState_Swap(gilstate, NULL);
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200371 if (tstate != NULL && tstate->interp != interpreters->main) {
Eric Snow59032962018-09-14 14:17:20 -0700372 Py_FatalError("PyInterpreterState_DeleteExceptMain: not main interpreter");
373 }
374
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200375 HEAD_LOCK(runtime);
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200376 PyInterpreterState *interp = interpreters->head;
377 interpreters->head = NULL;
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100378 while (interp != NULL) {
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200379 if (interp == interpreters->main) {
380 interpreters->main->next = NULL;
381 interpreters->head = interp;
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100382 interp = interp->next;
Eric Snow59032962018-09-14 14:17:20 -0700383 continue;
384 }
385
Victor Stinner0fd2c302019-06-04 03:15:09 +0200386 _PyInterpreterState_Clear(runtime, interp); // XXX must activate?
387 zapthreads(runtime, interp);
Eric Snow59032962018-09-14 14:17:20 -0700388 if (interp->id_mutex != NULL) {
389 PyThread_free_lock(interp->id_mutex);
390 }
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100391 PyInterpreterState *prev_interp = interp;
392 interp = interp->next;
393 PyMem_RawFree(prev_interp);
Eric Snow59032962018-09-14 14:17:20 -0700394 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200395 HEAD_UNLOCK(runtime);
Eric Snow59032962018-09-14 14:17:20 -0700396
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200397 if (interpreters->head == NULL) {
Eric Snow59032962018-09-14 14:17:20 -0700398 Py_FatalError("PyInterpreterState_DeleteExceptMain: missing main");
399 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200400 _PyThreadState_Swap(gilstate, tstate);
Eric Snow59032962018-09-14 14:17:20 -0700401}
402
403
Victor Stinnercaba55b2018-08-03 15:33:52 +0200404PyInterpreterState *
405_PyInterpreterState_Get(void)
406{
Victor Stinner50b48572018-11-01 01:51:40 +0100407 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnercaba55b2018-08-03 15:33:52 +0200408 if (tstate == NULL) {
409 Py_FatalError("_PyInterpreterState_Get(): no current thread state");
410 }
411 PyInterpreterState *interp = tstate->interp;
412 if (interp == NULL) {
413 Py_FatalError("_PyInterpreterState_Get(): no current interpreter");
414 }
415 return interp;
416}
417
418
Eric Snowe3774162017-05-22 19:46:40 -0700419int64_t
420PyInterpreterState_GetID(PyInterpreterState *interp)
421{
422 if (interp == NULL) {
423 PyErr_SetString(PyExc_RuntimeError, "no interpreter provided");
424 return -1;
425 }
426 return interp->id;
427}
428
429
Eric Snow5be45a62019-03-08 22:47:07 -0700430static PyInterpreterState *
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200431interp_look_up_id(_PyRuntimeState *runtime, PY_INT64_T requested_id)
Eric Snowb05b7112019-03-01 12:35:10 -0700432{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200433 PyInterpreterState *interp = runtime->interpreters.head;
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100434 while (interp != NULL) {
435 PY_INT64_T id = PyInterpreterState_GetID(interp);
Eric Snow5be45a62019-03-08 22:47:07 -0700436 if (id < 0) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100437 return NULL;
Eric Snow5be45a62019-03-08 22:47:07 -0700438 }
439 if (requested_id == id) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100440 return interp;
Eric Snow5be45a62019-03-08 22:47:07 -0700441 }
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100442 interp = PyInterpreterState_Next(interp);
Eric Snowb05b7112019-03-01 12:35:10 -0700443 }
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100444 return NULL;
Eric Snowb05b7112019-03-01 12:35:10 -0700445}
446
Eric Snow5be45a62019-03-08 22:47:07 -0700447PyInterpreterState *
448_PyInterpreterState_LookUpID(PY_INT64_T requested_id)
449{
450 PyInterpreterState *interp = NULL;
451 if (requested_id >= 0) {
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200452 _PyRuntimeState *runtime = &_PyRuntime;
453 HEAD_LOCK(runtime);
454 interp = interp_look_up_id(runtime, requested_id);
455 HEAD_UNLOCK(runtime);
Eric Snow5be45a62019-03-08 22:47:07 -0700456 }
457 if (interp == NULL && !PyErr_Occurred()) {
458 PyErr_Format(PyExc_RuntimeError,
459 "unrecognized interpreter ID %lld", requested_id);
460 }
461 return interp;
462}
463
Eric Snow4c6955e2018-02-16 18:53:40 -0700464
465int
466_PyInterpreterState_IDInitref(PyInterpreterState *interp)
467{
468 if (interp->id_mutex != NULL) {
469 return 0;
470 }
471 interp->id_mutex = PyThread_allocate_lock();
472 if (interp->id_mutex == NULL) {
473 PyErr_SetString(PyExc_RuntimeError,
474 "failed to create init interpreter ID mutex");
475 return -1;
476 }
477 interp->id_refcount = 0;
478 return 0;
479}
480
481
482void
483_PyInterpreterState_IDIncref(PyInterpreterState *interp)
484{
485 if (interp->id_mutex == NULL) {
486 return;
487 }
488 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
489 interp->id_refcount += 1;
490 PyThread_release_lock(interp->id_mutex);
491}
492
493
494void
495_PyInterpreterState_IDDecref(PyInterpreterState *interp)
496{
497 if (interp->id_mutex == NULL) {
498 return;
499 }
Victor Stinner0fd2c302019-06-04 03:15:09 +0200500 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
Eric Snow4c6955e2018-02-16 18:53:40 -0700501 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
502 assert(interp->id_refcount != 0);
503 interp->id_refcount -= 1;
504 int64_t refcount = interp->id_refcount;
505 PyThread_release_lock(interp->id_mutex);
506
Eric Snowc11183c2019-03-15 16:35:46 -0600507 if (refcount == 0 && interp->requires_idref) {
Eric Snowf53d9f22018-02-20 16:30:17 -0700508 // XXX Using the "head" thread isn't strictly correct.
509 PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
510 // XXX Possible GILState issues?
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200511 PyThreadState *save_tstate = _PyThreadState_Swap(gilstate, tstate);
Eric Snow4c6955e2018-02-16 18:53:40 -0700512 Py_EndInterpreter(tstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200513 _PyThreadState_Swap(gilstate, save_tstate);
Eric Snow4c6955e2018-02-16 18:53:40 -0700514 }
515}
516
Eric Snowc11183c2019-03-15 16:35:46 -0600517int
518_PyInterpreterState_RequiresIDRef(PyInterpreterState *interp)
519{
520 return interp->requires_idref;
521}
522
523void
524_PyInterpreterState_RequireIDRef(PyInterpreterState *interp, int required)
525{
526 interp->requires_idref = required ? 1 : 0;
527}
528
Eric Snowc11183c2019-03-15 16:35:46 -0600529PyObject *
530_PyInterpreterState_GetMainModule(PyInterpreterState *interp)
531{
532 if (interp->modules == NULL) {
533 PyErr_SetString(PyExc_RuntimeError, "interpreter not initialized");
534 return NULL;
535 }
536 return PyMapping_GetItemString(interp->modules, "__main__");
537}
538
Eric Snowd2fdd1f2019-03-15 17:47:43 -0600539PyObject *
540PyInterpreterState_GetDict(PyInterpreterState *interp)
541{
542 if (interp->dict == NULL) {
543 interp->dict = PyDict_New();
544 if (interp->dict == NULL) {
545 PyErr_Clear();
546 }
547 }
548 /* Returning NULL means no per-interpreter dict is available. */
549 return interp->dict;
550}
551
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000552/* Default implementation for _PyThreadState_GetFrame */
553static struct _frame *
554threadstate_getframe(PyThreadState *self)
555{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 return self->frame;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000557}
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 Stinner0fd2c302019-06-04 03:15:09 +0200562 _PyRuntimeState *runtime = &_PyRuntime;
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 if (_PyThreadState_GetFrame == NULL) {
569 _PyThreadState_GetFrame = threadstate_getframe;
570 }
571
572 tstate->interp = interp;
573
574 tstate->frame = NULL;
575 tstate->recursion_depth = 0;
576 tstate->overflowed = 0;
577 tstate->recursion_critical = 0;
578 tstate->stackcheck_counter = 0;
579 tstate->tracing = 0;
580 tstate->use_tracing = 0;
581 tstate->gilstate_counter = 0;
582 tstate->async_exc = NULL;
583 tstate->thread_id = PyThread_get_thread_ident();
584
585 tstate->dict = NULL;
586
587 tstate->curexc_type = NULL;
588 tstate->curexc_value = NULL;
589 tstate->curexc_traceback = NULL;
590
591 tstate->exc_state.exc_type = NULL;
592 tstate->exc_state.exc_value = NULL;
593 tstate->exc_state.exc_traceback = NULL;
594 tstate->exc_state.previous_item = NULL;
595 tstate->exc_info = &tstate->exc_state;
596
597 tstate->c_profilefunc = NULL;
598 tstate->c_tracefunc = NULL;
599 tstate->c_profileobj = NULL;
600 tstate->c_traceobj = NULL;
601
602 tstate->trash_delete_nesting = 0;
603 tstate->trash_delete_later = NULL;
604 tstate->on_delete = NULL;
605 tstate->on_delete_data = NULL;
606
607 tstate->coroutine_origin_tracking_depth = 0;
608
Victor Stinner8bb32302019-04-24 16:47:40 +0200609 tstate->async_gen_firstiter = NULL;
610 tstate->async_gen_finalizer = NULL;
611
612 tstate->context = NULL;
613 tstate->context_ver = 1;
614
615 tstate->id = ++interp->tstate_next_unique_id;
616
617 if (init) {
Victor Stinner0fd2c302019-06-04 03:15:09 +0200618 _PyThreadState_Init(runtime, tstate);
Victor Stinner8bb32302019-04-24 16:47:40 +0200619 }
620
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200621 HEAD_LOCK(runtime);
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 Stinner0fd2c302019-06-04 03:15:09 +0200645_PyThreadState_Init(_PyRuntimeState *runtime, PyThreadState *tstate)
Victor Stinner45b9be52010-03-03 23:28:07 +0000646{
Victor Stinner8bb32302019-04-24 16:47:40 +0200647 _PyGILState_NoteThreadState(&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 Stinner9204fb82018-10-30 15:13:17 +0100654 PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE();
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
670_PyState_AddModule(PyObject* module, struct PyModuleDef* def)
671{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000672 PyInterpreterState *state;
Berker Peksag4b7b5652016-08-22 18:05:56 +0300673 if (!def) {
674 assert(PyErr_Occurred());
675 return -1;
676 }
Nick Coghland5cacbb2015-05-23 22:24:10 +1000677 if (def->m_slots) {
678 PyErr_SetString(PyExc_SystemError,
679 "PyState_AddModule called on module with slots");
680 return -1;
681 }
Victor Stinner9204fb82018-10-30 15:13:17 +0100682 state = _PyInterpreterState_GET_UNSAFE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 if (!state->modules_by_index) {
684 state->modules_by_index = PyList_New(0);
685 if (!state->modules_by_index)
686 return -1;
687 }
Miss Islington (bot)a5a71022019-09-11 17:04:27 -0700688 while (PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 if (PyList_Append(state->modules_by_index, Py_None) < 0)
690 return -1;
691 Py_INCREF(module);
692 return PyList_SetItem(state->modules_by_index,
693 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000694}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000695
Martin v. Löwis7800f752012-06-22 12:20:55 +0200696int
697PyState_AddModule(PyObject* module, struct PyModuleDef* def)
698{
699 Py_ssize_t index;
Victor Stinner9204fb82018-10-30 15:13:17 +0100700 PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200701 if (!def) {
702 Py_FatalError("PyState_AddModule: Module Definition is NULL");
703 return -1;
704 }
705 index = def->m_base.m_index;
Miss Islington (bot)a5a71022019-09-11 17:04:27 -0700706 if (state->modules_by_index &&
707 index < PyList_GET_SIZE(state->modules_by_index) &&
708 module == PyList_GET_ITEM(state->modules_by_index, index)) {
709 Py_FatalError("PyState_AddModule: Module already added!");
710 return -1;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200711 }
712 return _PyState_AddModule(module, def);
713}
714
715int
716PyState_RemoveModule(struct PyModuleDef* def)
717{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000718 PyInterpreterState *state;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200719 Py_ssize_t index = def->m_base.m_index;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000720 if (def->m_slots) {
721 PyErr_SetString(PyExc_SystemError,
722 "PyState_RemoveModule called on module with slots");
723 return -1;
724 }
Victor Stinner9204fb82018-10-30 15:13:17 +0100725 state = _PyInterpreterState_GET_UNSAFE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200726 if (index == 0) {
727 Py_FatalError("PyState_RemoveModule: Module index invalid.");
728 return -1;
729 }
730 if (state->modules_by_index == NULL) {
Miss Islington (bot)4bd1d052019-08-30 13:42:54 -0700731 Py_FatalError("PyState_RemoveModule: Interpreters module-list not accessible.");
Martin v. Löwis7800f752012-06-22 12:20:55 +0200732 return -1;
733 }
734 if (index > PyList_GET_SIZE(state->modules_by_index)) {
735 Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
736 return -1;
737 }
Zackery Spytz2a893432018-12-05 00:14:00 -0700738 Py_INCREF(Py_None);
Martin v. Löwis7800f752012-06-22 12:20:55 +0200739 return PyList_SetItem(state->modules_by_index, index, Py_None);
740}
741
Antoine Pitrou40322e62013-08-11 00:30:09 +0200742/* used by import.c:PyImport_Cleanup */
743void
744_PyState_ClearModules(void)
745{
Victor Stinner9204fb82018-10-30 15:13:17 +0100746 PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE();
Antoine Pitrou40322e62013-08-11 00:30:09 +0200747 if (state->modules_by_index) {
748 Py_ssize_t i;
749 for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) {
750 PyObject *m = PyList_GET_ITEM(state->modules_by_index, i);
751 if (PyModule_Check(m)) {
752 /* cleanup the saved copy of module dicts */
753 PyModuleDef *md = PyModule_GetDef(m);
754 if (md)
755 Py_CLEAR(md->m_base.m_copy);
756 }
757 }
758 /* Setting modules_by_index to NULL could be dangerous, so we
759 clear the list instead. */
760 if (PyList_SetSlice(state->modules_by_index,
761 0, PyList_GET_SIZE(state->modules_by_index),
762 NULL))
763 PyErr_WriteUnraisable(state->modules_by_index);
764 }
765}
766
Guido van Rossuma027efa1997-05-05 20:56:21 +0000767void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000768PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000769{
Victor Stinner331a6a52019-05-27 16:39:22 +0200770 int verbose = tstate->interp->config.verbose;
Victor Stinner53b7d4e2018-07-25 01:37:05 +0200771
772 if (verbose && tstate->frame != NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 fprintf(stderr,
774 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 Py_CLEAR(tstate->frame);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 Py_CLEAR(tstate->dict);
779 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 Py_CLEAR(tstate->curexc_type);
782 Py_CLEAR(tstate->curexc_value);
783 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000784
Mark Shannonae3087c2017-10-22 22:41:51 +0100785 Py_CLEAR(tstate->exc_state.exc_type);
786 Py_CLEAR(tstate->exc_state.exc_value);
787 Py_CLEAR(tstate->exc_state.exc_traceback);
Serhiy Storchakabdf42982017-10-26 16:59:40 +0300788
Mark Shannonae3087c2017-10-22 22:41:51 +0100789 /* The stack of exception states should contain just this thread. */
Victor Stinner53b7d4e2018-07-25 01:37:05 +0200790 if (verbose && tstate->exc_info != &tstate->exc_state) {
Mark Shannonae3087c2017-10-22 22:41:51 +0100791 fprintf(stderr,
792 "PyThreadState_Clear: warning: thread still has a generator\n");
793 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 tstate->c_profilefunc = NULL;
796 tstate->c_tracefunc = NULL;
797 Py_CLEAR(tstate->c_profileobj);
798 Py_CLEAR(tstate->c_traceobj);
Yury Selivanov75445082015-05-11 22:57:16 -0400799
Yury Selivanoveb636452016-09-08 22:01:51 -0700800 Py_CLEAR(tstate->async_gen_firstiter);
801 Py_CLEAR(tstate->async_gen_finalizer);
Yury Selivanovf23746a2018-01-22 19:11:18 -0500802
803 Py_CLEAR(tstate->context);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000804}
805
806
Guido van Rossum29757862001-01-23 01:46:06 +0000807/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
808static void
Victor Stinner0fd2c302019-06-04 03:15:09 +0200809tstate_delete_common(_PyRuntimeState *runtime, PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000810{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200811 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 Py_FatalError("PyThreadState_Delete: NULL tstate");
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200813 }
814 PyInterpreterState *interp = tstate->interp;
815 if (interp == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 Py_FatalError("PyThreadState_Delete: NULL interp");
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200817 }
818 HEAD_LOCK(runtime);
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200819 if (tstate->prev)
820 tstate->prev->next = tstate->next;
821 else
822 interp->tstate_head = tstate->next;
823 if (tstate->next)
824 tstate->next->prev = tstate->prev;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200825 HEAD_UNLOCK(runtime);
Antoine Pitrou7b476992013-09-07 23:38:37 +0200826 if (tstate->on_delete != NULL) {
827 tstate->on_delete(tstate->on_delete_data);
828 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200829 PyMem_RawFree(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000830}
831
832
Victor Stinner0fd2c302019-06-04 03:15:09 +0200833static void
834_PyThreadState_Delete(_PyRuntimeState *runtime, PyThreadState *tstate)
Guido van Rossum29757862001-01-23 01:46:06 +0000835{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200836 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
837 if (tstate == _PyRuntimeGILState_GetThreadState(gilstate)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000838 Py_FatalError("PyThreadState_Delete: tstate is still current");
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600839 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200840 if (gilstate->autoInterpreterState &&
841 PyThread_tss_get(&gilstate->autoTSSkey) == tstate)
842 {
843 PyThread_tss_set(&gilstate->autoTSSkey, NULL);
844 }
Victor Stinner0fd2c302019-06-04 03:15:09 +0200845 tstate_delete_common(runtime, tstate);
846}
847
848
849void
850PyThreadState_Delete(PyThreadState *tstate)
851{
852 _PyThreadState_Delete(&_PyRuntime, tstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200853}
854
855
856static void
857_PyThreadState_DeleteCurrent(_PyRuntimeState *runtime)
858{
859 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
860 PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 if (tstate == NULL)
862 Py_FatalError(
863 "PyThreadState_DeleteCurrent: no current tstate");
Victor Stinner0fd2c302019-06-04 03:15:09 +0200864 tstate_delete_common(runtime, tstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200865 if (gilstate->autoInterpreterState &&
866 PyThread_tss_get(&gilstate->autoTSSkey) == tstate)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600867 {
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200868 PyThread_tss_set(&gilstate->autoTSSkey, NULL);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600869 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200870 _PyRuntimeGILState_SetThreadState(gilstate, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 PyEval_ReleaseLock();
Guido van Rossum29757862001-01-23 01:46:06 +0000872}
Guido van Rossum29757862001-01-23 01:46:06 +0000873
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200874void
875PyThreadState_DeleteCurrent()
876{
877 _PyThreadState_DeleteCurrent(&_PyRuntime);
878}
879
Guido van Rossum29757862001-01-23 01:46:06 +0000880
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200881/*
882 * Delete all thread states except the one passed as argument.
883 * Note that, if there is a current thread state, it *must* be the one
884 * passed as argument. Also, this won't touch any other interpreters
885 * than the current one, since we don't know which thread state should
Miss Islington (bot)4bd1d052019-08-30 13:42:54 -0700886 * be kept in those other interpreters.
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200887 */
888void
Victor Stinner0fd2c302019-06-04 03:15:09 +0200889_PyThreadState_DeleteExcept(_PyRuntimeState *runtime, PyThreadState *tstate)
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200890{
891 PyInterpreterState *interp = tstate->interp;
892 PyThreadState *p, *next, *garbage;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200893 HEAD_LOCK(runtime);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200894 /* Remove all thread states, except tstate, from the linked list of
895 thread states. This will allow calling PyThreadState_Clear()
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200896 without holding the lock. */
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200897 garbage = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200898 if (garbage == tstate)
899 garbage = tstate->next;
900 if (tstate->prev)
901 tstate->prev->next = tstate->next;
902 if (tstate->next)
903 tstate->next->prev = tstate->prev;
904 tstate->prev = tstate->next = NULL;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200905 interp->tstate_head = tstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200906 HEAD_UNLOCK(runtime);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200907 /* Clear and deallocate all stale thread states. Even if this
908 executes Python code, we should be safe since it executes
909 in the current thread, not one of the stale threads. */
910 for (p = garbage; p; p = next) {
911 next = p->next;
912 PyThreadState_Clear(p);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200913 PyMem_RawFree(p);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200914 }
915}
916
917
Guido van Rossuma027efa1997-05-05 20:56:21 +0000918PyThreadState *
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100919_PyThreadState_UncheckedGet(void)
920{
Victor Stinner50b48572018-11-01 01:51:40 +0100921 return _PyThreadState_GET();
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100922}
923
924
925PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000926PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000927{
Victor Stinner50b48572018-11-01 01:51:40 +0100928 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 if (tstate == NULL)
930 Py_FatalError("PyThreadState_Get: no current thread");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000931
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000933}
934
935
Victor Stinner09532fe2019-05-10 23:39:09 +0200936PyThreadState *
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200937_PyThreadState_Swap(struct _gilstate_runtime_state *gilstate, PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000938{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200939 PyThreadState *oldts = _PyRuntimeGILState_GetThreadState(gilstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000940
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200941 _PyRuntimeGILState_SetThreadState(gilstate, newts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 /* It should not be possible for more than one thread state
943 to be used for a thread. Check this the best we can in debug
944 builds.
945 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200946#if defined(Py_DEBUG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 if (newts) {
948 /* This can be called from PyEval_RestoreThread(). Similar
949 to it, we need to ensure errno doesn't change.
950 */
951 int err = errno;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200952 PyThreadState *check = _PyGILState_GetThisThreadState(gilstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 if (check && check->interp == newts->interp && check != newts)
954 Py_FatalError("Invalid thread state for this thread");
955 errno = err;
956 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000957#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000959}
Guido van Rossumede04391998-04-10 20:18:25 +0000960
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200961PyThreadState *
962PyThreadState_Swap(PyThreadState *newts)
963{
964 return _PyThreadState_Swap(&_PyRuntime.gilstate, newts);
965}
966
Guido van Rossumede04391998-04-10 20:18:25 +0000967/* An extension mechanism to store arbitrary additional per-thread state.
968 PyThreadState_GetDict() returns a dictionary that can be used to hold such
969 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +0000970 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
971 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +0000972
973PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000974PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000975{
Victor Stinner50b48572018-11-01 01:51:40 +0100976 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 if (tstate == NULL)
978 return NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 if (tstate->dict == NULL) {
981 PyObject *d;
982 tstate->dict = d = PyDict_New();
983 if (d == NULL)
984 PyErr_Clear();
985 }
986 return tstate->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000987}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000988
989
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000990/* Asynchronously raise an exception in a thread.
991 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +0000992 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000993 to call this, or use ctypes. Must be called with the GIL held.
994 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
995 match any known thread id). Can be called with exc=NULL to clear an
996 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000997
998int
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200999PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc)
1000{
Victor Stinner09532fe2019-05-10 23:39:09 +02001001 _PyRuntimeState *runtime = &_PyRuntime;
1002 PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 /* Although the GIL is held, a few C API functions can be called
1005 * without the GIL held, and in particular some that create and
1006 * destroy thread and interpreter states. Those can mutate the
1007 * list of thread states we're traversing, so to prevent that we lock
1008 * head_mutex for the duration.
1009 */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001010 HEAD_LOCK(runtime);
Victor Stinner09532fe2019-05-10 23:39:09 +02001011 for (PyThreadState *p = interp->tstate_head; p != NULL; p = p->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 if (p->thread_id == id) {
1013 /* Tricky: we need to decref the current value
1014 * (if any) in p->async_exc, but that can in turn
1015 * allow arbitrary Python code to run, including
1016 * perhaps calls to this function. To prevent
1017 * deadlock, we need to release head_mutex before
1018 * the decref.
1019 */
1020 PyObject *old_exc = p->async_exc;
1021 Py_XINCREF(exc);
1022 p->async_exc = exc;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001023 HEAD_UNLOCK(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 Py_XDECREF(old_exc);
Victor Stinnere225beb2019-06-03 18:14:24 +02001025 _PyEval_SignalAsyncExc(&runtime->ceval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 return 1;
1027 }
1028 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001029 HEAD_UNLOCK(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001031}
1032
1033
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001034/* Routines for advanced debuggers, requested by David Beazley.
1035 Don't use unless you know what you are doing! */
1036
1037PyInterpreterState *
1038PyInterpreterState_Head(void)
1039{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001040 return _PyRuntime.interpreters.head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001041}
1042
1043PyInterpreterState *
Eric Snow6b4be192017-05-22 21:36:03 -07001044PyInterpreterState_Main(void)
1045{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001046 return _PyRuntime.interpreters.main;
Eric Snow6b4be192017-05-22 21:36:03 -07001047}
1048
1049PyInterpreterState *
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001050PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001052}
1053
1054PyThreadState *
1055PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001057}
1058
1059PyThreadState *
1060PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001062}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001063
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001064/* The implementation of sys._current_frames(). This is intended to be
1065 called with the GIL held, as it will be when called via
1066 sys._current_frames(). It's possible it would work fine even without
1067 the GIL held, but haven't thought enough about that.
1068*/
1069PyObject *
1070_PyThread_CurrentFrames(void)
1071{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 PyObject *result;
1073 PyInterpreterState *i;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001074
Steve Dowerb82e17e2019-05-23 08:45:22 -07001075 if (PySys_Audit("sys._current_frames", NULL) < 0) {
1076 return NULL;
1077 }
1078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 result = PyDict_New();
1080 if (result == NULL)
1081 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001082
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 /* for i in all interpreters:
1084 * for t in all of i's thread states:
1085 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +02001086 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 * need to grab head_mutex for the duration.
1088 */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001089 _PyRuntimeState *runtime = &_PyRuntime;
1090 HEAD_LOCK(runtime);
1091 for (i = runtime->interpreters.head; i != NULL; i = i->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 PyThreadState *t;
1093 for (t = i->tstate_head; t != NULL; t = t->next) {
1094 PyObject *id;
1095 int stat;
1096 struct _frame *frame = t->frame;
1097 if (frame == NULL)
1098 continue;
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +02001099 id = PyLong_FromUnsignedLong(t->thread_id);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 if (id == NULL)
1101 goto Fail;
1102 stat = PyDict_SetItem(result, id, (PyObject *)frame);
1103 Py_DECREF(id);
1104 if (stat < 0)
1105 goto Fail;
1106 }
1107 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001108 HEAD_UNLOCK(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001110
1111 Fail:
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001112 HEAD_UNLOCK(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 Py_DECREF(result);
1114 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001115}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001116
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001117/* Python "auto thread state" API. */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001118
1119/* Keep this as a static, as it is not reliable! It can only
1120 ever be compared to the state for the *current* thread.
1121 * If not equal, then it doesn't matter that the actual
1122 value may change immediately after comparison, as it can't
1123 possibly change to the current thread's state.
1124 * If equal, then the current thread holds the lock, so the value can't
1125 change until we yield the lock.
1126*/
1127static int
1128PyThreadState_IsCurrent(PyThreadState *tstate)
1129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 /* Must be the tstate for this thread */
Victor Stinner0fd2c302019-06-04 03:15:09 +02001131 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001132 assert(_PyGILState_GetThisThreadState(gilstate) == tstate);
1133 return tstate == _PyRuntimeGILState_GetThreadState(gilstate);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001134}
1135
Tim Peters4c1f5ec2004-10-09 17:25:05 +00001136/* Internal initialization/finalization functions called by
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001137 Py_Initialize/Py_FinalizeEx
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001138*/
Tim Peters19717fa2004-10-09 17:38:29 +00001139void
Victor Stinner0fd2c302019-06-04 03:15:09 +02001140_PyGILState_Init(_PyRuntimeState *runtime,
1141 PyInterpreterState *interp, PyThreadState *tstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001142{
Victor Stinner8bb32302019-04-24 16:47:40 +02001143 /* must init with valid states */
Eric Snow396e0a82019-05-31 21:16:47 -06001144 assert(interp != NULL);
Victor Stinner0fd2c302019-06-04 03:15:09 +02001145 assert(tstate != NULL);
Victor Stinner8bb32302019-04-24 16:47:40 +02001146
Victor Stinner8bb32302019-04-24 16:47:40 +02001147 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
1148
1149 if (PyThread_tss_create(&gilstate->autoTSSkey) != 0) {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001150 Py_FatalError("Could not allocate TSS entry");
1151 }
Victor Stinner8bb32302019-04-24 16:47:40 +02001152 gilstate->autoInterpreterState = interp;
1153 assert(PyThread_tss_get(&gilstate->autoTSSkey) == NULL);
1154 assert(tstate->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +00001155
Victor Stinner8bb32302019-04-24 16:47:40 +02001156 _PyGILState_NoteThreadState(gilstate, tstate);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001157}
1158
Victor Stinner861d9ab2016-03-16 22:45:24 +01001159PyInterpreterState *
1160_PyGILState_GetInterpreterStateUnsafe(void)
1161{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001162 return _PyRuntime.gilstate.autoInterpreterState;
Victor Stinner861d9ab2016-03-16 22:45:24 +01001163}
1164
Tim Peters19717fa2004-10-09 17:38:29 +00001165void
Victor Stinner8e91c242019-04-24 17:24:01 +02001166_PyGILState_Fini(_PyRuntimeState *runtime)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001167{
Victor Stinner8e91c242019-04-24 17:24:01 +02001168 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
1169 PyThread_tss_delete(&gilstate->autoTSSkey);
1170 gilstate->autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001171}
1172
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001173/* Reset the TSS key - called by PyOS_AfterFork_Child().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001174 * This should not be necessary, but some - buggy - pthread implementations
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001175 * don't reset TSS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001176 */
1177void
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001178_PyGILState_Reinit(_PyRuntimeState *runtime)
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001179{
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001180 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001181 PyThreadState *tstate = _PyGILState_GetThisThreadState(gilstate);
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001182
1183 PyThread_tss_delete(&gilstate->autoTSSkey);
1184 if (PyThread_tss_create(&gilstate->autoTSSkey) != 0) {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001185 Py_FatalError("Could not allocate TSS entry");
1186 }
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001187
Charles-François Natalia233df82011-11-22 19:49:51 +01001188 /* If the thread had an associated auto thread state, reassociate it with
1189 * the new key. */
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001190 if (tstate &&
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001191 PyThread_tss_set(&gilstate->autoTSSkey, (void *)tstate) != 0)
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001192 {
1193 Py_FatalError("Couldn't create autoTSSkey mapping");
1194 }
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001195}
1196
Michael W. Hudson188d4362005-06-20 16:52:57 +00001197/* When a thread state is created for a thread by some mechanism other than
1198 PyGILState_Ensure, it's important that the GILState machinery knows about
1199 it so it doesn't try to create another thread state for the thread (this is
1200 a better fix for SF bug #1010677 than the first one attempted).
1201*/
Thomas Wouters89f507f2006-12-13 04:49:30 +00001202static void
Victor Stinner8bb32302019-04-24 16:47:40 +02001203_PyGILState_NoteThreadState(struct _gilstate_runtime_state *gilstate, PyThreadState* tstate)
Michael W. Hudson188d4362005-06-20 16:52:57 +00001204{
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001205 /* If autoTSSkey isn't initialized, this must be the very first
Antoine Pitrou079ce542010-09-08 12:37:10 +00001206 threadstate created in Py_Initialize(). Don't do anything for now
1207 (we'll be back here when _PyGILState_Init is called). */
Victor Stinner8bb32302019-04-24 16:47:40 +02001208 if (!gilstate->autoInterpreterState) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 return;
Victor Stinner8bb32302019-04-24 16:47:40 +02001210 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001211
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001212 /* Stick the thread state for this thread in thread specific storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +00001213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 The only situation where you can legitimately have more than one
1215 thread state for an OS level thread is when there are multiple
Victor Stinner590cebe2013-12-13 11:08:56 +01001216 interpreters.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001217
Victor Stinner590cebe2013-12-13 11:08:56 +01001218 You shouldn't really be using the PyGILState_ APIs anyway (see issues
1219 #10915 and #15751).
Michael W. Hudson188d4362005-06-20 16:52:57 +00001220
Victor Stinner590cebe2013-12-13 11:08:56 +01001221 The first thread state created for that given OS level thread will
1222 "win", which seems reasonable behaviour.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 */
Victor Stinner8bb32302019-04-24 16:47:40 +02001224 if (PyThread_tss_get(&gilstate->autoTSSkey) == NULL) {
1225 if ((PyThread_tss_set(&gilstate->autoTSSkey, (void *)tstate)) != 0) {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001226 Py_FatalError("Couldn't create autoTSSkey mapping");
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001227 }
Victor Stinner590cebe2013-12-13 11:08:56 +01001228 }
Michael W. Hudson188d4362005-06-20 16:52:57 +00001229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 /* PyGILState_Release must not try to delete this thread state. */
1231 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +00001232}
1233
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001234/* The public functions */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001235static PyThreadState *
1236_PyGILState_GetThisThreadState(struct _gilstate_runtime_state *gilstate)
1237{
1238 if (gilstate->autoInterpreterState == NULL)
1239 return NULL;
1240 return (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey);
1241}
1242
Tim Peters19717fa2004-10-09 17:38:29 +00001243PyThreadState *
1244PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001245{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001246 return _PyGILState_GetThisThreadState(&_PyRuntime.gilstate);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001247}
1248
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -07001249int
1250PyGILState_Check(void)
1251{
Victor Stinner8a1be612016-03-14 22:07:55 +01001252
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001253 if (!_PyGILState_check_enabled) {
Victor Stinner8a1be612016-03-14 22:07:55 +01001254 return 1;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001255 }
Victor Stinner8a1be612016-03-14 22:07:55 +01001256
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001257 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
1258 if (!PyThread_tss_is_created(&gilstate->autoTSSkey)) {
1259 return 1;
1260 }
Victor Stinner8a1be612016-03-14 22:07:55 +01001261
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001262 PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate);
1263 if (tstate == NULL) {
1264 return 0;
1265 }
1266
1267 return (tstate == _PyGILState_GetThisThreadState(gilstate));
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -07001268}
1269
Tim Peters19717fa2004-10-09 17:38:29 +00001270PyGILState_STATE
1271PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001272{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001273 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 int current;
1275 PyThreadState *tcur;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001276 int need_init_threads = 0;
1277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 /* Note that we do not auto-init Python here - apart from
1279 potential races with 2 threads auto-initializing, pep-311
1280 spells out other issues. Embedders are expected to have
1281 called Py_Initialize() and usually PyEval_InitThreads().
1282 */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001283 /* Py_Initialize() hasn't been called! */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001284 assert(gilstate->autoInterpreterState);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001285
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001286 tcur = (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 if (tcur == NULL) {
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001288 need_init_threads = 1;
Victor Stinner62ca1002013-12-13 01:46:43 +01001289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 /* Create a new thread state for this thread */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001291 tcur = PyThreadState_New(gilstate->autoInterpreterState);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 if (tcur == NULL)
1293 Py_FatalError("Couldn't create thread-state for new thread");
1294 /* This is our thread state! We'll need to delete it in the
1295 matching call to PyGILState_Release(). */
1296 tcur->gilstate_counter = 0;
1297 current = 0; /* new thread state is never current */
1298 }
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001299 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 current = PyThreadState_IsCurrent(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001301 }
1302
1303 if (current == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 PyEval_RestoreThread(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001305 }
1306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 /* Update our counter in the thread-state - no need for locks:
1308 - tcur will remain valid as we hold the GIL.
1309 - the counter is safe as we are the only thread "allowed"
1310 to modify this value
1311 */
1312 ++tcur->gilstate_counter;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001313
1314 if (need_init_threads) {
1315 /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is
1316 called from a new thread for the first time, we need the create the
1317 GIL. */
1318 PyEval_InitThreads();
1319 }
1320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001322}
1323
Tim Peters19717fa2004-10-09 17:38:29 +00001324void
1325PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001326{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001327 _PyRuntimeState *runtime = &_PyRuntime;
1328 PyThreadState *tcur = PyThread_tss_get(&runtime->gilstate.autoTSSkey);
1329 if (tcur == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 Py_FatalError("auto-releasing thread-state, "
1331 "but no thread-state for this thread");
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001332 }
1333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 /* We must hold the GIL and have our thread state current */
1335 /* XXX - remove the check - the assert should be fine,
1336 but while this is very new (April 2003), the extra check
1337 by release-only users can't hurt.
1338 */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001339 if (!PyThreadState_IsCurrent(tcur)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 Py_FatalError("This thread state must be current when releasing");
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001341 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 assert(PyThreadState_IsCurrent(tcur));
1343 --tcur->gilstate_counter;
1344 assert(tcur->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 /* If we're going to destroy this thread-state, we must
1347 * clear it while the GIL is held, as destructors may run.
1348 */
1349 if (tcur->gilstate_counter == 0) {
1350 /* can't have been locked when we created it */
1351 assert(oldstate == PyGILState_UNLOCKED);
1352 PyThreadState_Clear(tcur);
1353 /* Delete the thread-state. Note this releases the GIL too!
1354 * It's vital that the GIL be held here, to avoid shutdown
1355 * races; see bugs 225673 and 1061968 (that nasty bug has a
1356 * habit of coming back).
1357 */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001358 _PyThreadState_DeleteCurrent(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 }
1360 /* Release the lock if necessary */
1361 else if (oldstate == PyGILState_UNLOCKED)
1362 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001363}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001364
Benjamin Peterson3bf01752012-04-13 18:06:36 -04001365
Eric Snow7f8bfc92018-01-29 18:23:44 -07001366/**************************/
1367/* cross-interpreter data */
1368/**************************/
1369
1370/* cross-interpreter data */
1371
1372crossinterpdatafunc _PyCrossInterpreterData_Lookup(PyObject *);
1373
1374/* This is a separate func from _PyCrossInterpreterData_Lookup in order
1375 to keep the registry code separate. */
1376static crossinterpdatafunc
1377_lookup_getdata(PyObject *obj)
1378{
1379 crossinterpdatafunc getdata = _PyCrossInterpreterData_Lookup(obj);
1380 if (getdata == NULL && PyErr_Occurred() == 0)
1381 PyErr_Format(PyExc_ValueError,
1382 "%S does not support cross-interpreter data", obj);
1383 return getdata;
1384}
1385
1386int
1387_PyObject_CheckCrossInterpreterData(PyObject *obj)
1388{
1389 crossinterpdatafunc getdata = _lookup_getdata(obj);
1390 if (getdata == NULL) {
1391 return -1;
1392 }
1393 return 0;
1394}
1395
1396static int
1397_check_xidata(_PyCrossInterpreterData *data)
1398{
1399 // data->data can be anything, including NULL, so we don't check it.
1400
1401 // data->obj may be NULL, so we don't check it.
1402
1403 if (data->interp < 0) {
1404 PyErr_SetString(PyExc_SystemError, "missing interp");
1405 return -1;
1406 }
1407
1408 if (data->new_object == NULL) {
1409 PyErr_SetString(PyExc_SystemError, "missing new_object func");
1410 return -1;
1411 }
1412
1413 // data->free may be NULL, so we don't check it.
1414
1415 return 0;
1416}
1417
1418int
1419_PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data)
1420{
Victor Stinnercaba55b2018-08-03 15:33:52 +02001421 // _PyInterpreterState_Get() aborts if lookup fails, so we don't need
Eric Snow7f8bfc92018-01-29 18:23:44 -07001422 // to check the result for NULL.
Victor Stinnercaba55b2018-08-03 15:33:52 +02001423 PyInterpreterState *interp = _PyInterpreterState_Get();
Eric Snow7f8bfc92018-01-29 18:23:44 -07001424
1425 // Reset data before re-populating.
1426 *data = (_PyCrossInterpreterData){0};
1427 data->free = PyMem_RawFree; // Set a default that may be overridden.
1428
1429 // Call the "getdata" func for the object.
1430 Py_INCREF(obj);
1431 crossinterpdatafunc getdata = _lookup_getdata(obj);
1432 if (getdata == NULL) {
1433 Py_DECREF(obj);
1434 return -1;
1435 }
1436 int res = getdata(obj, data);
1437 Py_DECREF(obj);
1438 if (res != 0) {
1439 return -1;
1440 }
1441
1442 // Fill in the blanks and validate the result.
Eric Snow7f8bfc92018-01-29 18:23:44 -07001443 data->interp = interp->id;
1444 if (_check_xidata(data) != 0) {
1445 _PyCrossInterpreterData_Release(data);
1446 return -1;
1447 }
1448
1449 return 0;
1450}
1451
Victor Stinnere225beb2019-06-03 18:14:24 +02001452static void
Eric Snow63799132018-06-01 18:45:20 -06001453_release_xidata(void *arg)
1454{
1455 _PyCrossInterpreterData *data = (_PyCrossInterpreterData *)arg;
1456 if (data->free != NULL) {
1457 data->free(data->data);
1458 }
1459 Py_XDECREF(data->obj);
Victor Stinnere225beb2019-06-03 18:14:24 +02001460}
1461
1462static void
1463_call_in_interpreter(struct _gilstate_runtime_state *gilstate,
1464 PyInterpreterState *interp,
1465 void (*func)(void *), void *arg)
1466{
1467 /* We would use Py_AddPendingCall() if it weren't specific to the
1468 * main interpreter (see bpo-33608). In the meantime we take a
1469 * naive approach.
1470 */
1471 PyThreadState *save_tstate = NULL;
1472 if (interp != _PyRuntimeGILState_GetThreadState(gilstate)->interp) {
1473 // XXX Using the "head" thread isn't strictly correct.
1474 PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
1475 // XXX Possible GILState issues?
1476 save_tstate = _PyThreadState_Swap(gilstate, tstate);
1477 }
1478
1479 func(arg);
1480
1481 // Switch back.
1482 if (save_tstate != NULL) {
1483 _PyThreadState_Swap(gilstate, save_tstate);
1484 }
Eric Snow63799132018-06-01 18:45:20 -06001485}
1486
Eric Snow7f8bfc92018-01-29 18:23:44 -07001487void
1488_PyCrossInterpreterData_Release(_PyCrossInterpreterData *data)
1489{
1490 if (data->data == NULL && data->obj == NULL) {
1491 // Nothing to release!
1492 return;
1493 }
1494
Victor Stinnere225beb2019-06-03 18:14:24 +02001495 // Switch to the original interpreter.
Eric Snow7f8bfc92018-01-29 18:23:44 -07001496 PyInterpreterState *interp = _PyInterpreterState_LookUpID(data->interp);
1497 if (interp == NULL) {
1498 // The intepreter was already destroyed.
1499 if (data->free != NULL) {
1500 // XXX Someone leaked some memory...
1501 }
1502 return;
1503 }
Eric Snowf53d9f22018-02-20 16:30:17 -07001504
Eric Snow7f8bfc92018-01-29 18:23:44 -07001505 // "Release" the data and/or the object.
Victor Stinnere225beb2019-06-03 18:14:24 +02001506 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
1507 _call_in_interpreter(gilstate, interp, _release_xidata, data);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001508}
1509
1510PyObject *
1511_PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *data)
1512{
1513 return data->new_object(data);
1514}
1515
1516/* registry of {type -> crossinterpdatafunc} */
1517
1518/* For now we use a global registry of shareable classes. An
1519 alternative would be to add a tp_* slot for a class's
1520 crossinterpdatafunc. It would be simpler and more efficient. */
1521
1522static int
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001523_register_xidata(struct _xidregistry *xidregistry, PyTypeObject *cls,
1524 crossinterpdatafunc getdata)
Eric Snow7f8bfc92018-01-29 18:23:44 -07001525{
1526 // Note that we effectively replace already registered classes
1527 // rather than failing.
1528 struct _xidregitem *newhead = PyMem_RawMalloc(sizeof(struct _xidregitem));
1529 if (newhead == NULL)
1530 return -1;
1531 newhead->cls = cls;
1532 newhead->getdata = getdata;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001533 newhead->next = xidregistry->head;
1534 xidregistry->head = newhead;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001535 return 0;
1536}
1537
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001538static void _register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001539
1540int
Eric Snowc11183c2019-03-15 16:35:46 -06001541_PyCrossInterpreterData_RegisterClass(PyTypeObject *cls,
Eric Snow7f8bfc92018-01-29 18:23:44 -07001542 crossinterpdatafunc getdata)
1543{
1544 if (!PyType_Check(cls)) {
1545 PyErr_Format(PyExc_ValueError, "only classes may be registered");
1546 return -1;
1547 }
1548 if (getdata == NULL) {
1549 PyErr_Format(PyExc_ValueError, "missing 'getdata' func");
1550 return -1;
1551 }
1552
1553 // Make sure the class isn't ever deallocated.
1554 Py_INCREF((PyObject *)cls);
1555
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001556 struct _xidregistry *xidregistry = &_PyRuntime.xidregistry ;
1557 PyThread_acquire_lock(xidregistry->mutex, WAIT_LOCK);
1558 if (xidregistry->head == NULL) {
1559 _register_builtins_for_crossinterpreter_data(xidregistry);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001560 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001561 int res = _register_xidata(xidregistry, cls, getdata);
1562 PyThread_release_lock(xidregistry->mutex);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001563 return res;
1564}
1565
Eric Snow6d2cd902018-05-16 15:04:57 -04001566/* Cross-interpreter objects are looked up by exact match on the class.
1567 We can reassess this policy when we move from a global registry to a
1568 tp_* slot. */
1569
Eric Snow7f8bfc92018-01-29 18:23:44 -07001570crossinterpdatafunc
1571_PyCrossInterpreterData_Lookup(PyObject *obj)
1572{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001573 struct _xidregistry *xidregistry = &_PyRuntime.xidregistry ;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001574 PyObject *cls = PyObject_Type(obj);
1575 crossinterpdatafunc getdata = NULL;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001576 PyThread_acquire_lock(xidregistry->mutex, WAIT_LOCK);
1577 struct _xidregitem *cur = xidregistry->head;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001578 if (cur == NULL) {
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001579 _register_builtins_for_crossinterpreter_data(xidregistry);
1580 cur = xidregistry->head;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001581 }
1582 for(; cur != NULL; cur = cur->next) {
1583 if (cur->cls == (PyTypeObject *)cls) {
1584 getdata = cur->getdata;
1585 break;
1586 }
1587 }
Eric Snow4e9da0d2018-02-02 21:49:49 -07001588 Py_DECREF(cls);
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001589 PyThread_release_lock(xidregistry->mutex);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001590 return getdata;
1591}
1592
1593/* cross-interpreter data for builtin types */
1594
Eric Snow6d2cd902018-05-16 15:04:57 -04001595struct _shared_bytes_data {
1596 char *bytes;
1597 Py_ssize_t len;
1598};
1599
Eric Snow7f8bfc92018-01-29 18:23:44 -07001600static PyObject *
1601_new_bytes_object(_PyCrossInterpreterData *data)
1602{
Eric Snow6d2cd902018-05-16 15:04:57 -04001603 struct _shared_bytes_data *shared = (struct _shared_bytes_data *)(data->data);
1604 return PyBytes_FromStringAndSize(shared->bytes, shared->len);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001605}
1606
1607static int
1608_bytes_shared(PyObject *obj, _PyCrossInterpreterData *data)
1609{
Eric Snow6d2cd902018-05-16 15:04:57 -04001610 struct _shared_bytes_data *shared = PyMem_NEW(struct _shared_bytes_data, 1);
1611 if (PyBytes_AsStringAndSize(obj, &shared->bytes, &shared->len) < 0) {
1612 return -1;
1613 }
1614 data->data = (void *)shared;
Eric Snow63799132018-06-01 18:45:20 -06001615 Py_INCREF(obj);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001616 data->obj = obj; // Will be "released" (decref'ed) when data released.
1617 data->new_object = _new_bytes_object;
Eric Snow6d2cd902018-05-16 15:04:57 -04001618 data->free = PyMem_Free;
1619 return 0;
1620}
1621
1622struct _shared_str_data {
1623 int kind;
1624 const void *buffer;
1625 Py_ssize_t len;
1626};
1627
1628static PyObject *
1629_new_str_object(_PyCrossInterpreterData *data)
1630{
1631 struct _shared_str_data *shared = (struct _shared_str_data *)(data->data);
1632 return PyUnicode_FromKindAndData(shared->kind, shared->buffer, shared->len);
1633}
1634
1635static int
1636_str_shared(PyObject *obj, _PyCrossInterpreterData *data)
1637{
1638 struct _shared_str_data *shared = PyMem_NEW(struct _shared_str_data, 1);
1639 shared->kind = PyUnicode_KIND(obj);
1640 shared->buffer = PyUnicode_DATA(obj);
1641 shared->len = PyUnicode_GET_LENGTH(obj) - 1;
1642 data->data = (void *)shared;
Eric Snow63799132018-06-01 18:45:20 -06001643 Py_INCREF(obj);
Eric Snow6d2cd902018-05-16 15:04:57 -04001644 data->obj = obj; // Will be "released" (decref'ed) when data released.
1645 data->new_object = _new_str_object;
1646 data->free = PyMem_Free;
1647 return 0;
1648}
1649
1650static PyObject *
1651_new_long_object(_PyCrossInterpreterData *data)
1652{
Alexey Izbyshev16f842d2019-02-12 19:06:43 +03001653 return PyLong_FromSsize_t((Py_ssize_t)(data->data));
Eric Snow6d2cd902018-05-16 15:04:57 -04001654}
1655
1656static int
1657_long_shared(PyObject *obj, _PyCrossInterpreterData *data)
1658{
Alexey Izbyshev16f842d2019-02-12 19:06:43 +03001659 /* Note that this means the size of shareable ints is bounded by
1660 * sys.maxsize. Hence on 32-bit architectures that is half the
1661 * size of maximum shareable ints on 64-bit.
1662 */
1663 Py_ssize_t value = PyLong_AsSsize_t(obj);
Eric Snow6d2cd902018-05-16 15:04:57 -04001664 if (value == -1 && PyErr_Occurred()) {
1665 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1666 PyErr_SetString(PyExc_OverflowError, "try sending as bytes");
1667 }
1668 return -1;
1669 }
1670 data->data = (void *)value;
1671 data->obj = NULL;
1672 data->new_object = _new_long_object;
1673 data->free = NULL;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001674 return 0;
1675}
1676
1677static PyObject *
1678_new_none_object(_PyCrossInterpreterData *data)
1679{
1680 // XXX Singleton refcounts are problematic across interpreters...
1681 Py_INCREF(Py_None);
1682 return Py_None;
1683}
1684
1685static int
1686_none_shared(PyObject *obj, _PyCrossInterpreterData *data)
1687{
1688 data->data = NULL;
1689 // data->obj remains NULL
1690 data->new_object = _new_none_object;
1691 data->free = NULL; // There is nothing to free.
1692 return 0;
1693}
1694
1695static void
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001696_register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry)
Eric Snow7f8bfc92018-01-29 18:23:44 -07001697{
1698 // None
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001699 if (_register_xidata(xidregistry, (PyTypeObject *)PyObject_Type(Py_None), _none_shared) != 0) {
Eric Snow7f8bfc92018-01-29 18:23:44 -07001700 Py_FatalError("could not register None for cross-interpreter sharing");
1701 }
1702
Eric Snow6d2cd902018-05-16 15:04:57 -04001703 // int
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001704 if (_register_xidata(xidregistry, &PyLong_Type, _long_shared) != 0) {
Eric Snow6d2cd902018-05-16 15:04:57 -04001705 Py_FatalError("could not register int for cross-interpreter sharing");
1706 }
1707
Eric Snow7f8bfc92018-01-29 18:23:44 -07001708 // bytes
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001709 if (_register_xidata(xidregistry, &PyBytes_Type, _bytes_shared) != 0) {
Eric Snow7f8bfc92018-01-29 18:23:44 -07001710 Py_FatalError("could not register bytes for cross-interpreter sharing");
1711 }
Eric Snow6d2cd902018-05-16 15:04:57 -04001712
1713 // str
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001714 if (_register_xidata(xidregistry, &PyUnicode_Type, _str_shared) != 0) {
Eric Snow6d2cd902018-05-16 15:04:57 -04001715 Py_FatalError("could not register str for cross-interpreter sharing");
1716 }
Eric Snow7f8bfc92018-01-29 18:23:44 -07001717}
1718
1719
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001720#ifdef __cplusplus
1721}
1722#endif