blob: a9f3389a0d833e2b00bc2dc495edd18542f658b9 [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 Stinner10c8e6a2019-04-26 01:53:18 +020042
43
Victor Stinner331a6a52019-05-27 16:39:22 +020044static PyStatus
Victor Stinner5d39e042017-11-29 17:20:38 +010045_PyRuntimeState_Init_impl(_PyRuntimeState *runtime)
Eric Snow2ebc5ce2017-09-07 23:51:28 -060046{
Steve Dowerb82e17e2019-05-23 08:45:22 -070047 /* We preserve the hook across init, because there is
48 currently no public API to set it between runtime
49 initialization and interpreter initialization. */
50 void *open_code_hook = runtime->open_code_hook;
51 void *open_code_userdata = runtime->open_code_userdata;
52 _Py_AuditHookEntry *audit_hook_head = runtime->audit_hook_head;
53
Eric Snow2ebc5ce2017-09-07 23:51:28 -060054 memset(runtime, 0, sizeof(*runtime));
Victor Stinner8a1be612016-03-14 22:07:55 +010055
Steve Dowerb82e17e2019-05-23 08:45:22 -070056 runtime->open_code_hook = open_code_hook;
57 runtime->open_code_userdata = open_code_userdata;
58 runtime->audit_hook_head = audit_hook_head;
59
Eric Snow2ebc5ce2017-09-07 23:51:28 -060060 _PyGC_Initialize(&runtime->gc);
61 _PyEval_Initialize(&runtime->ceval);
Victor Stinner331a6a52019-05-27 16:39:22 +020062 PyPreConfig_InitPythonConfig(&runtime->preconfig);
Michael W. Hudson188d4362005-06-20 16:52:57 +000063
Eric Snow2ebc5ce2017-09-07 23:51:28 -060064 runtime->gilstate.check_enabled = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -080065
Masayuki Yamamoto731e1892017-10-06 19:41:34 +090066 /* A TSS key must be initialized with Py_tss_NEEDS_INIT
67 in accordance with the specification. */
Victor Stinnerf7e5b562017-11-15 15:48:08 -080068 Py_tss_t initial = Py_tss_NEEDS_INIT;
69 runtime->gilstate.autoTSSkey = initial;
Guido van Rossum1d5ad901999-06-18 14:22:24 +000070
Eric Snow2ebc5ce2017-09-07 23:51:28 -060071 runtime->interpreters.mutex = PyThread_allocate_lock();
Victor Stinnerf7e5b562017-11-15 15:48:08 -080072 if (runtime->interpreters.mutex == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +020073 return _PyStatus_ERR("Can't initialize threads for interpreter");
Victor Stinnerf7e5b562017-11-15 15:48:08 -080074 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -060075 runtime->interpreters.next_id = -1;
Eric Snow7f8bfc92018-01-29 18:23:44 -070076
77 runtime->xidregistry.mutex = PyThread_allocate_lock();
78 if (runtime->xidregistry.mutex == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +020079 return _PyStatus_ERR("Can't initialize threads for cross-interpreter data registry");
Eric Snow7f8bfc92018-01-29 18:23:44 -070080 }
81
Eric Snow8479a342019-03-08 23:44:33 -070082 // Set it to the ID of the main thread of the main interpreter.
83 runtime->main_thread = PyThread_get_thread_ident();
Eric Snow5be45a62019-03-08 22:47:07 -070084
Victor Stinner331a6a52019-05-27 16:39:22 +020085 return _PyStatus_OK();
Eric Snow2ebc5ce2017-09-07 23:51:28 -060086}
Eric Snow05351c12017-09-05 21:43:08 -070087
Victor Stinner331a6a52019-05-27 16:39:22 +020088PyStatus
Victor Stinner5d39e042017-11-29 17:20:38 +010089_PyRuntimeState_Init(_PyRuntimeState *runtime)
90{
91 /* Force default allocator, since _PyRuntimeState_Fini() must
92 use the same allocator than this function. */
93 PyMemAllocatorEx old_alloc;
94 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
95
Victor Stinner331a6a52019-05-27 16:39:22 +020096 PyStatus status = _PyRuntimeState_Init_impl(runtime);
Victor Stinner5d39e042017-11-29 17:20:38 +010097
98 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinner331a6a52019-05-27 16:39:22 +020099 return status;
Victor Stinner5d39e042017-11-29 17:20:38 +0100100}
101
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600102void
103_PyRuntimeState_Fini(_PyRuntimeState *runtime)
104{
Victor Stinner5d39e042017-11-29 17:20:38 +0100105 /* Force the allocator used by _PyRuntimeState_Init(). */
106 PyMemAllocatorEx old_alloc;
107 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinnerccb04422017-11-16 03:20:31 -0800108
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600109 if (runtime->interpreters.mutex != NULL) {
110 PyThread_free_lock(runtime->interpreters.mutex);
111 runtime->interpreters.mutex = NULL;
112 }
Victor Stinnerccb04422017-11-16 03:20:31 -0800113
Stéphane Wirtel943395f2019-03-19 11:51:32 +0100114 if (runtime->xidregistry.mutex != NULL) {
115 PyThread_free_lock(runtime->xidregistry.mutex);
116 runtime->xidregistry.mutex = NULL;
117 }
118
Victor Stinnerccb04422017-11-16 03:20:31 -0800119 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600120}
121
Eric Snow8479a342019-03-08 23:44:33 -0700122/* This function is called from PyOS_AfterFork_Child to ensure that
123 * newly created child processes do not share locks with the parent.
124 */
125
126void
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200127_PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime)
Eric Snow8479a342019-03-08 23:44:33 -0700128{
129 // This was initially set in _PyRuntimeState_Init().
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200130 runtime->main_thread = PyThread_get_thread_ident();
Eric Snow8479a342019-03-08 23:44:33 -0700131
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200132 /* Force default allocator, since _PyRuntimeState_Fini() must
133 use the same allocator than this function. */
134 PyMemAllocatorEx old_alloc;
135 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
136
137 runtime->interpreters.mutex = PyThread_allocate_lock();
138 runtime->interpreters.main->id_mutex = PyThread_allocate_lock();
139 runtime->xidregistry.mutex = PyThread_allocate_lock();
140
141 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
142
143 if (runtime->interpreters.mutex == NULL) {
Eric Snow8479a342019-03-08 23:44:33 -0700144 Py_FatalError("Can't initialize lock for runtime interpreters");
145 }
146
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200147 if (runtime->interpreters.main->id_mutex == NULL) {
Eric Snow8479a342019-03-08 23:44:33 -0700148 Py_FatalError("Can't initialize ID lock for main interpreter");
149 }
150
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200151 if (runtime->xidregistry.mutex == NULL) {
Eric Snow8479a342019-03-08 23:44:33 -0700152 Py_FatalError("Can't initialize lock for cross-interpreter data registry");
153 }
154}
155
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200156#define HEAD_LOCK(runtime) \
157 PyThread_acquire_lock((runtime)->interpreters.mutex, WAIT_LOCK)
158#define HEAD_UNLOCK(runtime) \
159 PyThread_release_lock((runtime)->interpreters.mutex)
Eric Snow05351c12017-09-05 21:43:08 -0700160
Victor Stinner8bb32302019-04-24 16:47:40 +0200161/* Forward declaration */
162static void _PyGILState_NoteThreadState(
163 struct _gilstate_runtime_state *gilstate, PyThreadState* tstate);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000164
Victor Stinner331a6a52019-05-27 16:39:22 +0200165PyStatus
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600166_PyInterpreterState_Enable(_PyRuntimeState *runtime)
Eric Snowe3774162017-05-22 19:46:40 -0700167{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200168 struct pyinterpreters *interpreters = &runtime->interpreters;
169 interpreters->next_id = 0;
Victor Stinner5d926472018-03-06 14:31:37 +0100170
171 /* Py_Finalize() calls _PyRuntimeState_Fini() which clears the mutex.
172 Create a new mutex if needed. */
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200173 if (interpreters->mutex == NULL) {
Victor Stinner5d926472018-03-06 14:31:37 +0100174 /* Force default allocator, since _PyRuntimeState_Fini() must
175 use the same allocator than this function. */
176 PyMemAllocatorEx old_alloc;
177 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
178
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200179 interpreters->mutex = PyThread_allocate_lock();
Victor Stinner5d926472018-03-06 14:31:37 +0100180
181 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
182
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200183 if (interpreters->mutex == NULL) {
Victor Stinner331a6a52019-05-27 16:39:22 +0200184 return _PyStatus_ERR("Can't initialize threads for interpreter");
Victor Stinnera7368ac2017-11-15 18:11:45 -0800185 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600186 }
Victor Stinner5d926472018-03-06 14:31:37 +0100187
Victor Stinner331a6a52019-05-27 16:39:22 +0200188 return _PyStatus_OK();
Eric Snowe3774162017-05-22 19:46:40 -0700189}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000190
191PyInterpreterState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000192PyInterpreterState_New(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000193{
Eric Snow396e0a82019-05-31 21:16:47 -0600194 _PyRuntimeState *runtime = &_PyRuntime;
195
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 Snow396e0a82019-05-31 21:16:47 -0600206
207 interp->runtime = runtime;
208
Eric Snow4c6955e2018-02-16 18:53:40 -0700209 interp->id_refcount = -1;
Victor Stinnerd4341102017-11-23 00:12:09 +0100210 interp->check_interval = 100;
Victor Stinner022be022019-05-22 23:58:50 +0200211
Victor Stinner331a6a52019-05-27 16:39:22 +0200212 PyStatus status = PyConfig_InitPythonConfig(&interp->config);
213 if (_PyStatus_EXCEPTION(status)) {
214 /* Don't report status to caller: PyConfig_InitPythonConfig()
215 can only fail with a memory allocation error. */
216 PyConfig_Clear(&interp->config);
Victor Stinner022be022019-05-22 23:58:50 +0200217 PyMem_RawFree(interp);
218 return NULL;
219 }
220
Eric Snow6a150bc2019-06-01 15:39:46 -0600221 interp->ceval.pending.lock = PyThread_allocate_lock();
222 if (interp->ceval.pending.lock == NULL) {
223 PyErr_SetString(PyExc_RuntimeError,
224 "failed to create interpreter ceval pending mutex");
225 return NULL;
226 }
227
Victor Stinnerd4341102017-11-23 00:12:09 +0100228 interp->eval_frame = _PyEval_EvalFrameDefault;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000229#ifdef HAVE_DLOPEN
Serhiy Storchakac2f7d872016-05-04 09:44:44 +0300230#if HAVE_DECL_RTLD_NOW
Victor Stinnerd4341102017-11-23 00:12:09 +0100231 interp->dlopenflags = RTLD_NOW;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000232#else
Victor Stinnerd4341102017-11-23 00:12:09 +0100233 interp->dlopenflags = RTLD_LAZY;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000234#endif
235#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000236
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200237 struct pyinterpreters *interpreters = &runtime->interpreters;
238
239 HEAD_LOCK(runtime);
240 if (interpreters->next_id < 0) {
Victor Stinnerd4341102017-11-23 00:12:09 +0100241 /* overflow or Py_Initialize() not called! */
242 PyErr_SetString(PyExc_RuntimeError,
243 "failed to get an interpreter ID");
Pablo Galindo95d630e2018-08-31 22:49:29 +0100244 PyMem_RawFree(interp);
Victor Stinnerd4341102017-11-23 00:12:09 +0100245 interp = NULL;
Victor Stinnerd4341102017-11-23 00:12:09 +0100246 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200247 else {
248 interp->id = interpreters->next_id;
249 interpreters->next_id += 1;
250 interp->next = interpreters->head;
251 if (interpreters->main == NULL) {
252 interpreters->main = interp;
253 }
254 interpreters->head = interp;
255 }
256 HEAD_UNLOCK(runtime);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000257
Pablo Galindo95d630e2018-08-31 22:49:29 +0100258 if (interp == NULL) {
259 return NULL;
260 }
261
Yury Selivanovf23746a2018-01-22 19:11:18 -0500262 interp->tstate_next_unique_id = 0;
263
Steve Dowerb82e17e2019-05-23 08:45:22 -0700264 interp->audit_hooks = NULL;
265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 return interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000267}
268
269
Eric Snow396e0a82019-05-31 21:16:47 -0600270void
271PyInterpreterState_Clear(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000272{
Eric Snow396e0a82019-05-31 21:16:47 -0600273 _PyRuntimeState *runtime = interp->runtime;
274
Steve Dowerb82e17e2019-05-23 08:45:22 -0700275 if (PySys_Audit("cpython.PyInterpreterState_Clear", NULL) < 0) {
276 PyErr_Clear();
277 }
278
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200279 HEAD_LOCK(runtime);
280 for (PyThreadState *p = interp->tstate_head; p != NULL; p = p->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 PyThreadState_Clear(p);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200282 }
283 HEAD_UNLOCK(runtime);
Steve Dowerb82e17e2019-05-23 08:45:22 -0700284
285 Py_CLEAR(interp->audit_hooks);
286
Victor Stinner331a6a52019-05-27 16:39:22 +0200287 PyConfig_Clear(&interp->config);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000288 Py_CLEAR(interp->codec_search_path);
289 Py_CLEAR(interp->codec_search_cache);
290 Py_CLEAR(interp->codec_error_registry);
Eric Snow93c92f72017-09-13 23:46:04 -0700291 Py_CLEAR(interp->modules);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 Py_CLEAR(interp->modules_by_index);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000293 Py_CLEAR(interp->sysdict);
294 Py_CLEAR(interp->builtins);
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200295 Py_CLEAR(interp->builtins_copy);
Brett Cannonfd074152012-04-14 14:10:13 -0400296 Py_CLEAR(interp->importlib);
Serhiy Storchaka133138a2016-08-02 22:51:21 +0300297 Py_CLEAR(interp->import_func);
Eric Snowd2fdd1f2019-03-15 17:47:43 -0600298 Py_CLEAR(interp->dict);
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200299#ifdef HAVE_FORK
300 Py_CLEAR(interp->before_forkers);
301 Py_CLEAR(interp->after_forkers_parent);
302 Py_CLEAR(interp->after_forkers_child);
303#endif
Eric Snow86ea5812019-05-10 13:29:55 -0400304 if (runtime->finalizing == NULL) {
305 _PyWarnings_Fini(interp);
306 }
Eric Snow5be45a62019-03-08 22:47:07 -0700307 // XXX Once we have one allocator per interpreter (i.e.
308 // per-interpreter GC) we must ensure that all of the interpreter's
309 // objects have been cleaned up at the point.
Guido van Rossum25ce5661997-08-02 03:10:38 +0000310}
311
312
313static void
Eric Snow396e0a82019-05-31 21:16:47 -0600314zapthreads(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000315{
Eric Snow396e0a82019-05-31 21:16:47 -0600316 PyThreadState *ts;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000317 /* No need to lock the mutex here because this should only happen
318 when the threads are all really dead (XXX famous last words). */
Eric Snow396e0a82019-05-31 21:16:47 -0600319 while ((ts = interp->tstate_head) != NULL) {
320 PyThreadState_Delete(ts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000321 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000322}
323
324
Eric Snow396e0a82019-05-31 21:16:47 -0600325void
326PyInterpreterState_Delete(PyInterpreterState *interp)
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200327{
Eric Snow396e0a82019-05-31 21:16:47 -0600328 _PyRuntimeState *runtime = interp->runtime;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200329 struct pyinterpreters *interpreters = &runtime->interpreters;
Eric Snow396e0a82019-05-31 21:16:47 -0600330 zapthreads(interp);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200331 HEAD_LOCK(runtime);
332 PyInterpreterState **p;
333 for (p = &interpreters->head; ; p = &(*p)->next) {
334 if (*p == NULL) {
335 Py_FatalError("PyInterpreterState_Delete: invalid interp");
336 }
337 if (*p == interp) {
338 break;
339 }
340 }
341 if (interp->tstate_head != NULL) {
342 Py_FatalError("PyInterpreterState_Delete: remaining threads");
343 }
344 *p = interp->next;
345 if (interpreters->main == interp) {
346 interpreters->main = NULL;
347 if (interpreters->head != NULL) {
348 Py_FatalError("PyInterpreterState_Delete: remaining subinterpreters");
349 }
350 }
351 HEAD_UNLOCK(runtime);
352 if (interp->id_mutex != NULL) {
353 PyThread_free_lock(interp->id_mutex);
354 }
Eric Snow6a150bc2019-06-01 15:39:46 -0600355 if (interp->ceval.pending.lock != NULL) {
356 PyThread_free_lock(interp->ceval.pending.lock);
357 interp->ceval.pending.lock = NULL;
358 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200359 PyMem_RawFree(interp);
360}
361
362
Eric Snow59032962018-09-14 14:17:20 -0700363/*
364 * Delete all interpreter states except the main interpreter. If there
365 * is a current interpreter state, it *must* be the main interpreter.
366 */
367void
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200368_PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime)
Eric Snow59032962018-09-14 14:17:20 -0700369{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200370 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200371 struct pyinterpreters *interpreters = &runtime->interpreters;
372
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200373 PyThreadState *tstate = _PyThreadState_Swap(gilstate, NULL);
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200374 if (tstate != NULL && tstate->interp != interpreters->main) {
Eric Snow59032962018-09-14 14:17:20 -0700375 Py_FatalError("PyInterpreterState_DeleteExceptMain: not main interpreter");
376 }
377
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200378 HEAD_LOCK(runtime);
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200379 PyInterpreterState *interp = interpreters->head;
380 interpreters->head = NULL;
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100381 while (interp != NULL) {
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200382 if (interp == interpreters->main) {
383 interpreters->main->next = NULL;
384 interpreters->head = interp;
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100385 interp = interp->next;
Eric Snow59032962018-09-14 14:17:20 -0700386 continue;
387 }
388
Eric Snow396e0a82019-05-31 21:16:47 -0600389 PyInterpreterState_Clear(interp); // XXX must activate?
390 zapthreads(interp);
Eric Snow59032962018-09-14 14:17:20 -0700391 if (interp->id_mutex != NULL) {
392 PyThread_free_lock(interp->id_mutex);
393 }
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100394 PyInterpreterState *prev_interp = interp;
395 interp = interp->next;
396 PyMem_RawFree(prev_interp);
Eric Snow59032962018-09-14 14:17:20 -0700397 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200398 HEAD_UNLOCK(runtime);
Eric Snow59032962018-09-14 14:17:20 -0700399
Victor Stinnerb930a2d2019-04-24 17:14:33 +0200400 if (interpreters->head == NULL) {
Eric Snow59032962018-09-14 14:17:20 -0700401 Py_FatalError("PyInterpreterState_DeleteExceptMain: missing main");
402 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200403 _PyThreadState_Swap(gilstate, tstate);
Eric Snow59032962018-09-14 14:17:20 -0700404}
405
406
Victor Stinnercaba55b2018-08-03 15:33:52 +0200407PyInterpreterState *
408_PyInterpreterState_Get(void)
409{
Victor Stinner50b48572018-11-01 01:51:40 +0100410 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnercaba55b2018-08-03 15:33:52 +0200411 if (tstate == NULL) {
412 Py_FatalError("_PyInterpreterState_Get(): no current thread state");
413 }
414 PyInterpreterState *interp = tstate->interp;
415 if (interp == NULL) {
416 Py_FatalError("_PyInterpreterState_Get(): no current interpreter");
417 }
418 return interp;
419}
420
421
Eric Snowe3774162017-05-22 19:46:40 -0700422int64_t
423PyInterpreterState_GetID(PyInterpreterState *interp)
424{
425 if (interp == NULL) {
426 PyErr_SetString(PyExc_RuntimeError, "no interpreter provided");
427 return -1;
428 }
429 return interp->id;
430}
431
432
Eric Snow5be45a62019-03-08 22:47:07 -0700433static PyInterpreterState *
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200434interp_look_up_id(_PyRuntimeState *runtime, PY_INT64_T requested_id)
Eric Snowb05b7112019-03-01 12:35:10 -0700435{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200436 PyInterpreterState *interp = runtime->interpreters.head;
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100437 while (interp != NULL) {
438 PY_INT64_T id = PyInterpreterState_GetID(interp);
Eric Snow5be45a62019-03-08 22:47:07 -0700439 if (id < 0) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100440 return NULL;
Eric Snow5be45a62019-03-08 22:47:07 -0700441 }
442 if (requested_id == id) {
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100443 return interp;
Eric Snow5be45a62019-03-08 22:47:07 -0700444 }
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100445 interp = PyInterpreterState_Next(interp);
Eric Snowb05b7112019-03-01 12:35:10 -0700446 }
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100447 return NULL;
Eric Snowb05b7112019-03-01 12:35:10 -0700448}
449
Eric Snow5be45a62019-03-08 22:47:07 -0700450PyInterpreterState *
451_PyInterpreterState_LookUpID(PY_INT64_T requested_id)
452{
453 PyInterpreterState *interp = NULL;
454 if (requested_id >= 0) {
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200455 _PyRuntimeState *runtime = &_PyRuntime;
456 HEAD_LOCK(runtime);
457 interp = interp_look_up_id(runtime, requested_id);
458 HEAD_UNLOCK(runtime);
Eric Snow5be45a62019-03-08 22:47:07 -0700459 }
460 if (interp == NULL && !PyErr_Occurred()) {
461 PyErr_Format(PyExc_RuntimeError,
462 "unrecognized interpreter ID %lld", requested_id);
463 }
464 return interp;
465}
466
Eric Snow4c6955e2018-02-16 18:53:40 -0700467
468int
469_PyInterpreterState_IDInitref(PyInterpreterState *interp)
470{
471 if (interp->id_mutex != NULL) {
472 return 0;
473 }
474 interp->id_mutex = PyThread_allocate_lock();
475 if (interp->id_mutex == NULL) {
476 PyErr_SetString(PyExc_RuntimeError,
477 "failed to create init interpreter ID mutex");
478 return -1;
479 }
480 interp->id_refcount = 0;
481 return 0;
482}
483
484
485void
486_PyInterpreterState_IDIncref(PyInterpreterState *interp)
487{
488 if (interp->id_mutex == NULL) {
489 return;
490 }
491 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
492 interp->id_refcount += 1;
493 PyThread_release_lock(interp->id_mutex);
494}
495
496
497void
498_PyInterpreterState_IDDecref(PyInterpreterState *interp)
499{
500 if (interp->id_mutex == NULL) {
501 return;
502 }
Eric Snow396e0a82019-05-31 21:16:47 -0600503 _PyRuntimeState *runtime = interp->runtime;
504 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
Eric Snow4c6955e2018-02-16 18:53:40 -0700505 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
506 assert(interp->id_refcount != 0);
507 interp->id_refcount -= 1;
508 int64_t refcount = interp->id_refcount;
509 PyThread_release_lock(interp->id_mutex);
510
Eric Snowc11183c2019-03-15 16:35:46 -0600511 if (refcount == 0 && interp->requires_idref) {
Eric Snowf53d9f22018-02-20 16:30:17 -0700512 // XXX Using the "head" thread isn't strictly correct.
513 PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
514 // XXX Possible GILState issues?
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200515 PyThreadState *save_tstate = _PyThreadState_Swap(gilstate, tstate);
Eric Snow4c6955e2018-02-16 18:53:40 -0700516 Py_EndInterpreter(tstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200517 _PyThreadState_Swap(gilstate, save_tstate);
Eric Snow4c6955e2018-02-16 18:53:40 -0700518 }
519}
520
Eric Snowc11183c2019-03-15 16:35:46 -0600521int
522_PyInterpreterState_RequiresIDRef(PyInterpreterState *interp)
523{
524 return interp->requires_idref;
525}
526
527void
528_PyInterpreterState_RequireIDRef(PyInterpreterState *interp, int required)
529{
530 interp->requires_idref = required ? 1 : 0;
531}
532
Eric Snowc11183c2019-03-15 16:35:46 -0600533PyObject *
534_PyInterpreterState_GetMainModule(PyInterpreterState *interp)
535{
536 if (interp->modules == NULL) {
537 PyErr_SetString(PyExc_RuntimeError, "interpreter not initialized");
538 return NULL;
539 }
540 return PyMapping_GetItemString(interp->modules, "__main__");
541}
542
Eric Snowd2fdd1f2019-03-15 17:47:43 -0600543PyObject *
544PyInterpreterState_GetDict(PyInterpreterState *interp)
545{
546 if (interp->dict == NULL) {
547 interp->dict = PyDict_New();
548 if (interp->dict == NULL) {
549 PyErr_Clear();
550 }
551 }
552 /* Returning NULL means no per-interpreter dict is available. */
553 return interp->dict;
554}
555
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000556/* Default implementation for _PyThreadState_GetFrame */
557static struct _frame *
558threadstate_getframe(PyThreadState *self)
559{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 return self->frame;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000561}
562
Victor Stinner45b9be52010-03-03 23:28:07 +0000563static PyThreadState *
564new_threadstate(PyInterpreterState *interp, int init)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000565{
Eric Snow396e0a82019-05-31 21:16:47 -0600566 _PyRuntimeState *runtime = interp->runtime;
Victor Stinner1a7425f2013-07-07 16:25:15 +0200567 PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState));
Victor Stinner8bb32302019-04-24 16:47:40 +0200568 if (tstate == NULL) {
569 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000571
Victor Stinner8bb32302019-04-24 16:47:40 +0200572 if (_PyThreadState_GetFrame == NULL) {
573 _PyThreadState_GetFrame = threadstate_getframe;
574 }
575
576 tstate->interp = interp;
577
578 tstate->frame = NULL;
579 tstate->recursion_depth = 0;
580 tstate->overflowed = 0;
581 tstate->recursion_critical = 0;
582 tstate->stackcheck_counter = 0;
583 tstate->tracing = 0;
584 tstate->use_tracing = 0;
585 tstate->gilstate_counter = 0;
586 tstate->async_exc = NULL;
587 tstate->thread_id = PyThread_get_thread_ident();
588
589 tstate->dict = NULL;
590
591 tstate->curexc_type = NULL;
592 tstate->curexc_value = NULL;
593 tstate->curexc_traceback = NULL;
594
595 tstate->exc_state.exc_type = NULL;
596 tstate->exc_state.exc_value = NULL;
597 tstate->exc_state.exc_traceback = NULL;
598 tstate->exc_state.previous_item = NULL;
599 tstate->exc_info = &tstate->exc_state;
600
601 tstate->c_profilefunc = NULL;
602 tstate->c_tracefunc = NULL;
603 tstate->c_profileobj = NULL;
604 tstate->c_traceobj = NULL;
605
606 tstate->trash_delete_nesting = 0;
607 tstate->trash_delete_later = NULL;
608 tstate->on_delete = NULL;
609 tstate->on_delete_data = NULL;
610
611 tstate->coroutine_origin_tracking_depth = 0;
612
Victor Stinner8bb32302019-04-24 16:47:40 +0200613 tstate->async_gen_firstiter = NULL;
614 tstate->async_gen_finalizer = NULL;
615
616 tstate->context = NULL;
617 tstate->context_ver = 1;
618
619 tstate->id = ++interp->tstate_next_unique_id;
620
621 if (init) {
Eric Snow396e0a82019-05-31 21:16:47 -0600622 _PyThreadState_Init(tstate);
Victor Stinner8bb32302019-04-24 16:47:40 +0200623 }
624
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200625 HEAD_LOCK(runtime);
Victor Stinner8bb32302019-04-24 16:47:40 +0200626 tstate->prev = NULL;
627 tstate->next = interp->tstate_head;
628 if (tstate->next)
629 tstate->next->prev = tstate;
630 interp->tstate_head = tstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200631 HEAD_UNLOCK(runtime);
Victor Stinner8bb32302019-04-24 16:47:40 +0200632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000634}
635
Victor Stinner45b9be52010-03-03 23:28:07 +0000636PyThreadState *
637PyThreadState_New(PyInterpreterState *interp)
638{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 return new_threadstate(interp, 1);
Victor Stinner45b9be52010-03-03 23:28:07 +0000640}
641
642PyThreadState *
643_PyThreadState_Prealloc(PyInterpreterState *interp)
644{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 return new_threadstate(interp, 0);
Victor Stinner45b9be52010-03-03 23:28:07 +0000646}
647
648void
Eric Snow396e0a82019-05-31 21:16:47 -0600649_PyThreadState_Init(PyThreadState *tstate)
Victor Stinner45b9be52010-03-03 23:28:07 +0000650{
Eric Snow396e0a82019-05-31 21:16:47 -0600651 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner8bb32302019-04-24 16:47:40 +0200652 _PyGILState_NoteThreadState(&runtime->gilstate, tstate);
Victor Stinner45b9be52010-03-03 23:28:07 +0000653}
654
Martin v. Löwis1a214512008-06-11 05:26:20 +0000655PyObject*
Martin v. Löwis7800f752012-06-22 12:20:55 +0200656PyState_FindModule(struct PyModuleDef* module)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000657{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200658 Py_ssize_t index = module->m_base.m_index;
Victor Stinner9204fb82018-10-30 15:13:17 +0100659 PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 PyObject *res;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000661 if (module->m_slots) {
662 return NULL;
663 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 if (index == 0)
665 return NULL;
666 if (state->modules_by_index == NULL)
667 return NULL;
Antoine Pitrou75506e82012-08-20 19:30:46 +0200668 if (index >= PyList_GET_SIZE(state->modules_by_index))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 return NULL;
670 res = PyList_GET_ITEM(state->modules_by_index, index);
671 return res==Py_None ? NULL : res;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000672}
673
674int
675_PyState_AddModule(PyObject* module, struct PyModuleDef* def)
676{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000677 PyInterpreterState *state;
Berker Peksag4b7b5652016-08-22 18:05:56 +0300678 if (!def) {
679 assert(PyErr_Occurred());
680 return -1;
681 }
Nick Coghland5cacbb2015-05-23 22:24:10 +1000682 if (def->m_slots) {
683 PyErr_SetString(PyExc_SystemError,
684 "PyState_AddModule called on module with slots");
685 return -1;
686 }
Victor Stinner9204fb82018-10-30 15:13:17 +0100687 state = _PyInterpreterState_GET_UNSAFE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 if (!state->modules_by_index) {
689 state->modules_by_index = PyList_New(0);
690 if (!state->modules_by_index)
691 return -1;
692 }
693 while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
694 if (PyList_Append(state->modules_by_index, Py_None) < 0)
695 return -1;
696 Py_INCREF(module);
697 return PyList_SetItem(state->modules_by_index,
698 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000699}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000700
Martin v. Löwis7800f752012-06-22 12:20:55 +0200701int
702PyState_AddModule(PyObject* module, struct PyModuleDef* def)
703{
704 Py_ssize_t index;
Victor Stinner9204fb82018-10-30 15:13:17 +0100705 PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200706 if (!def) {
707 Py_FatalError("PyState_AddModule: Module Definition is NULL");
708 return -1;
709 }
710 index = def->m_base.m_index;
711 if (state->modules_by_index) {
712 if(PyList_GET_SIZE(state->modules_by_index) >= index) {
713 if(module == PyList_GET_ITEM(state->modules_by_index, index)) {
714 Py_FatalError("PyState_AddModule: Module already added!");
715 return -1;
716 }
717 }
718 }
719 return _PyState_AddModule(module, def);
720}
721
722int
723PyState_RemoveModule(struct PyModuleDef* def)
724{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000725 PyInterpreterState *state;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200726 Py_ssize_t index = def->m_base.m_index;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000727 if (def->m_slots) {
728 PyErr_SetString(PyExc_SystemError,
729 "PyState_RemoveModule called on module with slots");
730 return -1;
731 }
Victor Stinner9204fb82018-10-30 15:13:17 +0100732 state = _PyInterpreterState_GET_UNSAFE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200733 if (index == 0) {
734 Py_FatalError("PyState_RemoveModule: Module index invalid.");
735 return -1;
736 }
737 if (state->modules_by_index == NULL) {
738 Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible.");
739 return -1;
740 }
741 if (index > PyList_GET_SIZE(state->modules_by_index)) {
742 Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
743 return -1;
744 }
Zackery Spytz2a893432018-12-05 00:14:00 -0700745 Py_INCREF(Py_None);
Martin v. Löwis7800f752012-06-22 12:20:55 +0200746 return PyList_SetItem(state->modules_by_index, index, Py_None);
747}
748
Antoine Pitrou40322e62013-08-11 00:30:09 +0200749/* used by import.c:PyImport_Cleanup */
750void
751_PyState_ClearModules(void)
752{
Victor Stinner9204fb82018-10-30 15:13:17 +0100753 PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE();
Antoine Pitrou40322e62013-08-11 00:30:09 +0200754 if (state->modules_by_index) {
755 Py_ssize_t i;
756 for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) {
757 PyObject *m = PyList_GET_ITEM(state->modules_by_index, i);
758 if (PyModule_Check(m)) {
759 /* cleanup the saved copy of module dicts */
760 PyModuleDef *md = PyModule_GetDef(m);
761 if (md)
762 Py_CLEAR(md->m_base.m_copy);
763 }
764 }
765 /* Setting modules_by_index to NULL could be dangerous, so we
766 clear the list instead. */
767 if (PyList_SetSlice(state->modules_by_index,
768 0, PyList_GET_SIZE(state->modules_by_index),
769 NULL))
770 PyErr_WriteUnraisable(state->modules_by_index);
771 }
772}
773
Guido van Rossuma027efa1997-05-05 20:56:21 +0000774void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000775PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000776{
Victor Stinner331a6a52019-05-27 16:39:22 +0200777 int verbose = tstate->interp->config.verbose;
Victor Stinner53b7d4e2018-07-25 01:37:05 +0200778
779 if (verbose && tstate->frame != NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 fprintf(stderr,
781 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000783 Py_CLEAR(tstate->frame);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 Py_CLEAR(tstate->dict);
786 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 Py_CLEAR(tstate->curexc_type);
789 Py_CLEAR(tstate->curexc_value);
790 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000791
Mark Shannonae3087c2017-10-22 22:41:51 +0100792 Py_CLEAR(tstate->exc_state.exc_type);
793 Py_CLEAR(tstate->exc_state.exc_value);
794 Py_CLEAR(tstate->exc_state.exc_traceback);
Serhiy Storchakabdf42982017-10-26 16:59:40 +0300795
Mark Shannonae3087c2017-10-22 22:41:51 +0100796 /* The stack of exception states should contain just this thread. */
Victor Stinner53b7d4e2018-07-25 01:37:05 +0200797 if (verbose && tstate->exc_info != &tstate->exc_state) {
Mark Shannonae3087c2017-10-22 22:41:51 +0100798 fprintf(stderr,
799 "PyThreadState_Clear: warning: thread still has a generator\n");
800 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 tstate->c_profilefunc = NULL;
803 tstate->c_tracefunc = NULL;
804 Py_CLEAR(tstate->c_profileobj);
805 Py_CLEAR(tstate->c_traceobj);
Yury Selivanov75445082015-05-11 22:57:16 -0400806
Yury Selivanoveb636452016-09-08 22:01:51 -0700807 Py_CLEAR(tstate->async_gen_firstiter);
808 Py_CLEAR(tstate->async_gen_finalizer);
Yury Selivanovf23746a2018-01-22 19:11:18 -0500809
810 Py_CLEAR(tstate->context);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000811}
812
813
Guido van Rossum29757862001-01-23 01:46:06 +0000814/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
815static void
Eric Snow396e0a82019-05-31 21:16:47 -0600816tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000817{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200818 if (tstate == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 Py_FatalError("PyThreadState_Delete: NULL tstate");
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200820 }
821 PyInterpreterState *interp = tstate->interp;
822 if (interp == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 Py_FatalError("PyThreadState_Delete: NULL interp");
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200824 }
Eric Snow396e0a82019-05-31 21:16:47 -0600825 _PyRuntimeState *runtime = interp->runtime;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200826 HEAD_LOCK(runtime);
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200827 if (tstate->prev)
828 tstate->prev->next = tstate->next;
829 else
830 interp->tstate_head = tstate->next;
831 if (tstate->next)
832 tstate->next->prev = tstate->prev;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200833 HEAD_UNLOCK(runtime);
Antoine Pitrou7b476992013-09-07 23:38:37 +0200834 if (tstate->on_delete != NULL) {
835 tstate->on_delete(tstate->on_delete_data);
836 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200837 PyMem_RawFree(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000838}
839
840
Eric Snow396e0a82019-05-31 21:16:47 -0600841void
842PyThreadState_Delete(PyThreadState *tstate)
Guido van Rossum29757862001-01-23 01:46:06 +0000843{
Eric Snow396e0a82019-05-31 21:16:47 -0600844 _PyRuntimeState *runtime = tstate->interp->runtime;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200845 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
846 if (tstate == _PyRuntimeGILState_GetThreadState(gilstate)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 Py_FatalError("PyThreadState_Delete: tstate is still current");
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600848 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200849 if (gilstate->autoInterpreterState &&
850 PyThread_tss_get(&gilstate->autoTSSkey) == tstate)
851 {
852 PyThread_tss_set(&gilstate->autoTSSkey, NULL);
853 }
Eric Snow396e0a82019-05-31 21:16:47 -0600854 tstate_delete_common(tstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200855}
856
857
858static void
859_PyThreadState_DeleteCurrent(_PyRuntimeState *runtime)
860{
861 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
862 PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 if (tstate == NULL)
864 Py_FatalError(
865 "PyThreadState_DeleteCurrent: no current tstate");
Eric Snow396e0a82019-05-31 21:16:47 -0600866 tstate_delete_common(tstate);
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200867 if (gilstate->autoInterpreterState &&
868 PyThread_tss_get(&gilstate->autoTSSkey) == tstate)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600869 {
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200870 PyThread_tss_set(&gilstate->autoTSSkey, NULL);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600871 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200872 _PyRuntimeGILState_SetThreadState(gilstate, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 PyEval_ReleaseLock();
Guido van Rossum29757862001-01-23 01:46:06 +0000874}
Guido van Rossum29757862001-01-23 01:46:06 +0000875
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200876void
877PyThreadState_DeleteCurrent()
878{
879 _PyThreadState_DeleteCurrent(&_PyRuntime);
880}
881
Guido van Rossum29757862001-01-23 01:46:06 +0000882
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200883/*
884 * Delete all thread states except the one passed as argument.
885 * Note that, if there is a current thread state, it *must* be the one
886 * passed as argument. Also, this won't touch any other interpreters
887 * than the current one, since we don't know which thread state should
888 * be kept in those other interpreteres.
889 */
890void
Eric Snow396e0a82019-05-31 21:16:47 -0600891_PyThreadState_DeleteExcept(PyThreadState *tstate)
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200892{
893 PyInterpreterState *interp = tstate->interp;
Eric Snow396e0a82019-05-31 21:16:47 -0600894 _PyRuntimeState *runtime = interp->runtime;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200895 PyThreadState *p, *next, *garbage;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200896 HEAD_LOCK(runtime);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200897 /* Remove all thread states, except tstate, from the linked list of
898 thread states. This will allow calling PyThreadState_Clear()
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200899 without holding the lock. */
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200900 garbage = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200901 if (garbage == tstate)
902 garbage = tstate->next;
903 if (tstate->prev)
904 tstate->prev->next = tstate->next;
905 if (tstate->next)
906 tstate->next->prev = tstate->prev;
907 tstate->prev = tstate->next = NULL;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200908 interp->tstate_head = tstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200909 HEAD_UNLOCK(runtime);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200910 /* Clear and deallocate all stale thread states. Even if this
911 executes Python code, we should be safe since it executes
912 in the current thread, not one of the stale threads. */
913 for (p = garbage; p; p = next) {
914 next = p->next;
915 PyThreadState_Clear(p);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200916 PyMem_RawFree(p);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200917 }
918}
919
920
Guido van Rossuma027efa1997-05-05 20:56:21 +0000921PyThreadState *
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100922_PyThreadState_UncheckedGet(void)
923{
Victor Stinner50b48572018-11-01 01:51:40 +0100924 return _PyThreadState_GET();
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100925}
926
927
928PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000929PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000930{
Victor Stinner50b48572018-11-01 01:51:40 +0100931 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 if (tstate == NULL)
933 Py_FatalError("PyThreadState_Get: no current thread");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000936}
937
938
Victor Stinner09532fe2019-05-10 23:39:09 +0200939PyThreadState *
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200940_PyThreadState_Swap(struct _gilstate_runtime_state *gilstate, PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000941{
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200942 PyThreadState *oldts = _PyRuntimeGILState_GetThreadState(gilstate);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000943
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200944 _PyRuntimeGILState_SetThreadState(gilstate, newts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 /* It should not be possible for more than one thread state
946 to be used for a thread. Check this the best we can in debug
947 builds.
948 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200949#if defined(Py_DEBUG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 if (newts) {
951 /* This can be called from PyEval_RestoreThread(). Similar
952 to it, we need to ensure errno doesn't change.
953 */
954 int err = errno;
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200955 PyThreadState *check = _PyGILState_GetThisThreadState(gilstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 if (check && check->interp == newts->interp && check != newts)
957 Py_FatalError("Invalid thread state for this thread");
958 errno = err;
959 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000962}
Guido van Rossumede04391998-04-10 20:18:25 +0000963
Victor Stinner10c8e6a2019-04-26 01:53:18 +0200964PyThreadState *
965PyThreadState_Swap(PyThreadState *newts)
966{
967 return _PyThreadState_Swap(&_PyRuntime.gilstate, newts);
968}
969
Guido van Rossumede04391998-04-10 20:18:25 +0000970/* An extension mechanism to store arbitrary additional per-thread state.
971 PyThreadState_GetDict() returns a dictionary that can be used to hold such
972 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +0000973 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
974 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +0000975
976PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000977PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000978{
Victor Stinner50b48572018-11-01 01:51:40 +0100979 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 if (tstate == NULL)
981 return NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 if (tstate->dict == NULL) {
984 PyObject *d;
985 tstate->dict = d = PyDict_New();
986 if (d == NULL)
987 PyErr_Clear();
988 }
989 return tstate->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000990}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000991
992
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000993/* Asynchronously raise an exception in a thread.
994 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +0000995 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000996 to call this, or use ctypes. Must be called with the GIL held.
997 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
998 match any known thread id). Can be called with exc=NULL to clear an
999 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001000
1001int
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +02001002PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc)
1003{
Victor Stinner09532fe2019-05-10 23:39:09 +02001004 _PyRuntimeState *runtime = &_PyRuntime;
1005 PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 /* Although the GIL is held, a few C API functions can be called
1008 * without the GIL held, and in particular some that create and
1009 * destroy thread and interpreter states. Those can mutate the
1010 * list of thread states we're traversing, so to prevent that we lock
1011 * head_mutex for the duration.
1012 */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001013 HEAD_LOCK(runtime);
Victor Stinner09532fe2019-05-10 23:39:09 +02001014 for (PyThreadState *p = interp->tstate_head; p != NULL; p = p->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 if (p->thread_id == id) {
1016 /* Tricky: we need to decref the current value
1017 * (if any) in p->async_exc, but that can in turn
1018 * allow arbitrary Python code to run, including
1019 * perhaps calls to this function. To prevent
1020 * deadlock, we need to release head_mutex before
1021 * the decref.
1022 */
1023 PyObject *old_exc = p->async_exc;
1024 Py_XINCREF(exc);
1025 p->async_exc = exc;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001026 HEAD_UNLOCK(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 Py_XDECREF(old_exc);
Eric Snow6a150bc2019-06-01 15:39:46 -06001028 _PyEval_SignalAsyncExc(&runtime->ceval, &interp->ceval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 return 1;
1030 }
1031 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001032 HEAD_UNLOCK(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001033 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001034}
1035
1036
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001037/* Routines for advanced debuggers, requested by David Beazley.
1038 Don't use unless you know what you are doing! */
1039
1040PyInterpreterState *
1041PyInterpreterState_Head(void)
1042{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001043 return _PyRuntime.interpreters.head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001044}
1045
1046PyInterpreterState *
Eric Snow6b4be192017-05-22 21:36:03 -07001047PyInterpreterState_Main(void)
1048{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001049 return _PyRuntime.interpreters.main;
Eric Snow6b4be192017-05-22 21:36:03 -07001050}
1051
1052PyInterpreterState *
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001053PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001055}
1056
1057PyThreadState *
1058PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001060}
1061
1062PyThreadState *
1063PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +00001065}
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001066
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001067/* The implementation of sys._current_frames(). This is intended to be
1068 called with the GIL held, as it will be when called via
1069 sys._current_frames(). It's possible it would work fine even without
1070 the GIL held, but haven't thought enough about that.
1071*/
1072PyObject *
1073_PyThread_CurrentFrames(void)
1074{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 PyObject *result;
1076 PyInterpreterState *i;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001077
Steve Dowerb82e17e2019-05-23 08:45:22 -07001078 if (PySys_Audit("sys._current_frames", NULL) < 0) {
1079 return NULL;
1080 }
1081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 result = PyDict_New();
1083 if (result == NULL)
1084 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 /* for i in all interpreters:
1087 * for t in all of i's thread states:
1088 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +02001089 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 * need to grab head_mutex for the duration.
1091 */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001092 _PyRuntimeState *runtime = &_PyRuntime;
1093 HEAD_LOCK(runtime);
1094 for (i = runtime->interpreters.head; i != NULL; i = i->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 PyThreadState *t;
1096 for (t = i->tstate_head; t != NULL; t = t->next) {
1097 PyObject *id;
1098 int stat;
1099 struct _frame *frame = t->frame;
1100 if (frame == NULL)
1101 continue;
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +02001102 id = PyLong_FromUnsignedLong(t->thread_id);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 if (id == NULL)
1104 goto Fail;
1105 stat = PyDict_SetItem(result, id, (PyObject *)frame);
1106 Py_DECREF(id);
1107 if (stat < 0)
1108 goto Fail;
1109 }
1110 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001111 HEAD_UNLOCK(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001113
1114 Fail:
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001115 HEAD_UNLOCK(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 Py_DECREF(result);
1117 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001118}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +00001119
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001120/* Python "auto thread state" API. */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001121
1122/* Keep this as a static, as it is not reliable! It can only
1123 ever be compared to the state for the *current* thread.
1124 * If not equal, then it doesn't matter that the actual
1125 value may change immediately after comparison, as it can't
1126 possibly change to the current thread's state.
1127 * If equal, then the current thread holds the lock, so the value can't
1128 change until we yield the lock.
1129*/
1130static int
1131PyThreadState_IsCurrent(PyThreadState *tstate)
1132{
Eric Snow396e0a82019-05-31 21:16:47 -06001133 _PyRuntimeState *runtime = tstate->interp->runtime;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 /* Must be the tstate for this thread */
Eric Snow396e0a82019-05-31 21:16:47 -06001135 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001136 assert(_PyGILState_GetThisThreadState(gilstate) == tstate);
1137 return tstate == _PyRuntimeGILState_GetThreadState(gilstate);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001138}
1139
Tim Peters4c1f5ec2004-10-09 17:25:05 +00001140/* Internal initialization/finalization functions called by
Martin Panterb4ce1fc2015-11-30 03:18:29 +00001141 Py_Initialize/Py_FinalizeEx
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001142*/
Tim Peters19717fa2004-10-09 17:38:29 +00001143void
Eric Snow396e0a82019-05-31 21:16:47 -06001144_PyGILState_Init(PyThreadState *tstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001145{
Victor Stinner8bb32302019-04-24 16:47:40 +02001146 /* must init with valid states */
Victor Stinner8bb32302019-04-24 16:47:40 +02001147 assert(tstate != NULL);
Eric Snow396e0a82019-05-31 21:16:47 -06001148 PyInterpreterState *interp = tstate->interp;
1149 assert(interp != NULL);
1150 _PyRuntimeState *runtime = interp->runtime;
1151 assert(runtime != NULL);
Victor Stinner8bb32302019-04-24 16:47:40 +02001152
Victor Stinner8bb32302019-04-24 16:47:40 +02001153 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
1154
1155 if (PyThread_tss_create(&gilstate->autoTSSkey) != 0) {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001156 Py_FatalError("Could not allocate TSS entry");
1157 }
Victor Stinner8bb32302019-04-24 16:47:40 +02001158 gilstate->autoInterpreterState = interp;
1159 assert(PyThread_tss_get(&gilstate->autoTSSkey) == NULL);
1160 assert(tstate->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +00001161
Victor Stinner8bb32302019-04-24 16:47:40 +02001162 _PyGILState_NoteThreadState(gilstate, tstate);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001163}
1164
Victor Stinner861d9ab2016-03-16 22:45:24 +01001165PyInterpreterState *
1166_PyGILState_GetInterpreterStateUnsafe(void)
1167{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001168 return _PyRuntime.gilstate.autoInterpreterState;
Victor Stinner861d9ab2016-03-16 22:45:24 +01001169}
1170
Tim Peters19717fa2004-10-09 17:38:29 +00001171void
Victor Stinner8e91c242019-04-24 17:24:01 +02001172_PyGILState_Fini(_PyRuntimeState *runtime)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001173{
Victor Stinner8e91c242019-04-24 17:24:01 +02001174 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
1175 PyThread_tss_delete(&gilstate->autoTSSkey);
1176 gilstate->autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001177}
1178
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001179/* Reset the TSS key - called by PyOS_AfterFork_Child().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001180 * This should not be necessary, but some - buggy - pthread implementations
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001181 * don't reset TSS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001182 */
1183void
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001184_PyGILState_Reinit(_PyRuntimeState *runtime)
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001185{
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001186 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001187 PyThreadState *tstate = _PyGILState_GetThisThreadState(gilstate);
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001188
1189 PyThread_tss_delete(&gilstate->autoTSSkey);
1190 if (PyThread_tss_create(&gilstate->autoTSSkey) != 0) {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001191 Py_FatalError("Could not allocate TSS entry");
1192 }
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001193
Charles-François Natalia233df82011-11-22 19:49:51 +01001194 /* If the thread had an associated auto thread state, reassociate it with
1195 * the new key. */
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001196 if (tstate &&
Victor Stinnerb930a2d2019-04-24 17:14:33 +02001197 PyThread_tss_set(&gilstate->autoTSSkey, (void *)tstate) != 0)
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001198 {
1199 Py_FatalError("Couldn't create autoTSSkey mapping");
1200 }
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001201}
1202
Michael W. Hudson188d4362005-06-20 16:52:57 +00001203/* When a thread state is created for a thread by some mechanism other than
1204 PyGILState_Ensure, it's important that the GILState machinery knows about
1205 it so it doesn't try to create another thread state for the thread (this is
1206 a better fix for SF bug #1010677 than the first one attempted).
1207*/
Thomas Wouters89f507f2006-12-13 04:49:30 +00001208static void
Victor Stinner8bb32302019-04-24 16:47:40 +02001209_PyGILState_NoteThreadState(struct _gilstate_runtime_state *gilstate, PyThreadState* tstate)
Michael W. Hudson188d4362005-06-20 16:52:57 +00001210{
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001211 /* If autoTSSkey isn't initialized, this must be the very first
Antoine Pitrou079ce542010-09-08 12:37:10 +00001212 threadstate created in Py_Initialize(). Don't do anything for now
1213 (we'll be back here when _PyGILState_Init is called). */
Victor Stinner8bb32302019-04-24 16:47:40 +02001214 if (!gilstate->autoInterpreterState) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 return;
Victor Stinner8bb32302019-04-24 16:47:40 +02001216 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001217
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001218 /* Stick the thread state for this thread in thread specific storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +00001219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 The only situation where you can legitimately have more than one
1221 thread state for an OS level thread is when there are multiple
Victor Stinner590cebe2013-12-13 11:08:56 +01001222 interpreters.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001223
Victor Stinner590cebe2013-12-13 11:08:56 +01001224 You shouldn't really be using the PyGILState_ APIs anyway (see issues
1225 #10915 and #15751).
Michael W. Hudson188d4362005-06-20 16:52:57 +00001226
Victor Stinner590cebe2013-12-13 11:08:56 +01001227 The first thread state created for that given OS level thread will
1228 "win", which seems reasonable behaviour.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 */
Victor Stinner8bb32302019-04-24 16:47:40 +02001230 if (PyThread_tss_get(&gilstate->autoTSSkey) == NULL) {
1231 if ((PyThread_tss_set(&gilstate->autoTSSkey, (void *)tstate)) != 0) {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001232 Py_FatalError("Couldn't create autoTSSkey mapping");
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001233 }
Victor Stinner590cebe2013-12-13 11:08:56 +01001234 }
Michael W. Hudson188d4362005-06-20 16:52:57 +00001235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 /* PyGILState_Release must not try to delete this thread state. */
1237 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +00001238}
1239
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001240/* The public functions */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001241static PyThreadState *
1242_PyGILState_GetThisThreadState(struct _gilstate_runtime_state *gilstate)
1243{
1244 if (gilstate->autoInterpreterState == NULL)
1245 return NULL;
1246 return (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey);
1247}
1248
Tim Peters19717fa2004-10-09 17:38:29 +00001249PyThreadState *
1250PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001251{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001252 return _PyGILState_GetThisThreadState(&_PyRuntime.gilstate);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001253}
1254
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -07001255int
1256PyGILState_Check(void)
1257{
Victor Stinner8a1be612016-03-14 22:07:55 +01001258
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001259 if (!_PyGILState_check_enabled) {
Victor Stinner8a1be612016-03-14 22:07:55 +01001260 return 1;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001261 }
Victor Stinner8a1be612016-03-14 22:07:55 +01001262
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001263 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
1264 if (!PyThread_tss_is_created(&gilstate->autoTSSkey)) {
1265 return 1;
1266 }
Victor Stinner8a1be612016-03-14 22:07:55 +01001267
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001268 PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate);
1269 if (tstate == NULL) {
1270 return 0;
1271 }
1272
1273 return (tstate == _PyGILState_GetThisThreadState(gilstate));
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -07001274}
1275
Tim Peters19717fa2004-10-09 17:38:29 +00001276PyGILState_STATE
1277PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001278{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001279 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 int current;
1281 PyThreadState *tcur;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001282 int need_init_threads = 0;
1283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 /* Note that we do not auto-init Python here - apart from
1285 potential races with 2 threads auto-initializing, pep-311
1286 spells out other issues. Embedders are expected to have
1287 called Py_Initialize() and usually PyEval_InitThreads().
1288 */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001289 /* Py_Initialize() hasn't been called! */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001290 assert(gilstate->autoInterpreterState);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001291
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001292 tcur = (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 if (tcur == NULL) {
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001294 need_init_threads = 1;
Victor Stinner62ca1002013-12-13 01:46:43 +01001295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 /* Create a new thread state for this thread */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001297 tcur = PyThreadState_New(gilstate->autoInterpreterState);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 if (tcur == NULL)
1299 Py_FatalError("Couldn't create thread-state for new thread");
1300 /* This is our thread state! We'll need to delete it in the
1301 matching call to PyGILState_Release(). */
1302 tcur->gilstate_counter = 0;
1303 current = 0; /* new thread state is never current */
1304 }
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001305 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 current = PyThreadState_IsCurrent(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001307 }
1308
1309 if (current == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 PyEval_RestoreThread(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001311 }
1312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 /* Update our counter in the thread-state - no need for locks:
1314 - tcur will remain valid as we hold the GIL.
1315 - the counter is safe as we are the only thread "allowed"
1316 to modify this value
1317 */
1318 ++tcur->gilstate_counter;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001319
1320 if (need_init_threads) {
1321 /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is
1322 called from a new thread for the first time, we need the create the
1323 GIL. */
1324 PyEval_InitThreads();
1325 }
1326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001328}
1329
Tim Peters19717fa2004-10-09 17:38:29 +00001330void
1331PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001332{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001333 _PyRuntimeState *runtime = &_PyRuntime;
1334 PyThreadState *tcur = PyThread_tss_get(&runtime->gilstate.autoTSSkey);
1335 if (tcur == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 Py_FatalError("auto-releasing thread-state, "
1337 "but no thread-state for this thread");
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001338 }
1339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 /* We must hold the GIL and have our thread state current */
1341 /* XXX - remove the check - the assert should be fine,
1342 but while this is very new (April 2003), the extra check
1343 by release-only users can't hurt.
1344 */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001345 if (!PyThreadState_IsCurrent(tcur)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 Py_FatalError("This thread state must be current when releasing");
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001347 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 assert(PyThreadState_IsCurrent(tcur));
1349 --tcur->gilstate_counter;
1350 assert(tcur->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001352 /* If we're going to destroy this thread-state, we must
1353 * clear it while the GIL is held, as destructors may run.
1354 */
1355 if (tcur->gilstate_counter == 0) {
1356 /* can't have been locked when we created it */
1357 assert(oldstate == PyGILState_UNLOCKED);
1358 PyThreadState_Clear(tcur);
1359 /* Delete the thread-state. Note this releases the GIL too!
1360 * It's vital that the GIL be held here, to avoid shutdown
1361 * races; see bugs 225673 and 1061968 (that nasty bug has a
1362 * habit of coming back).
1363 */
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001364 _PyThreadState_DeleteCurrent(runtime);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 }
1366 /* Release the lock if necessary */
1367 else if (oldstate == PyGILState_UNLOCKED)
1368 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001369}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001370
Benjamin Peterson3bf01752012-04-13 18:06:36 -04001371
Eric Snow7f8bfc92018-01-29 18:23:44 -07001372/**************************/
1373/* cross-interpreter data */
1374/**************************/
1375
1376/* cross-interpreter data */
1377
1378crossinterpdatafunc _PyCrossInterpreterData_Lookup(PyObject *);
1379
1380/* This is a separate func from _PyCrossInterpreterData_Lookup in order
1381 to keep the registry code separate. */
1382static crossinterpdatafunc
1383_lookup_getdata(PyObject *obj)
1384{
1385 crossinterpdatafunc getdata = _PyCrossInterpreterData_Lookup(obj);
1386 if (getdata == NULL && PyErr_Occurred() == 0)
1387 PyErr_Format(PyExc_ValueError,
1388 "%S does not support cross-interpreter data", obj);
1389 return getdata;
1390}
1391
1392int
1393_PyObject_CheckCrossInterpreterData(PyObject *obj)
1394{
1395 crossinterpdatafunc getdata = _lookup_getdata(obj);
1396 if (getdata == NULL) {
1397 return -1;
1398 }
1399 return 0;
1400}
1401
1402static int
1403_check_xidata(_PyCrossInterpreterData *data)
1404{
1405 // data->data can be anything, including NULL, so we don't check it.
1406
1407 // data->obj may be NULL, so we don't check it.
1408
1409 if (data->interp < 0) {
1410 PyErr_SetString(PyExc_SystemError, "missing interp");
1411 return -1;
1412 }
1413
1414 if (data->new_object == NULL) {
1415 PyErr_SetString(PyExc_SystemError, "missing new_object func");
1416 return -1;
1417 }
1418
1419 // data->free may be NULL, so we don't check it.
1420
1421 return 0;
1422}
1423
1424int
1425_PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data)
1426{
Victor Stinnercaba55b2018-08-03 15:33:52 +02001427 // _PyInterpreterState_Get() aborts if lookup fails, so we don't need
Eric Snow7f8bfc92018-01-29 18:23:44 -07001428 // to check the result for NULL.
Victor Stinnercaba55b2018-08-03 15:33:52 +02001429 PyInterpreterState *interp = _PyInterpreterState_Get();
Eric Snow7f8bfc92018-01-29 18:23:44 -07001430
1431 // Reset data before re-populating.
1432 *data = (_PyCrossInterpreterData){0};
1433 data->free = PyMem_RawFree; // Set a default that may be overridden.
1434
1435 // Call the "getdata" func for the object.
1436 Py_INCREF(obj);
1437 crossinterpdatafunc getdata = _lookup_getdata(obj);
1438 if (getdata == NULL) {
1439 Py_DECREF(obj);
1440 return -1;
1441 }
1442 int res = getdata(obj, data);
1443 Py_DECREF(obj);
1444 if (res != 0) {
1445 return -1;
1446 }
1447
1448 // Fill in the blanks and validate the result.
Eric Snow7f8bfc92018-01-29 18:23:44 -07001449 data->interp = interp->id;
1450 if (_check_xidata(data) != 0) {
1451 _PyCrossInterpreterData_Release(data);
1452 return -1;
1453 }
1454
1455 return 0;
1456}
1457
Eric Snow6a150bc2019-06-01 15:39:46 -06001458static int
Eric Snow63799132018-06-01 18:45:20 -06001459_release_xidata(void *arg)
1460{
1461 _PyCrossInterpreterData *data = (_PyCrossInterpreterData *)arg;
1462 if (data->free != NULL) {
1463 data->free(data->data);
1464 }
1465 Py_XDECREF(data->obj);
Eric Snow6a150bc2019-06-01 15:39:46 -06001466 PyMem_Free(data);
1467 return 0;
Eric Snow63799132018-06-01 18:45:20 -06001468}
1469
Eric Snow7f8bfc92018-01-29 18:23:44 -07001470void
1471_PyCrossInterpreterData_Release(_PyCrossInterpreterData *data)
1472{
Eric Snow6a150bc2019-06-01 15:39:46 -06001473 _PyRuntimeState *runtime = &_PyRuntime;
1474
Eric Snow7f8bfc92018-01-29 18:23:44 -07001475 if (data->data == NULL && data->obj == NULL) {
1476 // Nothing to release!
1477 return;
1478 }
1479
Eric Snow6a150bc2019-06-01 15:39:46 -06001480 // Get the original interpreter.
Eric Snow7f8bfc92018-01-29 18:23:44 -07001481 PyInterpreterState *interp = _PyInterpreterState_LookUpID(data->interp);
1482 if (interp == NULL) {
1483 // The intepreter was already destroyed.
1484 if (data->free != NULL) {
1485 // XXX Someone leaked some memory...
1486 }
1487 return;
1488 }
Eric Snow6a150bc2019-06-01 15:39:46 -06001489 // XXX There's an ever-so-slight race here...
1490 if (interp->finalizing) {
1491 // XXX Someone leaked some memory...
1492 return;
1493 }
Eric Snowf53d9f22018-02-20 16:30:17 -07001494
Eric Snow7f8bfc92018-01-29 18:23:44 -07001495 // "Release" the data and/or the object.
Eric Snow6a150bc2019-06-01 15:39:46 -06001496 _PyCrossInterpreterData *copied = PyMem_Malloc(sizeof(_PyCrossInterpreterData));
1497 if (copied == NULL) {
1498 PyErr_SetString(PyExc_MemoryError,
1499 "Not enough memory to preserve cross-interpreter data");
1500 PyErr_Print();
1501 return;
1502 }
1503 memcpy(copied, data, sizeof(_PyCrossInterpreterData));
1504 PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
1505 int res = _PyEval_AddPendingCall(tstate,
1506 &runtime->ceval, &interp->ceval,
1507 0, _release_xidata, copied);
1508 if (res != 0) {
1509 // XXX Queue full or couldn't get lock. Try again somehow?
1510 }
Eric Snow7f8bfc92018-01-29 18:23:44 -07001511}
1512
1513PyObject *
1514_PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *data)
1515{
1516 return data->new_object(data);
1517}
1518
1519/* registry of {type -> crossinterpdatafunc} */
1520
1521/* For now we use a global registry of shareable classes. An
1522 alternative would be to add a tp_* slot for a class's
1523 crossinterpdatafunc. It would be simpler and more efficient. */
1524
1525static int
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001526_register_xidata(struct _xidregistry *xidregistry, PyTypeObject *cls,
1527 crossinterpdatafunc getdata)
Eric Snow7f8bfc92018-01-29 18:23:44 -07001528{
1529 // Note that we effectively replace already registered classes
1530 // rather than failing.
1531 struct _xidregitem *newhead = PyMem_RawMalloc(sizeof(struct _xidregitem));
1532 if (newhead == NULL)
1533 return -1;
1534 newhead->cls = cls;
1535 newhead->getdata = getdata;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001536 newhead->next = xidregistry->head;
1537 xidregistry->head = newhead;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001538 return 0;
1539}
1540
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001541static void _register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001542
1543int
Eric Snowc11183c2019-03-15 16:35:46 -06001544_PyCrossInterpreterData_RegisterClass(PyTypeObject *cls,
Eric Snow7f8bfc92018-01-29 18:23:44 -07001545 crossinterpdatafunc getdata)
1546{
1547 if (!PyType_Check(cls)) {
1548 PyErr_Format(PyExc_ValueError, "only classes may be registered");
1549 return -1;
1550 }
1551 if (getdata == NULL) {
1552 PyErr_Format(PyExc_ValueError, "missing 'getdata' func");
1553 return -1;
1554 }
1555
1556 // Make sure the class isn't ever deallocated.
1557 Py_INCREF((PyObject *)cls);
1558
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001559 struct _xidregistry *xidregistry = &_PyRuntime.xidregistry ;
1560 PyThread_acquire_lock(xidregistry->mutex, WAIT_LOCK);
1561 if (xidregistry->head == NULL) {
1562 _register_builtins_for_crossinterpreter_data(xidregistry);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001563 }
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001564 int res = _register_xidata(xidregistry, cls, getdata);
1565 PyThread_release_lock(xidregistry->mutex);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001566 return res;
1567}
1568
Eric Snow6d2cd902018-05-16 15:04:57 -04001569/* Cross-interpreter objects are looked up by exact match on the class.
1570 We can reassess this policy when we move from a global registry to a
1571 tp_* slot. */
1572
Eric Snow7f8bfc92018-01-29 18:23:44 -07001573crossinterpdatafunc
1574_PyCrossInterpreterData_Lookup(PyObject *obj)
1575{
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001576 struct _xidregistry *xidregistry = &_PyRuntime.xidregistry ;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001577 PyObject *cls = PyObject_Type(obj);
1578 crossinterpdatafunc getdata = NULL;
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001579 PyThread_acquire_lock(xidregistry->mutex, WAIT_LOCK);
1580 struct _xidregitem *cur = xidregistry->head;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001581 if (cur == NULL) {
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001582 _register_builtins_for_crossinterpreter_data(xidregistry);
1583 cur = xidregistry->head;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001584 }
1585 for(; cur != NULL; cur = cur->next) {
1586 if (cur->cls == (PyTypeObject *)cls) {
1587 getdata = cur->getdata;
1588 break;
1589 }
1590 }
Eric Snow4e9da0d2018-02-02 21:49:49 -07001591 Py_DECREF(cls);
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001592 PyThread_release_lock(xidregistry->mutex);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001593 return getdata;
1594}
1595
1596/* cross-interpreter data for builtin types */
1597
Eric Snow6d2cd902018-05-16 15:04:57 -04001598struct _shared_bytes_data {
1599 char *bytes;
1600 Py_ssize_t len;
1601};
1602
Eric Snow7f8bfc92018-01-29 18:23:44 -07001603static PyObject *
1604_new_bytes_object(_PyCrossInterpreterData *data)
1605{
Eric Snow6d2cd902018-05-16 15:04:57 -04001606 struct _shared_bytes_data *shared = (struct _shared_bytes_data *)(data->data);
1607 return PyBytes_FromStringAndSize(shared->bytes, shared->len);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001608}
1609
1610static int
1611_bytes_shared(PyObject *obj, _PyCrossInterpreterData *data)
1612{
Eric Snow6d2cd902018-05-16 15:04:57 -04001613 struct _shared_bytes_data *shared = PyMem_NEW(struct _shared_bytes_data, 1);
1614 if (PyBytes_AsStringAndSize(obj, &shared->bytes, &shared->len) < 0) {
1615 return -1;
1616 }
1617 data->data = (void *)shared;
Eric Snow63799132018-06-01 18:45:20 -06001618 Py_INCREF(obj);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001619 data->obj = obj; // Will be "released" (decref'ed) when data released.
1620 data->new_object = _new_bytes_object;
Eric Snow6d2cd902018-05-16 15:04:57 -04001621 data->free = PyMem_Free;
1622 return 0;
1623}
1624
1625struct _shared_str_data {
1626 int kind;
1627 const void *buffer;
1628 Py_ssize_t len;
1629};
1630
1631static PyObject *
1632_new_str_object(_PyCrossInterpreterData *data)
1633{
1634 struct _shared_str_data *shared = (struct _shared_str_data *)(data->data);
1635 return PyUnicode_FromKindAndData(shared->kind, shared->buffer, shared->len);
1636}
1637
1638static int
1639_str_shared(PyObject *obj, _PyCrossInterpreterData *data)
1640{
1641 struct _shared_str_data *shared = PyMem_NEW(struct _shared_str_data, 1);
1642 shared->kind = PyUnicode_KIND(obj);
1643 shared->buffer = PyUnicode_DATA(obj);
1644 shared->len = PyUnicode_GET_LENGTH(obj) - 1;
1645 data->data = (void *)shared;
Eric Snow63799132018-06-01 18:45:20 -06001646 Py_INCREF(obj);
Eric Snow6d2cd902018-05-16 15:04:57 -04001647 data->obj = obj; // Will be "released" (decref'ed) when data released.
1648 data->new_object = _new_str_object;
1649 data->free = PyMem_Free;
1650 return 0;
1651}
1652
1653static PyObject *
1654_new_long_object(_PyCrossInterpreterData *data)
1655{
Alexey Izbyshev16f842d2019-02-12 19:06:43 +03001656 return PyLong_FromSsize_t((Py_ssize_t)(data->data));
Eric Snow6d2cd902018-05-16 15:04:57 -04001657}
1658
1659static int
1660_long_shared(PyObject *obj, _PyCrossInterpreterData *data)
1661{
Alexey Izbyshev16f842d2019-02-12 19:06:43 +03001662 /* Note that this means the size of shareable ints is bounded by
1663 * sys.maxsize. Hence on 32-bit architectures that is half the
1664 * size of maximum shareable ints on 64-bit.
1665 */
1666 Py_ssize_t value = PyLong_AsSsize_t(obj);
Eric Snow6d2cd902018-05-16 15:04:57 -04001667 if (value == -1 && PyErr_Occurred()) {
1668 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1669 PyErr_SetString(PyExc_OverflowError, "try sending as bytes");
1670 }
1671 return -1;
1672 }
1673 data->data = (void *)value;
1674 data->obj = NULL;
1675 data->new_object = _new_long_object;
1676 data->free = NULL;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001677 return 0;
1678}
1679
1680static PyObject *
1681_new_none_object(_PyCrossInterpreterData *data)
1682{
1683 // XXX Singleton refcounts are problematic across interpreters...
1684 Py_INCREF(Py_None);
1685 return Py_None;
1686}
1687
1688static int
1689_none_shared(PyObject *obj, _PyCrossInterpreterData *data)
1690{
1691 data->data = NULL;
1692 // data->obj remains NULL
1693 data->new_object = _new_none_object;
1694 data->free = NULL; // There is nothing to free.
1695 return 0;
1696}
1697
1698static void
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001699_register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry)
Eric Snow7f8bfc92018-01-29 18:23:44 -07001700{
1701 // None
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001702 if (_register_xidata(xidregistry, (PyTypeObject *)PyObject_Type(Py_None), _none_shared) != 0) {
Eric Snow7f8bfc92018-01-29 18:23:44 -07001703 Py_FatalError("could not register None for cross-interpreter sharing");
1704 }
1705
Eric Snow6d2cd902018-05-16 15:04:57 -04001706 // int
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001707 if (_register_xidata(xidregistry, &PyLong_Type, _long_shared) != 0) {
Eric Snow6d2cd902018-05-16 15:04:57 -04001708 Py_FatalError("could not register int for cross-interpreter sharing");
1709 }
1710
Eric Snow7f8bfc92018-01-29 18:23:44 -07001711 // bytes
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001712 if (_register_xidata(xidregistry, &PyBytes_Type, _bytes_shared) != 0) {
Eric Snow7f8bfc92018-01-29 18:23:44 -07001713 Py_FatalError("could not register bytes for cross-interpreter sharing");
1714 }
Eric Snow6d2cd902018-05-16 15:04:57 -04001715
1716 // str
Victor Stinner10c8e6a2019-04-26 01:53:18 +02001717 if (_register_xidata(xidregistry, &PyUnicode_Type, _str_shared) != 0) {
Eric Snow6d2cd902018-05-16 15:04:57 -04001718 Py_FatalError("could not register str for cross-interpreter sharing");
1719 }
Eric Snow7f8bfc92018-01-29 18:23:44 -07001720}
1721
1722
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001723#ifdef __cplusplus
1724}
1725#endif