blob: 9f99060feceb2180f7f9eaf774925c5b7c4a76e1 [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 Stinner6e128382019-09-28 04:50:43 +020063
Victor Stinnerbdace212019-10-01 00:46:42 +020064 PyPreConfig_InitPythonConfig(&runtime->preconfig);
Michael W. Hudson188d4362005-06-20 16:52:57 +000065
Eric Snow2ebc5ce2017-09-07 23:51:28 -060066 runtime->gilstate.check_enabled = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -080067
Masayuki Yamamoto731e1892017-10-06 19:41:34 +090068 /* A TSS key must be initialized with Py_tss_NEEDS_INIT
69 in accordance with the specification. */
Victor Stinnerf7e5b562017-11-15 15:48:08 -080070 Py_tss_t initial = Py_tss_NEEDS_INIT;
71 runtime->gilstate.autoTSSkey = initial;
Guido van Rossum1d5ad901999-06-18 14:22:24 +000072
Eric Snow2ebc5ce2017-09-07 23:51:28 -060073 runtime->interpreters.mutex = PyThread_allocate_lock();
Victor Stinnerf7e5b562017-11-15 15:48:08 -080074 if (runtime->interpreters.mutex == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +020075 return _PyStatus_ERR("Can't initialize threads for interpreter");
Victor Stinnerf7e5b562017-11-15 15:48:08 -080076 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -060077 runtime->interpreters.next_id = -1;
Eric Snow7f8bfc92018-01-29 18:23:44 -070078
79 runtime->xidregistry.mutex = PyThread_allocate_lock();
80 if (runtime->xidregistry.mutex == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +020081 return _PyStatus_ERR("Can't initialize threads for cross-interpreter data registry");
Eric Snow7f8bfc92018-01-29 18:23:44 -070082 }
83
Eric Snow8479a342019-03-08 23:44:33 -070084 // Set it to the ID of the main thread of the main interpreter.
85 runtime->main_thread = PyThread_get_thread_ident();
Eric Snow5be45a62019-03-08 22:47:07 -070086
Victor Stinner331a6a52019-05-27 16:39:22 +020087 return _PyStatus_OK();
Eric Snow2ebc5ce2017-09-07 23:51:28 -060088}
Eric Snow05351c12017-09-05 21:43:08 -070089
Victor Stinner331a6a52019-05-27 16:39:22 +020090PyStatus
Victor Stinner5d39e042017-11-29 17:20:38 +010091_PyRuntimeState_Init(_PyRuntimeState *runtime)
92{
93 /* Force default allocator, since _PyRuntimeState_Fini() must
94 use the same allocator than this function. */
95 PyMemAllocatorEx old_alloc;
96 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
97
Victor Stinner331a6a52019-05-27 16:39:22 +020098 PyStatus status = _PyRuntimeState_Init_impl(runtime);
Victor Stinner5d39e042017-11-29 17:20:38 +010099
100 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinner331a6a52019-05-27 16:39:22 +0200101 return status;
Victor Stinner5d39e042017-11-29 17:20:38 +0100102}
103
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600104void
105_PyRuntimeState_Fini(_PyRuntimeState *runtime)
106{
Victor Stinner5d39e042017-11-29 17:20:38 +0100107 /* Force the allocator used by _PyRuntimeState_Init(). */
108 PyMemAllocatorEx old_alloc;
109 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinnerccb04422017-11-16 03:20:31 -0800110
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600111 if (runtime->interpreters.mutex != NULL) {
112 PyThread_free_lock(runtime->interpreters.mutex);
113 runtime->interpreters.mutex = NULL;
114 }
Victor Stinnerccb04422017-11-16 03:20:31 -0800115
Stéphane Wirtel943395f2019-03-19 11:51:32 +0100116 if (runtime->xidregistry.mutex != NULL) {
117 PyThread_free_lock(runtime->xidregistry.mutex);
118 runtime->xidregistry.mutex = NULL;
119 }
120
Victor Stinnerccb04422017-11-16 03:20:31 -0800121 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600122}
123
Eric Snow8479a342019-03-08 23:44:33 -0700124/* This function is called from PyOS_AfterFork_Child to ensure that
125 * newly created child processes do not share locks with the parent.
126 */
127
128void
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200129_PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime)
Eric Snow8479a342019-03-08 23:44:33 -0700130{
131 // This was initially set in _PyRuntimeState_Init().
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200132 runtime->main_thread = PyThread_get_thread_ident();
Eric Snow8479a342019-03-08 23:44:33 -0700133
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200134 /* Force default allocator, since _PyRuntimeState_Fini() must
135 use the same allocator than this function. */
136 PyMemAllocatorEx old_alloc;
137 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
138
139 runtime->interpreters.mutex = PyThread_allocate_lock();
140 runtime->interpreters.main->id_mutex = PyThread_allocate_lock();
141 runtime->xidregistry.mutex = PyThread_allocate_lock();
142
143 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
144
145 if (runtime->interpreters.mutex == NULL) {
Eric Snow8479a342019-03-08 23:44:33 -0700146 Py_FatalError("Can't initialize lock for runtime interpreters");
147 }
148
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200149 if (runtime->interpreters.main->id_mutex == NULL) {
Eric Snow8479a342019-03-08 23:44:33 -0700150 Py_FatalError("Can't initialize ID lock for main interpreter");
151 }
152
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200153 if (runtime->xidregistry.mutex == NULL) {
Eric Snow8479a342019-03-08 23:44:33 -0700154 Py_FatalError("Can't initialize lock for cross-interpreter data registry");
155 }
156}
157
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200158#define HEAD_LOCK(runtime) \
159 PyThread_acquire_lock((runtime)->interpreters.mutex, WAIT_LOCK)
160#define HEAD_UNLOCK(runtime) \
161 PyThread_release_lock((runtime)->interpreters.mutex)
Eric Snow05351c12017-09-05 21:43:08 -0700162
Victor Stinner8bb32302019-04-24 16:47:40 +0200163/* Forward declaration */
164static void _PyGILState_NoteThreadState(
165 struct _gilstate_runtime_state *gilstate, PyThreadState* tstate);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000166
Victor Stinner331a6a52019-05-27 16:39:22 +0200167PyStatus
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600168_PyInterpreterState_Enable(_PyRuntimeState *runtime)
Eric Snowe3774162017-05-22 19:46:40 -0700169{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200170 struct pyinterpreters *interpreters = &runtime->interpreters;
171 interpreters->next_id = 0;
Victor Stinner5d926472018-03-06 14:31:37 +0100172
173 /* Py_Finalize() calls _PyRuntimeState_Fini() which clears the mutex.
174 Create a new mutex if needed. */
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200175 if (interpreters->mutex == NULL) {
Victor Stinner5d926472018-03-06 14:31:37 +0100176 /* Force default allocator, since _PyRuntimeState_Fini() must
177 use the same allocator than this function. */
178 PyMemAllocatorEx old_alloc;
179 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
180
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200181 interpreters->mutex = PyThread_allocate_lock();
Victor Stinner5d926472018-03-06 14:31:37 +0100182
183 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
184
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200185 if (interpreters->mutex == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +0200186 return _PyStatus_ERR("Can't initialize threads for interpreter");
Victor Stinnera7368ac2017-11-15 18:11:45 -0800187 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600188 }
Victor Stinner5d926472018-03-06 14:31:37 +0100189
Victor Stinner331a6a52019-05-27 16:39:22 +0200190 return _PyStatus_OK();
Eric Snowe3774162017-05-22 19:46:40 -0700191}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000192
193PyInterpreterState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000194PyInterpreterState_New(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000195{
Steve Dowerb82e17e2019-05-23 08:45:22 -0700196 if (PySys_Audit("cpython.PyInterpreterState_New", NULL) < 0) {
197 return NULL;
198 }
199
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200200 PyInterpreterState *interp = PyMem_RawMalloc(sizeof(PyInterpreterState));
Victor Stinnerd4341102017-11-23 00:12:09 +0100201 if (interp == NULL) {
202 return NULL;
203 }
204
Eric Snow5be45a62019-03-08 22:47:07 -0700205 memset(interp, 0, sizeof(*interp));
Eric Snow4c6955e2018-02-16 18:53:40 -0700206 interp->id_refcount = -1;
Victor Stinnerd4341102017-11-23 00:12:09 +0100207 interp->check_interval = 100;
Victor Stinner022be022019-05-22 23:58:50 +0200208
Miss Islington (bot)d49f0962019-10-01 03:26:04 -0700209 PyConfig_InitPythonConfig(&interp->config);
Victor Stinner022be022019-05-22 23:58:50 +0200210
Victor Stinnerd4341102017-11-23 00:12:09 +0100211 interp->eval_frame = _PyEval_EvalFrameDefault;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000212#ifdef HAVE_DLOPEN
Serhiy Storchakac2f7d872016-05-04 09:44:44 +0300213#if HAVE_DECL_RTLD_NOW
Victor Stinnerd4341102017-11-23 00:12:09 +0100214 interp->dlopenflags = RTLD_NOW;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000215#else
Victor Stinnerd4341102017-11-23 00:12:09 +0100216 interp->dlopenflags = RTLD_LAZY;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000217#endif
218#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000219
Victor Stinner0fd2c302019-06-04 03:15:09 +0200220 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200221 struct pyinterpreters *interpreters = &runtime->interpreters;
222
223 HEAD_LOCK(runtime);
224 if (interpreters->next_id < 0) {
Victor Stinnerd4341102017-11-23 00:12:09 +0100225 /* overflow or Py_Initialize() not called! */
226 PyErr_SetString(PyExc_RuntimeError,
227 "failed to get an interpreter ID");
Pablo Galindo95d630e2018-08-31 22:49:29 +0100228 PyMem_RawFree(interp);
Victor Stinnerd4341102017-11-23 00:12:09 +0100229 interp = NULL;
Victor Stinnerd4341102017-11-23 00:12:09 +0100230 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200231 else {
232 interp->id = interpreters->next_id;
233 interpreters->next_id += 1;
234 interp->next = interpreters->head;
235 if (interpreters->main == NULL) {
236 interpreters->main = interp;
237 }
238 interpreters->head = interp;
239 }
240 HEAD_UNLOCK(runtime);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000241
Pablo Galindo95d630e2018-08-31 22:49:29 +0100242 if (interp == NULL) {
243 return NULL;
244 }
245
Yury Selivanovf23746a2018-01-22 19:11:18 -0500246 interp->tstate_next_unique_id = 0;
247
Steve Dowerb82e17e2019-05-23 08:45:22 -0700248 interp->audit_hooks = NULL;
249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 return interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000251}
252
253
Victor Stinner0fd2c302019-06-04 03:15:09 +0200254static void
255_PyInterpreterState_Clear(_PyRuntimeState *runtime, PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000256{
Steve Dowerb82e17e2019-05-23 08:45:22 -0700257 if (PySys_Audit("cpython.PyInterpreterState_Clear", NULL) < 0) {
258 PyErr_Clear();
259 }
260
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200261 HEAD_LOCK(runtime);
262 for (PyThreadState *p = interp->tstate_head; p != NULL; p = p->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 PyThreadState_Clear(p);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200264 }
265 HEAD_UNLOCK(runtime);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700266
267 Py_CLEAR(interp->audit_hooks);
268
Victor Stinner331a6a52019-05-27 16:39:22 +0200269 PyConfig_Clear(&interp->config);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000270 Py_CLEAR(interp->codec_search_path);
271 Py_CLEAR(interp->codec_search_cache);
272 Py_CLEAR(interp->codec_error_registry);
Eric Snow93c92f72017-09-13 23:46:04 -0700273 Py_CLEAR(interp->modules);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000274 Py_CLEAR(interp->modules_by_index);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 Py_CLEAR(interp->sysdict);
276 Py_CLEAR(interp->builtins);
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200277 Py_CLEAR(interp->builtins_copy);
Brett Cannonfd074152012-04-14 14:10:13 -0400278 Py_CLEAR(interp->importlib);
Serhiy Storchaka133138a2016-08-02 22:51:21 +0300279 Py_CLEAR(interp->import_func);
Eric Snowd2fdd1f2019-03-15 17:47:43 -0600280 Py_CLEAR(interp->dict);
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200281#ifdef HAVE_FORK
282 Py_CLEAR(interp->before_forkers);
283 Py_CLEAR(interp->after_forkers_parent);
284 Py_CLEAR(interp->after_forkers_child);
285#endif
Eric Snow86ea5812019-05-10 13:29:55 -0400286 if (runtime->finalizing == NULL) {
287 _PyWarnings_Fini(interp);
288 }
Eric Snow5be45a62019-03-08 22:47:07 -0700289 // XXX Once we have one allocator per interpreter (i.e.
290 // per-interpreter GC) we must ensure that all of the interpreter's
291 // objects have been cleaned up at the point.
Guido van Rossum25ce5661997-08-02 03:10:38 +0000292}
293
Victor Stinner0fd2c302019-06-04 03:15:09 +0200294void
295PyInterpreterState_Clear(PyInterpreterState *interp)
296{
297 _PyInterpreterState_Clear(&_PyRuntime, interp);
298}
299
Guido van Rossum25ce5661997-08-02 03:10:38 +0000300
301static void
Victor Stinner0fd2c302019-06-04 03:15:09 +0200302zapthreads(_PyRuntimeState *runtime, PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000303{
Victor Stinner0fd2c302019-06-04 03:15:09 +0200304 PyThreadState *p;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 /* No need to lock the mutex here because this should only happen
306 when the threads are all really dead (XXX famous last words). */
Victor Stinner0fd2c302019-06-04 03:15:09 +0200307 while ((p = interp->tstate_head) != NULL) {
308 _PyThreadState_Delete(runtime, p);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000310}
311
312
Victor Stinner0fd2c302019-06-04 03:15:09 +0200313static void
314_PyInterpreterState_Delete(_PyRuntimeState *runtime,
315 PyInterpreterState *interp)
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200316{
317 struct pyinterpreters *interpreters = &runtime->interpreters;
Victor Stinner0fd2c302019-06-04 03:15:09 +0200318 zapthreads(runtime, interp);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200319 HEAD_LOCK(runtime);
320 PyInterpreterState **p;
321 for (p = &interpreters->head; ; p = &(*p)->next) {
322 if (*p == NULL) {
323 Py_FatalError("PyInterpreterState_Delete: invalid interp");
324 }
325 if (*p == interp) {
326 break;
327 }
328 }
329 if (interp->tstate_head != NULL) {
330 Py_FatalError("PyInterpreterState_Delete: remaining threads");
331 }
332 *p = interp->next;
333 if (interpreters->main == interp) {
334 interpreters->main = NULL;
335 if (interpreters->head != NULL) {
336 Py_FatalError("PyInterpreterState_Delete: remaining subinterpreters");
337 }
338 }
339 HEAD_UNLOCK(runtime);
340 if (interp->id_mutex != NULL) {
341 PyThread_free_lock(interp->id_mutex);
342 }
343 PyMem_RawFree(interp);
344}
345
346
Victor Stinner0fd2c302019-06-04 03:15:09 +0200347void
348PyInterpreterState_Delete(PyInterpreterState *interp)
349{
350 _PyInterpreterState_Delete(&_PyRuntime, interp);
351}
352
353
Eric Snow59032962018-09-14 14:17:20 -0700354/*
355 * Delete all interpreter states except the main interpreter. If there
356 * is a current interpreter state, it *must* be the main interpreter.
357 */
358void
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200359_PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime)
Eric Snow59032962018-09-14 14:17:20 -0700360{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200361 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200362 struct pyinterpreters *interpreters = &runtime->interpreters;
363
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200364 PyThreadState *tstate = _PyThreadState_Swap(gilstate, NULL);
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200365 if (tstate != NULL && tstate->interp != interpreters->main) {
Eric Snow59032962018-09-14 14:17:20 -0700366 Py_FatalError("PyInterpreterState_DeleteExceptMain: not main interpreter");
367 }
368
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200369 HEAD_LOCK(runtime);
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200370 PyInterpreterState *interp = interpreters->head;
371 interpreters->head = NULL;
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100372 while (interp != NULL) {
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200373 if (interp == interpreters->main) {
374 interpreters->main->next = NULL;
375 interpreters->head = interp;
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100376 interp = interp->next;
Eric Snow59032962018-09-14 14:17:20 -0700377 continue;
378 }
379
Victor Stinner0fd2c302019-06-04 03:15:09 +0200380 _PyInterpreterState_Clear(runtime, interp); // XXX must activate?
381 zapthreads(runtime, interp);
Eric Snow59032962018-09-14 14:17:20 -0700382 if (interp->id_mutex != NULL) {
383 PyThread_free_lock(interp->id_mutex);
384 }
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100385 PyInterpreterState *prev_interp = interp;
386 interp = interp->next;
387 PyMem_RawFree(prev_interp);
Eric Snow59032962018-09-14 14:17:20 -0700388 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200389 HEAD_UNLOCK(runtime);
Eric Snow59032962018-09-14 14:17:20 -0700390
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200391 if (interpreters->head == NULL) {
Eric Snow59032962018-09-14 14:17:20 -0700392 Py_FatalError("PyInterpreterState_DeleteExceptMain: missing main");
393 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200394 _PyThreadState_Swap(gilstate, tstate);
Eric Snow59032962018-09-14 14:17:20 -0700395}
396
397
Victor Stinnercaba55b2018-08-03 15:33:52 +0200398PyInterpreterState *
399_PyInterpreterState_Get(void)
400{
Victor Stinner50b48572018-11-01 01:51:40 +0100401 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnercaba55b2018-08-03 15:33:52 +0200402 if (tstate == NULL) {
403 Py_FatalError("_PyInterpreterState_Get(): no current thread state");
404 }
405 PyInterpreterState *interp = tstate->interp;
406 if (interp == NULL) {
407 Py_FatalError("_PyInterpreterState_Get(): no current interpreter");
408 }
409 return interp;
410}
411
412
Eric Snowe3774162017-05-22 19:46:40 -0700413int64_t
414PyInterpreterState_GetID(PyInterpreterState *interp)
415{
416 if (interp == NULL) {
417 PyErr_SetString(PyExc_RuntimeError, "no interpreter provided");
418 return -1;
419 }
420 return interp->id;
421}
422
423
Eric Snow5be45a62019-03-08 22:47:07 -0700424static PyInterpreterState *
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200425interp_look_up_id(_PyRuntimeState *runtime, PY_INT64_T requested_id)
Eric Snowb05b7112019-03-01 12:35:10 -0700426{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200427 PyInterpreterState *interp = runtime->interpreters.head;
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100428 while (interp != NULL) {
429 PY_INT64_T id = PyInterpreterState_GetID(interp);
Eric Snow5be45a62019-03-08 22:47:07 -0700430 if (id < 0) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100431 return NULL;
Eric Snow5be45a62019-03-08 22:47:07 -0700432 }
433 if (requested_id == id) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100434 return interp;
Eric Snow5be45a62019-03-08 22:47:07 -0700435 }
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100436 interp = PyInterpreterState_Next(interp);
Eric Snowb05b7112019-03-01 12:35:10 -0700437 }
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100438 return NULL;
Eric Snowb05b7112019-03-01 12:35:10 -0700439}
440
Eric Snow5be45a62019-03-08 22:47:07 -0700441PyInterpreterState *
442_PyInterpreterState_LookUpID(PY_INT64_T requested_id)
443{
444 PyInterpreterState *interp = NULL;
445 if (requested_id >= 0) {
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200446 _PyRuntimeState *runtime = &_PyRuntime;
447 HEAD_LOCK(runtime);
448 interp = interp_look_up_id(runtime, requested_id);
449 HEAD_UNLOCK(runtime);
Eric Snow5be45a62019-03-08 22:47:07 -0700450 }
451 if (interp == NULL && !PyErr_Occurred()) {
452 PyErr_Format(PyExc_RuntimeError,
453 "unrecognized interpreter ID %lld", requested_id);
454 }
455 return interp;
456}
457
Eric Snow4c6955e2018-02-16 18:53:40 -0700458
459int
460_PyInterpreterState_IDInitref(PyInterpreterState *interp)
461{
462 if (interp->id_mutex != NULL) {
463 return 0;
464 }
465 interp->id_mutex = PyThread_allocate_lock();
466 if (interp->id_mutex == NULL) {
467 PyErr_SetString(PyExc_RuntimeError,
468 "failed to create init interpreter ID mutex");
469 return -1;
470 }
471 interp->id_refcount = 0;
472 return 0;
473}
474
475
476void
477_PyInterpreterState_IDIncref(PyInterpreterState *interp)
478{
479 if (interp->id_mutex == NULL) {
480 return;
481 }
482 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
483 interp->id_refcount += 1;
484 PyThread_release_lock(interp->id_mutex);
485}
486
487
488void
489_PyInterpreterState_IDDecref(PyInterpreterState *interp)
490{
491 if (interp->id_mutex == NULL) {
492 return;
493 }
Victor Stinner0fd2c302019-06-04 03:15:09 +0200494 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
Eric Snow4c6955e2018-02-16 18:53:40 -0700495 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
496 assert(interp->id_refcount != 0);
497 interp->id_refcount -= 1;
498 int64_t refcount = interp->id_refcount;
499 PyThread_release_lock(interp->id_mutex);
500
Eric Snowc11183c2019-03-15 16:35:46 -0600501 if (refcount == 0 && interp->requires_idref) {
Eric Snowf53d9f22018-02-20 16:30:17 -0700502 // XXX Using the "head" thread isn't strictly correct.
503 PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
504 // XXX Possible GILState issues?
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200505 PyThreadState *save_tstate = _PyThreadState_Swap(gilstate, tstate);
Eric Snow4c6955e2018-02-16 18:53:40 -0700506 Py_EndInterpreter(tstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200507 _PyThreadState_Swap(gilstate, save_tstate);
Eric Snow4c6955e2018-02-16 18:53:40 -0700508 }
509}
510
Eric Snowc11183c2019-03-15 16:35:46 -0600511int
512_PyInterpreterState_RequiresIDRef(PyInterpreterState *interp)
513{
514 return interp->requires_idref;
515}
516
517void
518_PyInterpreterState_RequireIDRef(PyInterpreterState *interp, int required)
519{
520 interp->requires_idref = required ? 1 : 0;
521}
522
Eric Snowc11183c2019-03-15 16:35:46 -0600523PyObject *
524_PyInterpreterState_GetMainModule(PyInterpreterState *interp)
525{
526 if (interp->modules == NULL) {
527 PyErr_SetString(PyExc_RuntimeError, "interpreter not initialized");
528 return NULL;
529 }
530 return PyMapping_GetItemString(interp->modules, "__main__");
531}
532
Eric Snowd2fdd1f2019-03-15 17:47:43 -0600533PyObject *
534PyInterpreterState_GetDict(PyInterpreterState *interp)
535{
536 if (interp->dict == NULL) {
537 interp->dict = PyDict_New();
538 if (interp->dict == NULL) {
539 PyErr_Clear();
540 }
541 }
542 /* Returning NULL means no per-interpreter dict is available. */
543 return interp->dict;
544}
545
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000546/* Default implementation for _PyThreadState_GetFrame */
547static struct _frame *
548threadstate_getframe(PyThreadState *self)
549{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 return self->frame;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000551}
552
Victor Stinner45b9be52010-03-03 23:28:07 +0000553static PyThreadState *
554new_threadstate(PyInterpreterState *interp, int init)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000555{
Victor Stinner0fd2c302019-06-04 03:15:09 +0200556 _PyRuntimeState *runtime = &_PyRuntime;
Victor Stinner1a7425f2013-07-07 16:25:15 +0200557 PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState));
Victor Stinner8bb32302019-04-24 16:47:40 +0200558 if (tstate == NULL) {
559 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000561
Victor Stinner8bb32302019-04-24 16:47:40 +0200562 if (_PyThreadState_GetFrame == NULL) {
563 _PyThreadState_GetFrame = threadstate_getframe;
564 }
565
566 tstate->interp = interp;
567
568 tstate->frame = NULL;
569 tstate->recursion_depth = 0;
570 tstate->overflowed = 0;
571 tstate->recursion_critical = 0;
572 tstate->stackcheck_counter = 0;
573 tstate->tracing = 0;
574 tstate->use_tracing = 0;
575 tstate->gilstate_counter = 0;
576 tstate->async_exc = NULL;
577 tstate->thread_id = PyThread_get_thread_ident();
578
579 tstate->dict = NULL;
580
581 tstate->curexc_type = NULL;
582 tstate->curexc_value = NULL;
583 tstate->curexc_traceback = NULL;
584
585 tstate->exc_state.exc_type = NULL;
586 tstate->exc_state.exc_value = NULL;
587 tstate->exc_state.exc_traceback = NULL;
588 tstate->exc_state.previous_item = NULL;
589 tstate->exc_info = &tstate->exc_state;
590
591 tstate->c_profilefunc = NULL;
592 tstate->c_tracefunc = NULL;
593 tstate->c_profileobj = NULL;
594 tstate->c_traceobj = NULL;
595
596 tstate->trash_delete_nesting = 0;
597 tstate->trash_delete_later = NULL;
598 tstate->on_delete = NULL;
599 tstate->on_delete_data = NULL;
600
601 tstate->coroutine_origin_tracking_depth = 0;
602
Victor Stinner8bb32302019-04-24 16:47:40 +0200603 tstate->async_gen_firstiter = NULL;
604 tstate->async_gen_finalizer = NULL;
605
606 tstate->context = NULL;
607 tstate->context_ver = 1;
608
Victor Stinner8bb32302019-04-24 16:47:40 +0200609 if (init) {
Victor Stinner0fd2c302019-06-04 03:15:09 +0200610 _PyThreadState_Init(runtime, tstate);
Victor Stinner8bb32302019-04-24 16:47:40 +0200611 }
612
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200613 HEAD_LOCK(runtime);
Stefan Krah5a92f422020-03-03 09:18:55 +0100614 tstate->id = ++interp->tstate_next_unique_id;
Victor Stinner8bb32302019-04-24 16:47:40 +0200615 tstate->prev = NULL;
616 tstate->next = interp->tstate_head;
617 if (tstate->next)
618 tstate->next->prev = tstate;
619 interp->tstate_head = tstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200620 HEAD_UNLOCK(runtime);
Victor Stinner8bb32302019-04-24 16:47:40 +0200621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000623}
624
Victor Stinner45b9be52010-03-03 23:28:07 +0000625PyThreadState *
626PyThreadState_New(PyInterpreterState *interp)
627{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 return new_threadstate(interp, 1);
Victor Stinner45b9be52010-03-03 23:28:07 +0000629}
630
631PyThreadState *
632_PyThreadState_Prealloc(PyInterpreterState *interp)
633{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 return new_threadstate(interp, 0);
Victor Stinner45b9be52010-03-03 23:28:07 +0000635}
636
637void
Victor Stinner0fd2c302019-06-04 03:15:09 +0200638_PyThreadState_Init(_PyRuntimeState *runtime, PyThreadState *tstate)
Victor Stinner45b9be52010-03-03 23:28:07 +0000639{
Victor Stinner8bb32302019-04-24 16:47:40 +0200640 _PyGILState_NoteThreadState(&runtime->gilstate, tstate);
Victor Stinner45b9be52010-03-03 23:28:07 +0000641}
642
Martin v. Löwis1a214512008-06-11 05:26:20 +0000643PyObject*
Martin v. Löwis7800f752012-06-22 12:20:55 +0200644PyState_FindModule(struct PyModuleDef* module)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000645{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200646 Py_ssize_t index = module->m_base.m_index;
Victor Stinner9204fb82018-10-30 15:13:17 +0100647 PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 PyObject *res;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000649 if (module->m_slots) {
650 return NULL;
651 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 if (index == 0)
653 return NULL;
654 if (state->modules_by_index == NULL)
655 return NULL;
Antoine Pitrou75506e82012-08-20 19:30:46 +0200656 if (index >= PyList_GET_SIZE(state->modules_by_index))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 return NULL;
658 res = PyList_GET_ITEM(state->modules_by_index, index);
659 return res==Py_None ? NULL : res;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000660}
661
662int
663_PyState_AddModule(PyObject* module, struct PyModuleDef* def)
664{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000665 PyInterpreterState *state;
Berker Peksag4b7b5652016-08-22 18:05:56 +0300666 if (!def) {
667 assert(PyErr_Occurred());
668 return -1;
669 }
Nick Coghland5cacbb2015-05-23 22:24:10 +1000670 if (def->m_slots) {
671 PyErr_SetString(PyExc_SystemError,
672 "PyState_AddModule called on module with slots");
673 return -1;
674 }
Victor Stinner9204fb82018-10-30 15:13:17 +0100675 state = _PyInterpreterState_GET_UNSAFE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 if (!state->modules_by_index) {
677 state->modules_by_index = PyList_New(0);
678 if (!state->modules_by_index)
679 return -1;
680 }
Miss Islington (bot)a5a71022019-09-11 17:04:27 -0700681 while (PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 if (PyList_Append(state->modules_by_index, Py_None) < 0)
683 return -1;
684 Py_INCREF(module);
685 return PyList_SetItem(state->modules_by_index,
686 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000687}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000688
Martin v. Löwis7800f752012-06-22 12:20:55 +0200689int
690PyState_AddModule(PyObject* module, struct PyModuleDef* def)
691{
692 Py_ssize_t index;
Victor Stinner9204fb82018-10-30 15:13:17 +0100693 PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200694 if (!def) {
695 Py_FatalError("PyState_AddModule: Module Definition is NULL");
696 return -1;
697 }
698 index = def->m_base.m_index;
Miss Islington (bot)a5a71022019-09-11 17:04:27 -0700699 if (state->modules_by_index &&
700 index < PyList_GET_SIZE(state->modules_by_index) &&
701 module == PyList_GET_ITEM(state->modules_by_index, index)) {
702 Py_FatalError("PyState_AddModule: Module already added!");
703 return -1;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200704 }
705 return _PyState_AddModule(module, def);
706}
707
708int
709PyState_RemoveModule(struct PyModuleDef* def)
710{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000711 PyInterpreterState *state;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200712 Py_ssize_t index = def->m_base.m_index;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000713 if (def->m_slots) {
714 PyErr_SetString(PyExc_SystemError,
715 "PyState_RemoveModule called on module with slots");
716 return -1;
717 }
Victor Stinner9204fb82018-10-30 15:13:17 +0100718 state = _PyInterpreterState_GET_UNSAFE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200719 if (index == 0) {
720 Py_FatalError("PyState_RemoveModule: Module index invalid.");
721 return -1;
722 }
723 if (state->modules_by_index == NULL) {
Miss Islington (bot)4bd1d052019-08-30 13:42:54 -0700724 Py_FatalError("PyState_RemoveModule: Interpreters module-list not accessible.");
Martin v. Löwis7800f752012-06-22 12:20:55 +0200725 return -1;
726 }
727 if (index > PyList_GET_SIZE(state->modules_by_index)) {
728 Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
729 return -1;
730 }
Zackery Spytz2a893432018-12-05 00:14:00 -0700731 Py_INCREF(Py_None);
Martin v. Löwis7800f752012-06-22 12:20:55 +0200732 return PyList_SetItem(state->modules_by_index, index, Py_None);
733}
734
Antoine Pitrou40322e62013-08-11 00:30:09 +0200735/* used by import.c:PyImport_Cleanup */
736void
737_PyState_ClearModules(void)
738{
Victor Stinner9204fb82018-10-30 15:13:17 +0100739 PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE();
Antoine Pitrou40322e62013-08-11 00:30:09 +0200740 if (state->modules_by_index) {
741 Py_ssize_t i;
742 for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) {
743 PyObject *m = PyList_GET_ITEM(state->modules_by_index, i);
744 if (PyModule_Check(m)) {
745 /* cleanup the saved copy of module dicts */
746 PyModuleDef *md = PyModule_GetDef(m);
747 if (md)
748 Py_CLEAR(md->m_base.m_copy);
749 }
750 }
751 /* Setting modules_by_index to NULL could be dangerous, so we
752 clear the list instead. */
753 if (PyList_SetSlice(state->modules_by_index,
754 0, PyList_GET_SIZE(state->modules_by_index),
755 NULL))
756 PyErr_WriteUnraisable(state->modules_by_index);
757 }
758}
759
Guido van Rossuma027efa1997-05-05 20:56:21 +0000760void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000761PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000762{
Victor Stinner331a6a52019-05-27 16:39:22 +0200763 int verbose = tstate->interp->config.verbose;
Victor Stinner53b7d4e2018-07-25 01:37:05 +0200764
765 if (verbose && tstate->frame != NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 fprintf(stderr,
767 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 Py_CLEAR(tstate->frame);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 Py_CLEAR(tstate->dict);
772 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 Py_CLEAR(tstate->curexc_type);
775 Py_CLEAR(tstate->curexc_value);
776 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000777
Mark Shannonae3087c2017-10-22 22:41:51 +0100778 Py_CLEAR(tstate->exc_state.exc_type);
779 Py_CLEAR(tstate->exc_state.exc_value);
780 Py_CLEAR(tstate->exc_state.exc_traceback);
Serhiy Storchakabdf42982017-10-26 16:59:40 +0300781
Mark Shannonae3087c2017-10-22 22:41:51 +0100782 /* The stack of exception states should contain just this thread. */
Victor Stinner53b7d4e2018-07-25 01:37:05 +0200783 if (verbose && tstate->exc_info != &tstate->exc_state) {
Mark Shannonae3087c2017-10-22 22:41:51 +0100784 fprintf(stderr,
785 "PyThreadState_Clear: warning: thread still has a generator\n");
786 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 tstate->c_profilefunc = NULL;
789 tstate->c_tracefunc = NULL;
790 Py_CLEAR(tstate->c_profileobj);
791 Py_CLEAR(tstate->c_traceobj);
Yury Selivanov75445082015-05-11 22:57:16 -0400792
Yury Selivanoveb636452016-09-08 22:01:51 -0700793 Py_CLEAR(tstate->async_gen_firstiter);
794 Py_CLEAR(tstate->async_gen_finalizer);
Yury Selivanovf23746a2018-01-22 19:11:18 -0500795
796 Py_CLEAR(tstate->context);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000797}
798
799
Guido van Rossum29757862001-01-23 01:46:06 +0000800/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
801static void
Victor Stinner0fd2c302019-06-04 03:15:09 +0200802tstate_delete_common(_PyRuntimeState *runtime, PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000803{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200804 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 Py_FatalError("PyThreadState_Delete: NULL tstate");
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200806 }
807 PyInterpreterState *interp = tstate->interp;
808 if (interp == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000809 Py_FatalError("PyThreadState_Delete: NULL interp");
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200810 }
811 HEAD_LOCK(runtime);
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200812 if (tstate->prev)
813 tstate->prev->next = tstate->next;
814 else
815 interp->tstate_head = tstate->next;
816 if (tstate->next)
817 tstate->next->prev = tstate->prev;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200818 HEAD_UNLOCK(runtime);
Antoine Pitrou7b476992013-09-07 23:38:37 +0200819 if (tstate->on_delete != NULL) {
820 tstate->on_delete(tstate->on_delete_data);
821 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200822 PyMem_RawFree(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000823}
824
825
Victor Stinner0fd2c302019-06-04 03:15:09 +0200826static void
827_PyThreadState_Delete(_PyRuntimeState *runtime, PyThreadState *tstate)
Guido van Rossum29757862001-01-23 01:46:06 +0000828{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200829 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
830 if (tstate == _PyRuntimeGILState_GetThreadState(gilstate)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 Py_FatalError("PyThreadState_Delete: tstate is still current");
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600832 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200833 if (gilstate->autoInterpreterState &&
834 PyThread_tss_get(&gilstate->autoTSSkey) == tstate)
835 {
836 PyThread_tss_set(&gilstate->autoTSSkey, NULL);
837 }
Victor Stinner0fd2c302019-06-04 03:15:09 +0200838 tstate_delete_common(runtime, tstate);
839}
840
841
842void
843PyThreadState_Delete(PyThreadState *tstate)
844{
845 _PyThreadState_Delete(&_PyRuntime, tstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200846}
847
848
849static void
850_PyThreadState_DeleteCurrent(_PyRuntimeState *runtime)
851{
852 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
853 PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 if (tstate == NULL)
855 Py_FatalError(
856 "PyThreadState_DeleteCurrent: no current tstate");
Victor Stinner0fd2c302019-06-04 03:15:09 +0200857 tstate_delete_common(runtime, tstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200858 if (gilstate->autoInterpreterState &&
859 PyThread_tss_get(&gilstate->autoTSSkey) == tstate)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600860 {
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200861 PyThread_tss_set(&gilstate->autoTSSkey, NULL);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600862 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200863 _PyRuntimeGILState_SetThreadState(gilstate, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 PyEval_ReleaseLock();
Guido van Rossum29757862001-01-23 01:46:06 +0000865}
Guido van Rossum29757862001-01-23 01:46:06 +0000866
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200867void
868PyThreadState_DeleteCurrent()
869{
870 _PyThreadState_DeleteCurrent(&_PyRuntime);
871}
872
Guido van Rossum29757862001-01-23 01:46:06 +0000873
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200874/*
875 * Delete all thread states except the one passed as argument.
876 * Note that, if there is a current thread state, it *must* be the one
877 * passed as argument. Also, this won't touch any other interpreters
878 * than the current one, since we don't know which thread state should
Miss Islington (bot)4bd1d052019-08-30 13:42:54 -0700879 * be kept in those other interpreters.
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200880 */
881void
Victor Stinner0fd2c302019-06-04 03:15:09 +0200882_PyThreadState_DeleteExcept(_PyRuntimeState *runtime, PyThreadState *tstate)
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200883{
884 PyInterpreterState *interp = tstate->interp;
885 PyThreadState *p, *next, *garbage;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200886 HEAD_LOCK(runtime);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200887 /* Remove all thread states, except tstate, from the linked list of
888 thread states. This will allow calling PyThreadState_Clear()
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200889 without holding the lock. */
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200890 garbage = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200891 if (garbage == tstate)
892 garbage = tstate->next;
893 if (tstate->prev)
894 tstate->prev->next = tstate->next;
895 if (tstate->next)
896 tstate->next->prev = tstate->prev;
897 tstate->prev = tstate->next = NULL;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200898 interp->tstate_head = tstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200899 HEAD_UNLOCK(runtime);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200900 /* Clear and deallocate all stale thread states. Even if this
901 executes Python code, we should be safe since it executes
902 in the current thread, not one of the stale threads. */
903 for (p = garbage; p; p = next) {
904 next = p->next;
905 PyThreadState_Clear(p);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200906 PyMem_RawFree(p);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200907 }
908}
909
910
Guido van Rossuma027efa1997-05-05 20:56:21 +0000911PyThreadState *
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100912_PyThreadState_UncheckedGet(void)
913{
Victor Stinner50b48572018-11-01 01:51:40 +0100914 return _PyThreadState_GET();
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100915}
916
917
918PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000919PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000920{
Victor Stinner50b48572018-11-01 01:51:40 +0100921 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 if (tstate == NULL)
923 Py_FatalError("PyThreadState_Get: no current thread");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000926}
927
928
Victor Stinner09532fe2019-05-10 23:39:09 +0200929PyThreadState *
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200930_PyThreadState_Swap(struct _gilstate_runtime_state *gilstate, PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000931{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200932 PyThreadState *oldts = _PyRuntimeGILState_GetThreadState(gilstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000933
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200934 _PyRuntimeGILState_SetThreadState(gilstate, newts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 /* It should not be possible for more than one thread state
936 to be used for a thread. Check this the best we can in debug
937 builds.
938 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200939#if defined(Py_DEBUG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 if (newts) {
941 /* This can be called from PyEval_RestoreThread(). Similar
942 to it, we need to ensure errno doesn't change.
943 */
944 int err = errno;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200945 PyThreadState *check = _PyGILState_GetThisThreadState(gilstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 if (check && check->interp == newts->interp && check != newts)
947 Py_FatalError("Invalid thread state for this thread");
948 errno = err;
949 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000950#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000952}
Guido van Rossumede04391998-04-10 20:18:25 +0000953
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200954PyThreadState *
955PyThreadState_Swap(PyThreadState *newts)
956{
957 return _PyThreadState_Swap(&_PyRuntime.gilstate, newts);
958}
959
Guido van Rossumede04391998-04-10 20:18:25 +0000960/* An extension mechanism to store arbitrary additional per-thread state.
961 PyThreadState_GetDict() returns a dictionary that can be used to hold such
962 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +0000963 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
964 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +0000965
966PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000967PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000968{
Victor Stinner50b48572018-11-01 01:51:40 +0100969 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 if (tstate == NULL)
971 return NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 if (tstate->dict == NULL) {
974 PyObject *d;
975 tstate->dict = d = PyDict_New();
976 if (d == NULL)
977 PyErr_Clear();
978 }
979 return tstate->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000980}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000981
982
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000983/* Asynchronously raise an exception in a thread.
984 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +0000985 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000986 to call this, or use ctypes. Must be called with the GIL held.
987 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
988 match any known thread id). Can be called with exc=NULL to clear an
989 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000990
991int
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200992PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc)
993{
Victor Stinner09532fe2019-05-10 23:39:09 +0200994 _PyRuntimeState *runtime = &_PyRuntime;
995 PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 /* Although the GIL is held, a few C API functions can be called
998 * without the GIL held, and in particular some that create and
999 * destroy thread and interpreter states. Those can mutate the
1000 * list of thread states we're traversing, so to prevent that we lock
1001 * head_mutex for the duration.
1002 */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001003 HEAD_LOCK(runtime);
Victor Stinner09532fe2019-05-10 23:39:09 +02001004 for (PyThreadState *p = interp->tstate_head; p != NULL; p = p->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 if (p->thread_id == id) {
1006 /* Tricky: we need to decref the current value
1007 * (if any) in p->async_exc, but that can in turn
1008 * allow arbitrary Python code to run, including
1009 * perhaps calls to this function. To prevent
1010 * deadlock, we need to release head_mutex before
1011 * the decref.
1012 */
1013 PyObject *old_exc = p->async_exc;
1014 Py_XINCREF(exc);
1015 p->async_exc = exc;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001016 HEAD_UNLOCK(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 Py_XDECREF(old_exc);
Victor Stinnere225beb2019-06-03 18:14:24 +02001018 _PyEval_SignalAsyncExc(&runtime->ceval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 return 1;
1020 }
1021 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001022 HEAD_UNLOCK(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001024}
1025
1026
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001027/* Routines for advanced debuggers, requested by David Beazley.
1028 Don't use unless you know what you are doing! */
1029
1030PyInterpreterState *
1031PyInterpreterState_Head(void)
1032{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001033 return _PyRuntime.interpreters.head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001034}
1035
1036PyInterpreterState *
Eric Snow6b4be192017-05-22 21:36:03 -07001037PyInterpreterState_Main(void)
1038{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001039 return _PyRuntime.interpreters.main;
Eric Snow6b4be192017-05-22 21:36:03 -07001040}
1041
1042PyInterpreterState *
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001043PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001045}
1046
1047PyThreadState *
1048PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001050}
1051
1052PyThreadState *
1053PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001055}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001056
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001057/* The implementation of sys._current_frames(). This is intended to be
1058 called with the GIL held, as it will be when called via
1059 sys._current_frames(). It's possible it would work fine even without
1060 the GIL held, but haven't thought enough about that.
1061*/
1062PyObject *
1063_PyThread_CurrentFrames(void)
1064{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 PyObject *result;
1066 PyInterpreterState *i;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001067
Steve Dowerb82e17e2019-05-23 08:45:22 -07001068 if (PySys_Audit("sys._current_frames", NULL) < 0) {
1069 return NULL;
1070 }
1071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 result = PyDict_New();
1073 if (result == NULL)
1074 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 /* for i in all interpreters:
1077 * for t in all of i's thread states:
1078 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +02001079 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 * need to grab head_mutex for the duration.
1081 */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001082 _PyRuntimeState *runtime = &_PyRuntime;
1083 HEAD_LOCK(runtime);
1084 for (i = runtime->interpreters.head; i != NULL; i = i->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 PyThreadState *t;
1086 for (t = i->tstate_head; t != NULL; t = t->next) {
1087 PyObject *id;
1088 int stat;
1089 struct _frame *frame = t->frame;
1090 if (frame == NULL)
1091 continue;
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +02001092 id = PyLong_FromUnsignedLong(t->thread_id);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001093 if (id == NULL)
1094 goto Fail;
1095 stat = PyDict_SetItem(result, id, (PyObject *)frame);
1096 Py_DECREF(id);
1097 if (stat < 0)
1098 goto Fail;
1099 }
1100 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001101 HEAD_UNLOCK(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001103
1104 Fail:
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001105 HEAD_UNLOCK(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 Py_DECREF(result);
1107 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001108}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001109
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001110/* Python "auto thread state" API. */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001111
1112/* Keep this as a static, as it is not reliable! It can only
1113 ever be compared to the state for the *current* thread.
1114 * If not equal, then it doesn't matter that the actual
1115 value may change immediately after comparison, as it can't
1116 possibly change to the current thread's state.
1117 * If equal, then the current thread holds the lock, so the value can't
1118 change until we yield the lock.
1119*/
1120static int
1121PyThreadState_IsCurrent(PyThreadState *tstate)
1122{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001123 /* Must be the tstate for this thread */
Victor Stinner0fd2c302019-06-04 03:15:09 +02001124 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001125 assert(_PyGILState_GetThisThreadState(gilstate) == tstate);
1126 return tstate == _PyRuntimeGILState_GetThreadState(gilstate);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001127}
1128
Tim Peters4c1f5ec2004-10-09 17:25:05 +00001129/* Internal initialization/finalization functions called by
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001130 Py_Initialize/Py_FinalizeEx
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001131*/
Tim Peters19717fa2004-10-09 17:38:29 +00001132void
Victor Stinner0fd2c302019-06-04 03:15:09 +02001133_PyGILState_Init(_PyRuntimeState *runtime,
1134 PyInterpreterState *interp, PyThreadState *tstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001135{
Victor Stinner8bb32302019-04-24 16:47:40 +02001136 /* must init with valid states */
Eric Snow396e0a82019-05-31 21:16:47 -06001137 assert(interp != NULL);
Victor Stinner0fd2c302019-06-04 03:15:09 +02001138 assert(tstate != NULL);
Victor Stinner8bb32302019-04-24 16:47:40 +02001139
Victor Stinner8bb32302019-04-24 16:47:40 +02001140 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
1141
1142 if (PyThread_tss_create(&gilstate->autoTSSkey) != 0) {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001143 Py_FatalError("Could not allocate TSS entry");
1144 }
Victor Stinner8bb32302019-04-24 16:47:40 +02001145 gilstate->autoInterpreterState = interp;
1146 assert(PyThread_tss_get(&gilstate->autoTSSkey) == NULL);
1147 assert(tstate->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +00001148
Victor Stinner8bb32302019-04-24 16:47:40 +02001149 _PyGILState_NoteThreadState(gilstate, tstate);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001150}
1151
Victor Stinner861d9ab2016-03-16 22:45:24 +01001152PyInterpreterState *
1153_PyGILState_GetInterpreterStateUnsafe(void)
1154{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001155 return _PyRuntime.gilstate.autoInterpreterState;
Victor Stinner861d9ab2016-03-16 22:45:24 +01001156}
1157
Tim Peters19717fa2004-10-09 17:38:29 +00001158void
Victor Stinner8e91c242019-04-24 17:24:01 +02001159_PyGILState_Fini(_PyRuntimeState *runtime)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001160{
Victor Stinner8e91c242019-04-24 17:24:01 +02001161 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
1162 PyThread_tss_delete(&gilstate->autoTSSkey);
1163 gilstate->autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001164}
1165
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001166/* Reset the TSS key - called by PyOS_AfterFork_Child().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001167 * This should not be necessary, but some - buggy - pthread implementations
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001168 * don't reset TSS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001169 */
1170void
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001171_PyGILState_Reinit(_PyRuntimeState *runtime)
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001172{
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001173 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001174 PyThreadState *tstate = _PyGILState_GetThisThreadState(gilstate);
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001175
1176 PyThread_tss_delete(&gilstate->autoTSSkey);
1177 if (PyThread_tss_create(&gilstate->autoTSSkey) != 0) {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001178 Py_FatalError("Could not allocate TSS entry");
1179 }
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001180
Charles-François Natalia233df82011-11-22 19:49:51 +01001181 /* If the thread had an associated auto thread state, reassociate it with
1182 * the new key. */
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001183 if (tstate &&
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001184 PyThread_tss_set(&gilstate->autoTSSkey, (void *)tstate) != 0)
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001185 {
1186 Py_FatalError("Couldn't create autoTSSkey mapping");
1187 }
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001188}
1189
Michael W. Hudson188d4362005-06-20 16:52:57 +00001190/* When a thread state is created for a thread by some mechanism other than
1191 PyGILState_Ensure, it's important that the GILState machinery knows about
1192 it so it doesn't try to create another thread state for the thread (this is
1193 a better fix for SF bug #1010677 than the first one attempted).
1194*/
Thomas Wouters89f507f2006-12-13 04:49:30 +00001195static void
Victor Stinner8bb32302019-04-24 16:47:40 +02001196_PyGILState_NoteThreadState(struct _gilstate_runtime_state *gilstate, PyThreadState* tstate)
Michael W. Hudson188d4362005-06-20 16:52:57 +00001197{
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001198 /* If autoTSSkey isn't initialized, this must be the very first
Antoine Pitrou079ce542010-09-08 12:37:10 +00001199 threadstate created in Py_Initialize(). Don't do anything for now
1200 (we'll be back here when _PyGILState_Init is called). */
Victor Stinner8bb32302019-04-24 16:47:40 +02001201 if (!gilstate->autoInterpreterState) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 return;
Victor Stinner8bb32302019-04-24 16:47:40 +02001203 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001204
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001205 /* Stick the thread state for this thread in thread specific storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +00001206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 The only situation where you can legitimately have more than one
1208 thread state for an OS level thread is when there are multiple
Victor Stinner590cebe2013-12-13 11:08:56 +01001209 interpreters.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001210
Victor Stinner590cebe2013-12-13 11:08:56 +01001211 You shouldn't really be using the PyGILState_ APIs anyway (see issues
1212 #10915 and #15751).
Michael W. Hudson188d4362005-06-20 16:52:57 +00001213
Victor Stinner590cebe2013-12-13 11:08:56 +01001214 The first thread state created for that given OS level thread will
1215 "win", which seems reasonable behaviour.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 */
Victor Stinner8bb32302019-04-24 16:47:40 +02001217 if (PyThread_tss_get(&gilstate->autoTSSkey) == NULL) {
1218 if ((PyThread_tss_set(&gilstate->autoTSSkey, (void *)tstate)) != 0) {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001219 Py_FatalError("Couldn't create autoTSSkey mapping");
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001220 }
Victor Stinner590cebe2013-12-13 11:08:56 +01001221 }
Michael W. Hudson188d4362005-06-20 16:52:57 +00001222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 /* PyGILState_Release must not try to delete this thread state. */
1224 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +00001225}
1226
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001227/* The public functions */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001228static PyThreadState *
1229_PyGILState_GetThisThreadState(struct _gilstate_runtime_state *gilstate)
1230{
1231 if (gilstate->autoInterpreterState == NULL)
1232 return NULL;
1233 return (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey);
1234}
1235
Tim Peters19717fa2004-10-09 17:38:29 +00001236PyThreadState *
1237PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001238{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001239 return _PyGILState_GetThisThreadState(&_PyRuntime.gilstate);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001240}
1241
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -07001242int
1243PyGILState_Check(void)
1244{
Victor Stinner8a1be612016-03-14 22:07:55 +01001245
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001246 if (!_PyGILState_check_enabled) {
Victor Stinner8a1be612016-03-14 22:07:55 +01001247 return 1;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001248 }
Victor Stinner8a1be612016-03-14 22:07:55 +01001249
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001250 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
1251 if (!PyThread_tss_is_created(&gilstate->autoTSSkey)) {
1252 return 1;
1253 }
Victor Stinner8a1be612016-03-14 22:07:55 +01001254
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001255 PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate);
1256 if (tstate == NULL) {
1257 return 0;
1258 }
1259
1260 return (tstate == _PyGILState_GetThisThreadState(gilstate));
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -07001261}
1262
Tim Peters19717fa2004-10-09 17:38:29 +00001263PyGILState_STATE
1264PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001265{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001266 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 int current;
1268 PyThreadState *tcur;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001269 int need_init_threads = 0;
1270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 /* Note that we do not auto-init Python here - apart from
1272 potential races with 2 threads auto-initializing, pep-311
1273 spells out other issues. Embedders are expected to have
1274 called Py_Initialize() and usually PyEval_InitThreads().
1275 */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001276 /* Py_Initialize() hasn't been called! */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001277 assert(gilstate->autoInterpreterState);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001278
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001279 tcur = (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 if (tcur == NULL) {
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001281 need_init_threads = 1;
Victor Stinner62ca1002013-12-13 01:46:43 +01001282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 /* Create a new thread state for this thread */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001284 tcur = PyThreadState_New(gilstate->autoInterpreterState);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 if (tcur == NULL)
1286 Py_FatalError("Couldn't create thread-state for new thread");
1287 /* This is our thread state! We'll need to delete it in the
1288 matching call to PyGILState_Release(). */
1289 tcur->gilstate_counter = 0;
1290 current = 0; /* new thread state is never current */
1291 }
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001292 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 current = PyThreadState_IsCurrent(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001294 }
1295
1296 if (current == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 PyEval_RestoreThread(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001298 }
1299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 /* Update our counter in the thread-state - no need for locks:
1301 - tcur will remain valid as we hold the GIL.
1302 - the counter is safe as we are the only thread "allowed"
1303 to modify this value
1304 */
1305 ++tcur->gilstate_counter;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001306
1307 if (need_init_threads) {
1308 /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is
1309 called from a new thread for the first time, we need the create the
1310 GIL. */
1311 PyEval_InitThreads();
1312 }
1313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001315}
1316
Tim Peters19717fa2004-10-09 17:38:29 +00001317void
1318PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001319{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001320 _PyRuntimeState *runtime = &_PyRuntime;
1321 PyThreadState *tcur = PyThread_tss_get(&runtime->gilstate.autoTSSkey);
1322 if (tcur == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 Py_FatalError("auto-releasing thread-state, "
1324 "but no thread-state for this thread");
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001325 }
1326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 /* We must hold the GIL and have our thread state current */
1328 /* XXX - remove the check - the assert should be fine,
1329 but while this is very new (April 2003), the extra check
1330 by release-only users can't hurt.
1331 */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001332 if (!PyThreadState_IsCurrent(tcur)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 Py_FatalError("This thread state must be current when releasing");
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001334 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 assert(PyThreadState_IsCurrent(tcur));
1336 --tcur->gilstate_counter;
1337 assert(tcur->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 /* If we're going to destroy this thread-state, we must
1340 * clear it while the GIL is held, as destructors may run.
1341 */
1342 if (tcur->gilstate_counter == 0) {
1343 /* can't have been locked when we created it */
1344 assert(oldstate == PyGILState_UNLOCKED);
1345 PyThreadState_Clear(tcur);
1346 /* Delete the thread-state. Note this releases the GIL too!
1347 * It's vital that the GIL be held here, to avoid shutdown
1348 * races; see bugs 225673 and 1061968 (that nasty bug has a
1349 * habit of coming back).
1350 */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001351 _PyThreadState_DeleteCurrent(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001352 }
1353 /* Release the lock if necessary */
1354 else if (oldstate == PyGILState_UNLOCKED)
1355 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001356}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001357
Benjamin Peterson3bf01752012-04-13 18:06:36 -04001358
Eric Snow7f8bfc92018-01-29 18:23:44 -07001359/**************************/
1360/* cross-interpreter data */
1361/**************************/
1362
1363/* cross-interpreter data */
1364
1365crossinterpdatafunc _PyCrossInterpreterData_Lookup(PyObject *);
1366
1367/* This is a separate func from _PyCrossInterpreterData_Lookup in order
1368 to keep the registry code separate. */
1369static crossinterpdatafunc
1370_lookup_getdata(PyObject *obj)
1371{
1372 crossinterpdatafunc getdata = _PyCrossInterpreterData_Lookup(obj);
1373 if (getdata == NULL && PyErr_Occurred() == 0)
1374 PyErr_Format(PyExc_ValueError,
1375 "%S does not support cross-interpreter data", obj);
1376 return getdata;
1377}
1378
1379int
1380_PyObject_CheckCrossInterpreterData(PyObject *obj)
1381{
1382 crossinterpdatafunc getdata = _lookup_getdata(obj);
1383 if (getdata == NULL) {
1384 return -1;
1385 }
1386 return 0;
1387}
1388
1389static int
1390_check_xidata(_PyCrossInterpreterData *data)
1391{
1392 // data->data can be anything, including NULL, so we don't check it.
1393
1394 // data->obj may be NULL, so we don't check it.
1395
1396 if (data->interp < 0) {
1397 PyErr_SetString(PyExc_SystemError, "missing interp");
1398 return -1;
1399 }
1400
1401 if (data->new_object == NULL) {
1402 PyErr_SetString(PyExc_SystemError, "missing new_object func");
1403 return -1;
1404 }
1405
1406 // data->free may be NULL, so we don't check it.
1407
1408 return 0;
1409}
1410
1411int
1412_PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data)
1413{
Victor Stinnercaba55b2018-08-03 15:33:52 +02001414 // _PyInterpreterState_Get() aborts if lookup fails, so we don't need
Eric Snow7f8bfc92018-01-29 18:23:44 -07001415 // to check the result for NULL.
Victor Stinnercaba55b2018-08-03 15:33:52 +02001416 PyInterpreterState *interp = _PyInterpreterState_Get();
Eric Snow7f8bfc92018-01-29 18:23:44 -07001417
1418 // Reset data before re-populating.
1419 *data = (_PyCrossInterpreterData){0};
1420 data->free = PyMem_RawFree; // Set a default that may be overridden.
1421
1422 // Call the "getdata" func for the object.
1423 Py_INCREF(obj);
1424 crossinterpdatafunc getdata = _lookup_getdata(obj);
1425 if (getdata == NULL) {
1426 Py_DECREF(obj);
1427 return -1;
1428 }
1429 int res = getdata(obj, data);
1430 Py_DECREF(obj);
1431 if (res != 0) {
1432 return -1;
1433 }
1434
1435 // Fill in the blanks and validate the result.
Eric Snow7f8bfc92018-01-29 18:23:44 -07001436 data->interp = interp->id;
1437 if (_check_xidata(data) != 0) {
1438 _PyCrossInterpreterData_Release(data);
1439 return -1;
1440 }
1441
1442 return 0;
1443}
1444
Victor Stinnere225beb2019-06-03 18:14:24 +02001445static void
Eric Snow63799132018-06-01 18:45:20 -06001446_release_xidata(void *arg)
1447{
1448 _PyCrossInterpreterData *data = (_PyCrossInterpreterData *)arg;
1449 if (data->free != NULL) {
1450 data->free(data->data);
1451 }
1452 Py_XDECREF(data->obj);
Victor Stinnere225beb2019-06-03 18:14:24 +02001453}
1454
1455static void
1456_call_in_interpreter(struct _gilstate_runtime_state *gilstate,
1457 PyInterpreterState *interp,
1458 void (*func)(void *), void *arg)
1459{
1460 /* We would use Py_AddPendingCall() if it weren't specific to the
1461 * main interpreter (see bpo-33608). In the meantime we take a
1462 * naive approach.
1463 */
1464 PyThreadState *save_tstate = NULL;
1465 if (interp != _PyRuntimeGILState_GetThreadState(gilstate)->interp) {
1466 // XXX Using the "head" thread isn't strictly correct.
1467 PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
1468 // XXX Possible GILState issues?
1469 save_tstate = _PyThreadState_Swap(gilstate, tstate);
1470 }
1471
1472 func(arg);
1473
1474 // Switch back.
1475 if (save_tstate != NULL) {
1476 _PyThreadState_Swap(gilstate, save_tstate);
1477 }
Eric Snow63799132018-06-01 18:45:20 -06001478}
1479
Eric Snow7f8bfc92018-01-29 18:23:44 -07001480void
1481_PyCrossInterpreterData_Release(_PyCrossInterpreterData *data)
1482{
1483 if (data->data == NULL && data->obj == NULL) {
1484 // Nothing to release!
1485 return;
1486 }
1487
Victor Stinnere225beb2019-06-03 18:14:24 +02001488 // Switch to the original interpreter.
Eric Snow7f8bfc92018-01-29 18:23:44 -07001489 PyInterpreterState *interp = _PyInterpreterState_LookUpID(data->interp);
1490 if (interp == NULL) {
1491 // The intepreter was already destroyed.
1492 if (data->free != NULL) {
1493 // XXX Someone leaked some memory...
1494 }
1495 return;
1496 }
Eric Snowf53d9f22018-02-20 16:30:17 -07001497
Eric Snow7f8bfc92018-01-29 18:23:44 -07001498 // "Release" the data and/or the object.
Victor Stinnere225beb2019-06-03 18:14:24 +02001499 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
1500 _call_in_interpreter(gilstate, interp, _release_xidata, data);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001501}
1502
1503PyObject *
1504_PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *data)
1505{
1506 return data->new_object(data);
1507}
1508
1509/* registry of {type -> crossinterpdatafunc} */
1510
1511/* For now we use a global registry of shareable classes. An
1512 alternative would be to add a tp_* slot for a class's
1513 crossinterpdatafunc. It would be simpler and more efficient. */
1514
1515static int
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001516_register_xidata(struct _xidregistry *xidregistry, PyTypeObject *cls,
1517 crossinterpdatafunc getdata)
Eric Snow7f8bfc92018-01-29 18:23:44 -07001518{
1519 // Note that we effectively replace already registered classes
1520 // rather than failing.
1521 struct _xidregitem *newhead = PyMem_RawMalloc(sizeof(struct _xidregitem));
1522 if (newhead == NULL)
1523 return -1;
1524 newhead->cls = cls;
1525 newhead->getdata = getdata;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001526 newhead->next = xidregistry->head;
1527 xidregistry->head = newhead;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001528 return 0;
1529}
1530
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001531static void _register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001532
1533int
Eric Snowc11183c2019-03-15 16:35:46 -06001534_PyCrossInterpreterData_RegisterClass(PyTypeObject *cls,
Eric Snow7f8bfc92018-01-29 18:23:44 -07001535 crossinterpdatafunc getdata)
1536{
1537 if (!PyType_Check(cls)) {
1538 PyErr_Format(PyExc_ValueError, "only classes may be registered");
1539 return -1;
1540 }
1541 if (getdata == NULL) {
1542 PyErr_Format(PyExc_ValueError, "missing 'getdata' func");
1543 return -1;
1544 }
1545
1546 // Make sure the class isn't ever deallocated.
1547 Py_INCREF((PyObject *)cls);
1548
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001549 struct _xidregistry *xidregistry = &_PyRuntime.xidregistry ;
1550 PyThread_acquire_lock(xidregistry->mutex, WAIT_LOCK);
1551 if (xidregistry->head == NULL) {
1552 _register_builtins_for_crossinterpreter_data(xidregistry);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001553 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001554 int res = _register_xidata(xidregistry, cls, getdata);
1555 PyThread_release_lock(xidregistry->mutex);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001556 return res;
1557}
1558
Eric Snow6d2cd902018-05-16 15:04:57 -04001559/* Cross-interpreter objects are looked up by exact match on the class.
1560 We can reassess this policy when we move from a global registry to a
1561 tp_* slot. */
1562
Eric Snow7f8bfc92018-01-29 18:23:44 -07001563crossinterpdatafunc
1564_PyCrossInterpreterData_Lookup(PyObject *obj)
1565{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001566 struct _xidregistry *xidregistry = &_PyRuntime.xidregistry ;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001567 PyObject *cls = PyObject_Type(obj);
1568 crossinterpdatafunc getdata = NULL;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001569 PyThread_acquire_lock(xidregistry->mutex, WAIT_LOCK);
1570 struct _xidregitem *cur = xidregistry->head;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001571 if (cur == NULL) {
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001572 _register_builtins_for_crossinterpreter_data(xidregistry);
1573 cur = xidregistry->head;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001574 }
1575 for(; cur != NULL; cur = cur->next) {
1576 if (cur->cls == (PyTypeObject *)cls) {
1577 getdata = cur->getdata;
1578 break;
1579 }
1580 }
Eric Snow4e9da0d2018-02-02 21:49:49 -07001581 Py_DECREF(cls);
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001582 PyThread_release_lock(xidregistry->mutex);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001583 return getdata;
1584}
1585
1586/* cross-interpreter data for builtin types */
1587
Eric Snow6d2cd902018-05-16 15:04:57 -04001588struct _shared_bytes_data {
1589 char *bytes;
1590 Py_ssize_t len;
1591};
1592
Eric Snow7f8bfc92018-01-29 18:23:44 -07001593static PyObject *
1594_new_bytes_object(_PyCrossInterpreterData *data)
1595{
Eric Snow6d2cd902018-05-16 15:04:57 -04001596 struct _shared_bytes_data *shared = (struct _shared_bytes_data *)(data->data);
1597 return PyBytes_FromStringAndSize(shared->bytes, shared->len);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001598}
1599
1600static int
1601_bytes_shared(PyObject *obj, _PyCrossInterpreterData *data)
1602{
Eric Snow6d2cd902018-05-16 15:04:57 -04001603 struct _shared_bytes_data *shared = PyMem_NEW(struct _shared_bytes_data, 1);
1604 if (PyBytes_AsStringAndSize(obj, &shared->bytes, &shared->len) < 0) {
1605 return -1;
1606 }
1607 data->data = (void *)shared;
Eric Snow63799132018-06-01 18:45:20 -06001608 Py_INCREF(obj);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001609 data->obj = obj; // Will be "released" (decref'ed) when data released.
1610 data->new_object = _new_bytes_object;
Eric Snow6d2cd902018-05-16 15:04:57 -04001611 data->free = PyMem_Free;
1612 return 0;
1613}
1614
1615struct _shared_str_data {
1616 int kind;
1617 const void *buffer;
1618 Py_ssize_t len;
1619};
1620
1621static PyObject *
1622_new_str_object(_PyCrossInterpreterData *data)
1623{
1624 struct _shared_str_data *shared = (struct _shared_str_data *)(data->data);
1625 return PyUnicode_FromKindAndData(shared->kind, shared->buffer, shared->len);
1626}
1627
1628static int
1629_str_shared(PyObject *obj, _PyCrossInterpreterData *data)
1630{
1631 struct _shared_str_data *shared = PyMem_NEW(struct _shared_str_data, 1);
1632 shared->kind = PyUnicode_KIND(obj);
1633 shared->buffer = PyUnicode_DATA(obj);
1634 shared->len = PyUnicode_GET_LENGTH(obj) - 1;
1635 data->data = (void *)shared;
Eric Snow63799132018-06-01 18:45:20 -06001636 Py_INCREF(obj);
Eric Snow6d2cd902018-05-16 15:04:57 -04001637 data->obj = obj; // Will be "released" (decref'ed) when data released.
1638 data->new_object = _new_str_object;
1639 data->free = PyMem_Free;
1640 return 0;
1641}
1642
1643static PyObject *
1644_new_long_object(_PyCrossInterpreterData *data)
1645{
Alexey Izbyshev16f842d2019-02-12 19:06:43 +03001646 return PyLong_FromSsize_t((Py_ssize_t)(data->data));
Eric Snow6d2cd902018-05-16 15:04:57 -04001647}
1648
1649static int
1650_long_shared(PyObject *obj, _PyCrossInterpreterData *data)
1651{
Alexey Izbyshev16f842d2019-02-12 19:06:43 +03001652 /* Note that this means the size of shareable ints is bounded by
1653 * sys.maxsize. Hence on 32-bit architectures that is half the
1654 * size of maximum shareable ints on 64-bit.
1655 */
1656 Py_ssize_t value = PyLong_AsSsize_t(obj);
Eric Snow6d2cd902018-05-16 15:04:57 -04001657 if (value == -1 && PyErr_Occurred()) {
1658 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1659 PyErr_SetString(PyExc_OverflowError, "try sending as bytes");
1660 }
1661 return -1;
1662 }
1663 data->data = (void *)value;
1664 data->obj = NULL;
1665 data->new_object = _new_long_object;
1666 data->free = NULL;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001667 return 0;
1668}
1669
1670static PyObject *
1671_new_none_object(_PyCrossInterpreterData *data)
1672{
1673 // XXX Singleton refcounts are problematic across interpreters...
1674 Py_INCREF(Py_None);
1675 return Py_None;
1676}
1677
1678static int
1679_none_shared(PyObject *obj, _PyCrossInterpreterData *data)
1680{
1681 data->data = NULL;
1682 // data->obj remains NULL
1683 data->new_object = _new_none_object;
1684 data->free = NULL; // There is nothing to free.
1685 return 0;
1686}
1687
1688static void
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001689_register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry)
Eric Snow7f8bfc92018-01-29 18:23:44 -07001690{
1691 // None
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001692 if (_register_xidata(xidregistry, (PyTypeObject *)PyObject_Type(Py_None), _none_shared) != 0) {
Eric Snow7f8bfc92018-01-29 18:23:44 -07001693 Py_FatalError("could not register None for cross-interpreter sharing");
1694 }
1695
Eric Snow6d2cd902018-05-16 15:04:57 -04001696 // int
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001697 if (_register_xidata(xidregistry, &PyLong_Type, _long_shared) != 0) {
Eric Snow6d2cd902018-05-16 15:04:57 -04001698 Py_FatalError("could not register int for cross-interpreter sharing");
1699 }
1700
Eric Snow7f8bfc92018-01-29 18:23:44 -07001701 // bytes
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001702 if (_register_xidata(xidregistry, &PyBytes_Type, _bytes_shared) != 0) {
Eric Snow7f8bfc92018-01-29 18:23:44 -07001703 Py_FatalError("could not register bytes for cross-interpreter sharing");
1704 }
Eric Snow6d2cd902018-05-16 15:04:57 -04001705
1706 // str
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001707 if (_register_xidata(xidregistry, &PyUnicode_Type, _str_shared) != 0) {
Eric Snow6d2cd902018-05-16 15:04:57 -04001708 Py_FatalError("could not register str for cross-interpreter sharing");
1709 }
Eric Snow7f8bfc92018-01-29 18:23:44 -07001710}
1711
1712
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001713#ifdef __cplusplus
1714}
1715#endif