blob: 49497b7c37676803904ab70ca0187c859413ddac [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 Stinnerf684d832019-03-01 03:44:13 +01005#include "pycore_coreconfig.h"
Victor Stinner621cebe2018-11-12 16:53:38 +01006#include "pycore_pymem.h"
7#include "pycore_pystate.h"
Guido van Rossuma027efa1997-05-05 20:56:21 +00008
Victor Stinner9204fb82018-10-30 15:13:17 +01009#define _PyThreadState_SET(value) \
10 _Py_atomic_store_relaxed(&_PyRuntime.gilstate.tstate_current, \
11 (uintptr_t)(value))
Victor Stinnerb02ef712016-01-22 14:09:55 +010012
Victor Stinnerbfd316e2016-01-20 11:12:38 +010013
Tim Peters84705582004-10-10 02:47:33 +000014/* --------------------------------------------------------------------------
15CAUTION
16
Victor Stinner1a7425f2013-07-07 16:25:15 +020017Always use PyMem_RawMalloc() and PyMem_RawFree() directly in this file. A
18number of these functions are advertised as safe to call when the GIL isn't
19held, and in a debug build Python redirects (e.g.) PyMem_NEW (etc) to Python's
20debugging obmalloc functions. Those aren't thread-safe (they rely on the GIL
21to avoid the expense of doing their own locking).
Tim Peters84705582004-10-10 02:47:33 +000022-------------------------------------------------------------------------- */
23
Martin v. Löwisf0473d52001-07-18 16:17:16 +000024#ifdef HAVE_DLOPEN
25#ifdef HAVE_DLFCN_H
26#include <dlfcn.h>
27#endif
Serhiy Storchakac2f7d872016-05-04 09:44:44 +030028#if !HAVE_DECL_RTLD_LAZY
Martin v. Löwisf0473d52001-07-18 16:17:16 +000029#define RTLD_LAZY 1
30#endif
31#endif
32
Benjamin Peterson43162b82012-04-13 11:58:27 -040033#ifdef __cplusplus
34extern "C" {
35#endif
Martin v. Löwisf0473d52001-07-18 16:17:16 +000036
Victor Stinner5d39e042017-11-29 17:20:38 +010037static _PyInitError
38_PyRuntimeState_Init_impl(_PyRuntimeState *runtime)
Eric Snow2ebc5ce2017-09-07 23:51:28 -060039{
40 memset(runtime, 0, sizeof(*runtime));
Victor Stinner8a1be612016-03-14 22:07:55 +010041
Eric Snow2ebc5ce2017-09-07 23:51:28 -060042 _PyGC_Initialize(&runtime->gc);
43 _PyEval_Initialize(&runtime->ceval);
Michael W. Hudson188d4362005-06-20 16:52:57 +000044
Eric Snow2ebc5ce2017-09-07 23:51:28 -060045 runtime->gilstate.check_enabled = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -080046
Masayuki Yamamoto731e1892017-10-06 19:41:34 +090047 /* A TSS key must be initialized with Py_tss_NEEDS_INIT
48 in accordance with the specification. */
Victor Stinnerf7e5b562017-11-15 15:48:08 -080049 Py_tss_t initial = Py_tss_NEEDS_INIT;
50 runtime->gilstate.autoTSSkey = initial;
Guido van Rossum1d5ad901999-06-18 14:22:24 +000051
Eric Snow2ebc5ce2017-09-07 23:51:28 -060052 runtime->interpreters.mutex = PyThread_allocate_lock();
Victor Stinnerf7e5b562017-11-15 15:48:08 -080053 if (runtime->interpreters.mutex == NULL) {
54 return _Py_INIT_ERR("Can't initialize threads for interpreter");
55 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -060056 runtime->interpreters.next_id = -1;
Eric Snow7f8bfc92018-01-29 18:23:44 -070057
58 runtime->xidregistry.mutex = PyThread_allocate_lock();
59 if (runtime->xidregistry.mutex == NULL) {
60 return _Py_INIT_ERR("Can't initialize threads for cross-interpreter data registry");
61 }
62
Victor Stinnerf7e5b562017-11-15 15:48:08 -080063 return _Py_INIT_OK();
Eric Snow2ebc5ce2017-09-07 23:51:28 -060064}
Eric Snow05351c12017-09-05 21:43:08 -070065
Victor Stinner5d39e042017-11-29 17:20:38 +010066_PyInitError
67_PyRuntimeState_Init(_PyRuntimeState *runtime)
68{
69 /* Force default allocator, since _PyRuntimeState_Fini() must
70 use the same allocator than this function. */
71 PyMemAllocatorEx old_alloc;
72 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
73
74 _PyInitError err = _PyRuntimeState_Init_impl(runtime);
75
76 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
77 return err;
78}
79
Eric Snow2ebc5ce2017-09-07 23:51:28 -060080void
81_PyRuntimeState_Fini(_PyRuntimeState *runtime)
82{
Victor Stinner5d39e042017-11-29 17:20:38 +010083 /* Force the allocator used by _PyRuntimeState_Init(). */
84 PyMemAllocatorEx old_alloc;
85 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinnerccb04422017-11-16 03:20:31 -080086
Eric Snow2ebc5ce2017-09-07 23:51:28 -060087 if (runtime->interpreters.mutex != NULL) {
88 PyThread_free_lock(runtime->interpreters.mutex);
89 runtime->interpreters.mutex = NULL;
90 }
Victor Stinnerccb04422017-11-16 03:20:31 -080091
92 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Eric Snow2ebc5ce2017-09-07 23:51:28 -060093}
94
95#define HEAD_LOCK() PyThread_acquire_lock(_PyRuntime.interpreters.mutex, \
96 WAIT_LOCK)
97#define HEAD_UNLOCK() PyThread_release_lock(_PyRuntime.interpreters.mutex)
Eric Snow05351c12017-09-05 21:43:08 -070098
Michael W. Hudson188d4362005-06-20 16:52:57 +000099static void _PyGILState_NoteThreadState(PyThreadState* tstate);
100
Victor Stinnera7368ac2017-11-15 18:11:45 -0800101_PyInitError
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600102_PyInterpreterState_Enable(_PyRuntimeState *runtime)
Eric Snowe3774162017-05-22 19:46:40 -0700103{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600104 runtime->interpreters.next_id = 0;
Victor Stinner5d926472018-03-06 14:31:37 +0100105
106 /* Py_Finalize() calls _PyRuntimeState_Fini() which clears the mutex.
107 Create a new mutex if needed. */
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600108 if (runtime->interpreters.mutex == NULL) {
Victor Stinner5d926472018-03-06 14:31:37 +0100109 /* Force default allocator, since _PyRuntimeState_Fini() must
110 use the same allocator than this function. */
111 PyMemAllocatorEx old_alloc;
112 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
113
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600114 runtime->interpreters.mutex = PyThread_allocate_lock();
Victor Stinner5d926472018-03-06 14:31:37 +0100115
116 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
117
Victor Stinnera7368ac2017-11-15 18:11:45 -0800118 if (runtime->interpreters.mutex == NULL) {
119 return _Py_INIT_ERR("Can't initialize threads for interpreter");
120 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600121 }
Victor Stinner5d926472018-03-06 14:31:37 +0100122
Victor Stinnera7368ac2017-11-15 18:11:45 -0800123 return _Py_INIT_OK();
Eric Snowe3774162017-05-22 19:46:40 -0700124}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000125
126PyInterpreterState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000127PyInterpreterState_New(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000128{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 PyInterpreterState *interp = (PyInterpreterState *)
Victor Stinner1a7425f2013-07-07 16:25:15 +0200130 PyMem_RawMalloc(sizeof(PyInterpreterState));
Guido van Rossum25ce5661997-08-02 03:10:38 +0000131
Victor Stinnerd4341102017-11-23 00:12:09 +0100132 if (interp == NULL) {
133 return NULL;
134 }
135
Eric Snow4c6955e2018-02-16 18:53:40 -0700136 interp->id_refcount = -1;
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100137 interp->id_mutex = NULL;
138 interp->modules = NULL;
139 interp->modules_by_index = NULL;
140 interp->sysdict = NULL;
141 interp->builtins = NULL;
142 interp->builtins_copy = NULL;
143 interp->tstate_head = NULL;
Victor Stinnerd4341102017-11-23 00:12:09 +0100144 interp->check_interval = 100;
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100145 interp->num_threads = 0;
146 interp->pythread_stacksize = 0;
147 interp->codec_search_path = NULL;
148 interp->codec_search_cache = NULL;
149 interp->codec_error_registry = NULL;
150 interp->codecs_initialized = 0;
151 interp->fscodec_initialized = 0;
Victor Stinnerd4341102017-11-23 00:12:09 +0100152 interp->core_config = _PyCoreConfig_INIT;
153 interp->config = _PyMainInterpreterConfig_INIT;
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100154 interp->importlib = NULL;
155 interp->import_func = NULL;
Victor Stinnerd4341102017-11-23 00:12:09 +0100156 interp->eval_frame = _PyEval_EvalFrameDefault;
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100157 interp->co_extra_user_count = 0;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000158#ifdef HAVE_DLOPEN
Serhiy Storchakac2f7d872016-05-04 09:44:44 +0300159#if HAVE_DECL_RTLD_NOW
Victor Stinnerd4341102017-11-23 00:12:09 +0100160 interp->dlopenflags = RTLD_NOW;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000161#else
Victor Stinnerd4341102017-11-23 00:12:09 +0100162 interp->dlopenflags = RTLD_LAZY;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000163#endif
164#endif
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100165#ifdef HAVE_FORK
166 interp->before_forkers = NULL;
167 interp->after_forkers_parent = NULL;
168 interp->after_forkers_child = NULL;
169#endif
170 interp->pyexitfunc = NULL;
171 interp->pyexitmodule = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000172
Victor Stinnerd4341102017-11-23 00:12:09 +0100173 HEAD_LOCK();
Victor Stinnerd4341102017-11-23 00:12:09 +0100174 if (_PyRuntime.interpreters.next_id < 0) {
175 /* overflow or Py_Initialize() not called! */
176 PyErr_SetString(PyExc_RuntimeError,
177 "failed to get an interpreter ID");
Pablo Galindo95d630e2018-08-31 22:49:29 +0100178 PyMem_RawFree(interp);
Victor Stinnerd4341102017-11-23 00:12:09 +0100179 interp = NULL;
180 } else {
181 interp->id = _PyRuntime.interpreters.next_id;
182 _PyRuntime.interpreters.next_id += 1;
Pablo Galindo95d630e2018-08-31 22:49:29 +0100183 interp->next = _PyRuntime.interpreters.head;
184 if (_PyRuntime.interpreters.main == NULL) {
185 _PyRuntime.interpreters.main = interp;
186 }
187 _PyRuntime.interpreters.head = interp;
Victor Stinnerd4341102017-11-23 00:12:09 +0100188 }
189 HEAD_UNLOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000190
Pablo Galindo95d630e2018-08-31 22:49:29 +0100191 if (interp == NULL) {
192 return NULL;
193 }
194
Yury Selivanovf23746a2018-01-22 19:11:18 -0500195 interp->tstate_next_unique_id = 0;
196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 return interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000198}
199
200
201void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000202PyInterpreterState_Clear(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000203{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 PyThreadState *p;
205 HEAD_LOCK();
206 for (p = interp->tstate_head; p != NULL; p = p->next)
207 PyThreadState_Clear(p);
208 HEAD_UNLOCK();
Victor Stinnerda273412017-12-15 01:46:02 +0100209 _PyCoreConfig_Clear(&interp->core_config);
210 _PyMainInterpreterConfig_Clear(&interp->config);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000211 Py_CLEAR(interp->codec_search_path);
212 Py_CLEAR(interp->codec_search_cache);
213 Py_CLEAR(interp->codec_error_registry);
Eric Snow93c92f72017-09-13 23:46:04 -0700214 Py_CLEAR(interp->modules);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 Py_CLEAR(interp->modules_by_index);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000216 Py_CLEAR(interp->sysdict);
217 Py_CLEAR(interp->builtins);
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200218 Py_CLEAR(interp->builtins_copy);
Brett Cannonfd074152012-04-14 14:10:13 -0400219 Py_CLEAR(interp->importlib);
Serhiy Storchaka133138a2016-08-02 22:51:21 +0300220 Py_CLEAR(interp->import_func);
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200221#ifdef HAVE_FORK
222 Py_CLEAR(interp->before_forkers);
223 Py_CLEAR(interp->after_forkers_parent);
224 Py_CLEAR(interp->after_forkers_child);
225#endif
Guido van Rossum25ce5661997-08-02 03:10:38 +0000226}
227
228
229static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000230zapthreads(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000231{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 PyThreadState *p;
233 /* No need to lock the mutex here because this should only happen
234 when the threads are all really dead (XXX famous last words). */
235 while ((p = interp->tstate_head) != NULL) {
236 PyThreadState_Delete(p);
237 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000238}
239
240
241void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000242PyInterpreterState_Delete(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000243{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 PyInterpreterState **p;
245 zapthreads(interp);
246 HEAD_LOCK();
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600247 for (p = &_PyRuntime.interpreters.head; ; p = &(*p)->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000248 if (*p == NULL)
249 Py_FatalError(
250 "PyInterpreterState_Delete: invalid interp");
251 if (*p == interp)
252 break;
253 }
254 if (interp->tstate_head != NULL)
255 Py_FatalError("PyInterpreterState_Delete: remaining threads");
256 *p = interp->next;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600257 if (_PyRuntime.interpreters.main == interp) {
258 _PyRuntime.interpreters.main = NULL;
259 if (_PyRuntime.interpreters.head != NULL)
Eric Snow6b4be192017-05-22 21:36:03 -0700260 Py_FatalError("PyInterpreterState_Delete: remaining subinterpreters");
261 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 HEAD_UNLOCK();
Eric Snow4c6955e2018-02-16 18:53:40 -0700263 if (interp->id_mutex != NULL) {
264 PyThread_free_lock(interp->id_mutex);
265 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200266 PyMem_RawFree(interp);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000267}
268
269
Eric Snow59032962018-09-14 14:17:20 -0700270/*
271 * Delete all interpreter states except the main interpreter. If there
272 * is a current interpreter state, it *must* be the main interpreter.
273 */
274void
275_PyInterpreterState_DeleteExceptMain()
276{
277 PyThreadState *tstate = PyThreadState_Swap(NULL);
278 if (tstate != NULL && tstate->interp != _PyRuntime.interpreters.main) {
279 Py_FatalError("PyInterpreterState_DeleteExceptMain: not main interpreter");
280 }
281
282 HEAD_LOCK();
283 PyInterpreterState *interp = _PyRuntime.interpreters.head;
284 _PyRuntime.interpreters.head = NULL;
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100285 while (interp != NULL) {
Eric Snow59032962018-09-14 14:17:20 -0700286 if (interp == _PyRuntime.interpreters.main) {
287 _PyRuntime.interpreters.main->next = NULL;
288 _PyRuntime.interpreters.head = interp;
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100289 interp = interp->next;
Eric Snow59032962018-09-14 14:17:20 -0700290 continue;
291 }
292
293 PyInterpreterState_Clear(interp); // XXX must activate?
294 zapthreads(interp);
295 if (interp->id_mutex != NULL) {
296 PyThread_free_lock(interp->id_mutex);
297 }
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100298 PyInterpreterState *prev_interp = interp;
299 interp = interp->next;
300 PyMem_RawFree(prev_interp);
Eric Snow59032962018-09-14 14:17:20 -0700301 }
302 HEAD_UNLOCK();
303
304 if (_PyRuntime.interpreters.head == NULL) {
305 Py_FatalError("PyInterpreterState_DeleteExceptMain: missing main");
306 }
307 PyThreadState_Swap(tstate);
308}
309
310
Victor Stinnercaba55b2018-08-03 15:33:52 +0200311PyInterpreterState *
312_PyInterpreterState_Get(void)
313{
Victor Stinner50b48572018-11-01 01:51:40 +0100314 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnercaba55b2018-08-03 15:33:52 +0200315 if (tstate == NULL) {
316 Py_FatalError("_PyInterpreterState_Get(): no current thread state");
317 }
318 PyInterpreterState *interp = tstate->interp;
319 if (interp == NULL) {
320 Py_FatalError("_PyInterpreterState_Get(): no current interpreter");
321 }
322 return interp;
323}
324
325
Eric Snowe3774162017-05-22 19:46:40 -0700326int64_t
327PyInterpreterState_GetID(PyInterpreterState *interp)
328{
329 if (interp == NULL) {
330 PyErr_SetString(PyExc_RuntimeError, "no interpreter provided");
331 return -1;
332 }
333 return interp->id;
334}
335
336
Eric Snowb05b7112019-03-01 12:35:10 -0700337PyInterpreterState *
338_PyInterpreterState_LookUpID(PY_INT64_T requested_id)
339{
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100340 if (requested_id < 0)
341 goto error;
342
343 PyInterpreterState *interp = PyInterpreterState_Head();
344 while (interp != NULL) {
345 PY_INT64_T id = PyInterpreterState_GetID(interp);
346 if (id < 0)
347 return NULL;
348 if (requested_id == id)
349 return interp;
350 interp = PyInterpreterState_Next(interp);
Eric Snowb05b7112019-03-01 12:35:10 -0700351 }
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100352
353error:
354 PyErr_Format(PyExc_RuntimeError,
355 "unrecognized interpreter ID %lld", requested_id);
356 return NULL;
Eric Snowb05b7112019-03-01 12:35:10 -0700357}
358
Eric Snow4c6955e2018-02-16 18:53:40 -0700359
360int
361_PyInterpreterState_IDInitref(PyInterpreterState *interp)
362{
363 if (interp->id_mutex != NULL) {
364 return 0;
365 }
366 interp->id_mutex = PyThread_allocate_lock();
367 if (interp->id_mutex == NULL) {
368 PyErr_SetString(PyExc_RuntimeError,
369 "failed to create init interpreter ID mutex");
370 return -1;
371 }
372 interp->id_refcount = 0;
373 return 0;
374}
375
376
377void
378_PyInterpreterState_IDIncref(PyInterpreterState *interp)
379{
380 if (interp->id_mutex == NULL) {
381 return;
382 }
383 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
384 interp->id_refcount += 1;
385 PyThread_release_lock(interp->id_mutex);
386}
387
388
389void
390_PyInterpreterState_IDDecref(PyInterpreterState *interp)
391{
392 if (interp->id_mutex == NULL) {
393 return;
394 }
395 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
396 assert(interp->id_refcount != 0);
397 interp->id_refcount -= 1;
398 int64_t refcount = interp->id_refcount;
399 PyThread_release_lock(interp->id_mutex);
400
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100401 if (refcount == 0) {
Eric Snowf53d9f22018-02-20 16:30:17 -0700402 // XXX Using the "head" thread isn't strictly correct.
403 PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
404 // XXX Possible GILState issues?
405 PyThreadState *save_tstate = PyThreadState_Swap(tstate);
Eric Snow4c6955e2018-02-16 18:53:40 -0700406 Py_EndInterpreter(tstate);
407 PyThreadState_Swap(save_tstate);
408 }
409}
410
Eric Snowbe3b2952019-02-23 11:35:52 -0700411_PyCoreConfig *
412_PyInterpreterState_GetCoreConfig(PyInterpreterState *interp)
413{
414 return &interp->core_config;
415}
416
417_PyMainInterpreterConfig *
418_PyInterpreterState_GetMainConfig(PyInterpreterState *interp)
419{
420 return &interp->config;
421}
Eric Snow4c6955e2018-02-16 18:53:40 -0700422
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000423/* Default implementation for _PyThreadState_GetFrame */
424static struct _frame *
425threadstate_getframe(PyThreadState *self)
426{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 return self->frame;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000428}
429
Victor Stinner45b9be52010-03-03 23:28:07 +0000430static PyThreadState *
431new_threadstate(PyInterpreterState *interp, int init)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000432{
Victor Stinner1a7425f2013-07-07 16:25:15 +0200433 PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState));
Tim Peters84705582004-10-10 02:47:33 +0000434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 if (_PyThreadState_GetFrame == NULL)
436 _PyThreadState_GetFrame = threadstate_getframe;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000438 if (tstate != NULL) {
439 tstate->interp = interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 tstate->frame = NULL;
442 tstate->recursion_depth = 0;
443 tstate->overflowed = 0;
444 tstate->recursion_critical = 0;
pdox18967932017-10-25 23:03:01 -0700445 tstate->stackcheck_counter = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000446 tstate->tracing = 0;
447 tstate->use_tracing = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 tstate->gilstate_counter = 0;
449 tstate->async_exc = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000450 tstate->thread_id = PyThread_get_thread_ident();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000452 tstate->dict = NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 tstate->curexc_type = NULL;
455 tstate->curexc_value = NULL;
456 tstate->curexc_traceback = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000457
Mark Shannonae3087c2017-10-22 22:41:51 +0100458 tstate->exc_state.exc_type = NULL;
459 tstate->exc_state.exc_value = NULL;
460 tstate->exc_state.exc_traceback = NULL;
461 tstate->exc_state.previous_item = NULL;
462 tstate->exc_info = &tstate->exc_state;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 tstate->c_profilefunc = NULL;
465 tstate->c_tracefunc = NULL;
466 tstate->c_profileobj = NULL;
467 tstate->c_traceobj = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000468
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200469 tstate->trash_delete_nesting = 0;
470 tstate->trash_delete_later = NULL;
Antoine Pitrou7b476992013-09-07 23:38:37 +0200471 tstate->on_delete = NULL;
472 tstate->on_delete_data = NULL;
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200473
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -0800474 tstate->coroutine_origin_tracking_depth = 0;
475
Yury Selivanov75445082015-05-11 22:57:16 -0400476 tstate->coroutine_wrapper = NULL;
Yury Selivanovaab3c4a2015-06-02 18:43:51 -0400477 tstate->in_coroutine_wrapper = 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400478
Yury Selivanoveb636452016-09-08 22:01:51 -0700479 tstate->async_gen_firstiter = NULL;
480 tstate->async_gen_finalizer = NULL;
481
Yury Selivanovf23746a2018-01-22 19:11:18 -0500482 tstate->context = NULL;
483 tstate->context_ver = 1;
484
485 tstate->id = ++interp->tstate_next_unique_id;
486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000487 if (init)
488 _PyThreadState_Init(tstate);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200491 tstate->prev = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 tstate->next = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200493 if (tstate->next)
494 tstate->next->prev = tstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 interp->tstate_head = tstate;
496 HEAD_UNLOCK();
497 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000500}
501
Victor Stinner45b9be52010-03-03 23:28:07 +0000502PyThreadState *
503PyThreadState_New(PyInterpreterState *interp)
504{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 return new_threadstate(interp, 1);
Victor Stinner45b9be52010-03-03 23:28:07 +0000506}
507
508PyThreadState *
509_PyThreadState_Prealloc(PyInterpreterState *interp)
510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 return new_threadstate(interp, 0);
Victor Stinner45b9be52010-03-03 23:28:07 +0000512}
513
514void
515_PyThreadState_Init(PyThreadState *tstate)
516{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 _PyGILState_NoteThreadState(tstate);
Victor Stinner45b9be52010-03-03 23:28:07 +0000518}
519
Martin v. Löwis1a214512008-06-11 05:26:20 +0000520PyObject*
Martin v. Löwis7800f752012-06-22 12:20:55 +0200521PyState_FindModule(struct PyModuleDef* module)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000522{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200523 Py_ssize_t index = module->m_base.m_index;
Victor Stinner9204fb82018-10-30 15:13:17 +0100524 PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 PyObject *res;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000526 if (module->m_slots) {
527 return NULL;
528 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 if (index == 0)
530 return NULL;
531 if (state->modules_by_index == NULL)
532 return NULL;
Antoine Pitrou75506e82012-08-20 19:30:46 +0200533 if (index >= PyList_GET_SIZE(state->modules_by_index))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 return NULL;
535 res = PyList_GET_ITEM(state->modules_by_index, index);
536 return res==Py_None ? NULL : res;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000537}
538
539int
540_PyState_AddModule(PyObject* module, struct PyModuleDef* def)
541{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000542 PyInterpreterState *state;
Berker Peksag4b7b5652016-08-22 18:05:56 +0300543 if (!def) {
544 assert(PyErr_Occurred());
545 return -1;
546 }
Nick Coghland5cacbb2015-05-23 22:24:10 +1000547 if (def->m_slots) {
548 PyErr_SetString(PyExc_SystemError,
549 "PyState_AddModule called on module with slots");
550 return -1;
551 }
Victor Stinner9204fb82018-10-30 15:13:17 +0100552 state = _PyInterpreterState_GET_UNSAFE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 if (!state->modules_by_index) {
554 state->modules_by_index = PyList_New(0);
555 if (!state->modules_by_index)
556 return -1;
557 }
558 while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
559 if (PyList_Append(state->modules_by_index, Py_None) < 0)
560 return -1;
561 Py_INCREF(module);
562 return PyList_SetItem(state->modules_by_index,
563 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000564}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000565
Martin v. Löwis7800f752012-06-22 12:20:55 +0200566int
567PyState_AddModule(PyObject* module, struct PyModuleDef* def)
568{
569 Py_ssize_t index;
Victor Stinner9204fb82018-10-30 15:13:17 +0100570 PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200571 if (!def) {
572 Py_FatalError("PyState_AddModule: Module Definition is NULL");
573 return -1;
574 }
575 index = def->m_base.m_index;
576 if (state->modules_by_index) {
577 if(PyList_GET_SIZE(state->modules_by_index) >= index) {
578 if(module == PyList_GET_ITEM(state->modules_by_index, index)) {
579 Py_FatalError("PyState_AddModule: Module already added!");
580 return -1;
581 }
582 }
583 }
584 return _PyState_AddModule(module, def);
585}
586
587int
588PyState_RemoveModule(struct PyModuleDef* def)
589{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000590 PyInterpreterState *state;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200591 Py_ssize_t index = def->m_base.m_index;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000592 if (def->m_slots) {
593 PyErr_SetString(PyExc_SystemError,
594 "PyState_RemoveModule called on module with slots");
595 return -1;
596 }
Victor Stinner9204fb82018-10-30 15:13:17 +0100597 state = _PyInterpreterState_GET_UNSAFE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200598 if (index == 0) {
599 Py_FatalError("PyState_RemoveModule: Module index invalid.");
600 return -1;
601 }
602 if (state->modules_by_index == NULL) {
603 Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible.");
604 return -1;
605 }
606 if (index > PyList_GET_SIZE(state->modules_by_index)) {
607 Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
608 return -1;
609 }
Zackery Spytz2a893432018-12-05 00:14:00 -0700610 Py_INCREF(Py_None);
Martin v. Löwis7800f752012-06-22 12:20:55 +0200611 return PyList_SetItem(state->modules_by_index, index, Py_None);
612}
613
Antoine Pitrou40322e62013-08-11 00:30:09 +0200614/* used by import.c:PyImport_Cleanup */
615void
616_PyState_ClearModules(void)
617{
Victor Stinner9204fb82018-10-30 15:13:17 +0100618 PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE();
Antoine Pitrou40322e62013-08-11 00:30:09 +0200619 if (state->modules_by_index) {
620 Py_ssize_t i;
621 for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) {
622 PyObject *m = PyList_GET_ITEM(state->modules_by_index, i);
623 if (PyModule_Check(m)) {
624 /* cleanup the saved copy of module dicts */
625 PyModuleDef *md = PyModule_GetDef(m);
626 if (md)
627 Py_CLEAR(md->m_base.m_copy);
628 }
629 }
630 /* Setting modules_by_index to NULL could be dangerous, so we
631 clear the list instead. */
632 if (PyList_SetSlice(state->modules_by_index,
633 0, PyList_GET_SIZE(state->modules_by_index),
634 NULL))
635 PyErr_WriteUnraisable(state->modules_by_index);
636 }
637}
638
Guido van Rossuma027efa1997-05-05 20:56:21 +0000639void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000640PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000641{
Victor Stinner53b7d4e2018-07-25 01:37:05 +0200642 int verbose = tstate->interp->core_config.verbose;
643
644 if (verbose && tstate->frame != NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 fprintf(stderr,
646 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 Py_CLEAR(tstate->frame);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 Py_CLEAR(tstate->dict);
651 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 Py_CLEAR(tstate->curexc_type);
654 Py_CLEAR(tstate->curexc_value);
655 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000656
Mark Shannonae3087c2017-10-22 22:41:51 +0100657 Py_CLEAR(tstate->exc_state.exc_type);
658 Py_CLEAR(tstate->exc_state.exc_value);
659 Py_CLEAR(tstate->exc_state.exc_traceback);
Serhiy Storchakabdf42982017-10-26 16:59:40 +0300660
Mark Shannonae3087c2017-10-22 22:41:51 +0100661 /* The stack of exception states should contain just this thread. */
Victor Stinner53b7d4e2018-07-25 01:37:05 +0200662 if (verbose && tstate->exc_info != &tstate->exc_state) {
Mark Shannonae3087c2017-10-22 22:41:51 +0100663 fprintf(stderr,
664 "PyThreadState_Clear: warning: thread still has a generator\n");
665 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 tstate->c_profilefunc = NULL;
668 tstate->c_tracefunc = NULL;
669 Py_CLEAR(tstate->c_profileobj);
670 Py_CLEAR(tstate->c_traceobj);
Yury Selivanov75445082015-05-11 22:57:16 -0400671
672 Py_CLEAR(tstate->coroutine_wrapper);
Yury Selivanoveb636452016-09-08 22:01:51 -0700673 Py_CLEAR(tstate->async_gen_firstiter);
674 Py_CLEAR(tstate->async_gen_finalizer);
Yury Selivanovf23746a2018-01-22 19:11:18 -0500675
676 Py_CLEAR(tstate->context);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000677}
678
679
Guido van Rossum29757862001-01-23 01:46:06 +0000680/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
681static void
682tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000684 PyInterpreterState *interp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 if (tstate == NULL)
686 Py_FatalError("PyThreadState_Delete: NULL tstate");
687 interp = tstate->interp;
688 if (interp == NULL)
689 Py_FatalError("PyThreadState_Delete: NULL interp");
690 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200691 if (tstate->prev)
692 tstate->prev->next = tstate->next;
693 else
694 interp->tstate_head = tstate->next;
695 if (tstate->next)
696 tstate->next->prev = tstate->prev;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 HEAD_UNLOCK();
Antoine Pitrou7b476992013-09-07 23:38:37 +0200698 if (tstate->on_delete != NULL) {
699 tstate->on_delete(tstate->on_delete_data);
700 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200701 PyMem_RawFree(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000702}
703
704
Guido van Rossum29757862001-01-23 01:46:06 +0000705void
706PyThreadState_Delete(PyThreadState *tstate)
707{
Victor Stinner50b48572018-11-01 01:51:40 +0100708 if (tstate == _PyThreadState_GET())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 Py_FatalError("PyThreadState_Delete: tstate is still current");
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600710 if (_PyRuntime.gilstate.autoInterpreterState &&
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900711 PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == tstate)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600712 {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900713 PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, NULL);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600714 }
Christian Heimesb9dbc7d2013-07-01 23:42:28 +0200715 tstate_delete_common(tstate);
Guido van Rossum29757862001-01-23 01:46:06 +0000716}
717
718
Guido van Rossum29757862001-01-23 01:46:06 +0000719void
720PyThreadState_DeleteCurrent()
721{
Victor Stinner50b48572018-11-01 01:51:40 +0100722 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 if (tstate == NULL)
724 Py_FatalError(
725 "PyThreadState_DeleteCurrent: no current tstate");
Victor Stinner8a1be612016-03-14 22:07:55 +0100726 tstate_delete_common(tstate);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600727 if (_PyRuntime.gilstate.autoInterpreterState &&
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900728 PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == tstate)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600729 {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900730 PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, NULL);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600731 }
Victor Stinner9204fb82018-10-30 15:13:17 +0100732 _PyThreadState_SET(NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 PyEval_ReleaseLock();
Guido van Rossum29757862001-01-23 01:46:06 +0000734}
Guido van Rossum29757862001-01-23 01:46:06 +0000735
736
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200737/*
738 * Delete all thread states except the one passed as argument.
739 * Note that, if there is a current thread state, it *must* be the one
740 * passed as argument. Also, this won't touch any other interpreters
741 * than the current one, since we don't know which thread state should
742 * be kept in those other interpreteres.
743 */
744void
745_PyThreadState_DeleteExcept(PyThreadState *tstate)
746{
747 PyInterpreterState *interp = tstate->interp;
748 PyThreadState *p, *next, *garbage;
749 HEAD_LOCK();
750 /* Remove all thread states, except tstate, from the linked list of
751 thread states. This will allow calling PyThreadState_Clear()
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200752 without holding the lock. */
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200753 garbage = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200754 if (garbage == tstate)
755 garbage = tstate->next;
756 if (tstate->prev)
757 tstate->prev->next = tstate->next;
758 if (tstate->next)
759 tstate->next->prev = tstate->prev;
760 tstate->prev = tstate->next = NULL;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200761 interp->tstate_head = tstate;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200762 HEAD_UNLOCK();
763 /* Clear and deallocate all stale thread states. Even if this
764 executes Python code, we should be safe since it executes
765 in the current thread, not one of the stale threads. */
766 for (p = garbage; p; p = next) {
767 next = p->next;
768 PyThreadState_Clear(p);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200769 PyMem_RawFree(p);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200770 }
771}
772
773
Guido van Rossuma027efa1997-05-05 20:56:21 +0000774PyThreadState *
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100775_PyThreadState_UncheckedGet(void)
776{
Victor Stinner50b48572018-11-01 01:51:40 +0100777 return _PyThreadState_GET();
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100778}
779
780
781PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000782PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000783{
Victor Stinner50b48572018-11-01 01:51:40 +0100784 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 if (tstate == NULL)
786 Py_FatalError("PyThreadState_Get: no current thread");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000789}
790
791
792PyThreadState *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000793PyThreadState_Swap(PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000794{
Victor Stinner50b48572018-11-01 01:51:40 +0100795 PyThreadState *oldts = _PyThreadState_GET();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000796
Victor Stinner9204fb82018-10-30 15:13:17 +0100797 _PyThreadState_SET(newts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 /* It should not be possible for more than one thread state
799 to be used for a thread. Check this the best we can in debug
800 builds.
801 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200802#if defined(Py_DEBUG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 if (newts) {
804 /* This can be called from PyEval_RestoreThread(). Similar
805 to it, we need to ensure errno doesn't change.
806 */
807 int err = errno;
808 PyThreadState *check = PyGILState_GetThisThreadState();
809 if (check && check->interp == newts->interp && check != newts)
810 Py_FatalError("Invalid thread state for this thread");
811 errno = err;
812 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000813#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000815}
Guido van Rossumede04391998-04-10 20:18:25 +0000816
817/* An extension mechanism to store arbitrary additional per-thread state.
818 PyThreadState_GetDict() returns a dictionary that can be used to hold such
819 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +0000820 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
821 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +0000822
823PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000824PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000825{
Victor Stinner50b48572018-11-01 01:51:40 +0100826 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 if (tstate == NULL)
828 return NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 if (tstate->dict == NULL) {
831 PyObject *d;
832 tstate->dict = d = PyDict_New();
833 if (d == NULL)
834 PyErr_Clear();
835 }
836 return tstate->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000837}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000838
839
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000840/* Asynchronously raise an exception in a thread.
841 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +0000842 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000843 to call this, or use ctypes. Must be called with the GIL held.
844 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
845 match any known thread id). Can be called with exc=NULL to clear an
846 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000847
848int
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200849PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc)
850{
Victor Stinner9204fb82018-10-30 15:13:17 +0100851 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 PyThreadState *p;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 /* Although the GIL is held, a few C API functions can be called
855 * without the GIL held, and in particular some that create and
856 * destroy thread and interpreter states. Those can mutate the
857 * list of thread states we're traversing, so to prevent that we lock
858 * head_mutex for the duration.
859 */
860 HEAD_LOCK();
861 for (p = interp->tstate_head; p != NULL; p = p->next) {
862 if (p->thread_id == id) {
863 /* Tricky: we need to decref the current value
864 * (if any) in p->async_exc, but that can in turn
865 * allow arbitrary Python code to run, including
866 * perhaps calls to this function. To prevent
867 * deadlock, we need to release head_mutex before
868 * the decref.
869 */
870 PyObject *old_exc = p->async_exc;
871 Py_XINCREF(exc);
872 p->async_exc = exc;
873 HEAD_UNLOCK();
874 Py_XDECREF(old_exc);
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100875 _PyEval_SignalAsyncExc();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 return 1;
877 }
878 }
879 HEAD_UNLOCK();
880 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000881}
882
883
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000884/* Routines for advanced debuggers, requested by David Beazley.
885 Don't use unless you know what you are doing! */
886
887PyInterpreterState *
888PyInterpreterState_Head(void)
889{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600890 return _PyRuntime.interpreters.head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000891}
892
893PyInterpreterState *
Eric Snow6b4be192017-05-22 21:36:03 -0700894PyInterpreterState_Main(void)
895{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600896 return _PyRuntime.interpreters.main;
Eric Snow6b4be192017-05-22 21:36:03 -0700897}
898
899PyInterpreterState *
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000900PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000902}
903
904PyThreadState *
905PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000907}
908
909PyThreadState *
910PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000912}
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000913
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000914/* The implementation of sys._current_frames(). This is intended to be
915 called with the GIL held, as it will be when called via
916 sys._current_frames(). It's possible it would work fine even without
917 the GIL held, but haven't thought enough about that.
918*/
919PyObject *
920_PyThread_CurrentFrames(void)
921{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 PyObject *result;
923 PyInterpreterState *i;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 result = PyDict_New();
926 if (result == NULL)
927 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 /* for i in all interpreters:
930 * for t in all of i's thread states:
931 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +0200932 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 * need to grab head_mutex for the duration.
934 */
935 HEAD_LOCK();
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600936 for (i = _PyRuntime.interpreters.head; i != NULL; i = i->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 PyThreadState *t;
938 for (t = i->tstate_head; t != NULL; t = t->next) {
939 PyObject *id;
940 int stat;
941 struct _frame *frame = t->frame;
942 if (frame == NULL)
943 continue;
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200944 id = PyLong_FromUnsignedLong(t->thread_id);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 if (id == NULL)
946 goto Fail;
947 stat = PyDict_SetItem(result, id, (PyObject *)frame);
948 Py_DECREF(id);
949 if (stat < 0)
950 goto Fail;
951 }
952 }
953 HEAD_UNLOCK();
954 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000955
956 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 HEAD_UNLOCK();
958 Py_DECREF(result);
959 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000960}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000961
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000962/* Python "auto thread state" API. */
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000963
964/* Keep this as a static, as it is not reliable! It can only
965 ever be compared to the state for the *current* thread.
966 * If not equal, then it doesn't matter that the actual
967 value may change immediately after comparison, as it can't
968 possibly change to the current thread's state.
969 * If equal, then the current thread holds the lock, so the value can't
970 change until we yield the lock.
971*/
972static int
973PyThreadState_IsCurrent(PyThreadState *tstate)
974{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 /* Must be the tstate for this thread */
976 assert(PyGILState_GetThisThreadState()==tstate);
Victor Stinner50b48572018-11-01 01:51:40 +0100977 return tstate == _PyThreadState_GET();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000978}
979
Tim Peters4c1f5ec2004-10-09 17:25:05 +0000980/* Internal initialization/finalization functions called by
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000981 Py_Initialize/Py_FinalizeEx
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000982*/
Tim Peters19717fa2004-10-09 17:38:29 +0000983void
984_PyGILState_Init(PyInterpreterState *i, PyThreadState *t)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000985{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 assert(i && t); /* must init with valid states */
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900987 if (PyThread_tss_create(&_PyRuntime.gilstate.autoTSSkey) != 0) {
988 Py_FatalError("Could not allocate TSS entry");
989 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600990 _PyRuntime.gilstate.autoInterpreterState = i;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900991 assert(PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 assert(t->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 _PyGILState_NoteThreadState(t);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000995}
996
Victor Stinner861d9ab2016-03-16 22:45:24 +0100997PyInterpreterState *
998_PyGILState_GetInterpreterStateUnsafe(void)
999{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001000 return _PyRuntime.gilstate.autoInterpreterState;
Victor Stinner861d9ab2016-03-16 22:45:24 +01001001}
1002
Tim Peters19717fa2004-10-09 17:38:29 +00001003void
1004_PyGILState_Fini(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001005{
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001006 PyThread_tss_delete(&_PyRuntime.gilstate.autoTSSkey);
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001007 _PyRuntime.gilstate.autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001008}
1009
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001010/* Reset the TSS key - called by PyOS_AfterFork_Child().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001011 * This should not be necessary, but some - buggy - pthread implementations
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001012 * don't reset TSS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001013 */
1014void
1015_PyGILState_Reinit(void)
1016{
Victor Stinner5d926472018-03-06 14:31:37 +01001017 /* Force default allocator, since _PyRuntimeState_Fini() must
1018 use the same allocator than this function. */
1019 PyMemAllocatorEx old_alloc;
1020 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
1021
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001022 _PyRuntime.interpreters.mutex = PyThread_allocate_lock();
Victor Stinner5d926472018-03-06 14:31:37 +01001023
1024 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
1025
1026 if (_PyRuntime.interpreters.mutex == NULL) {
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001027 Py_FatalError("Can't initialize threads for interpreter");
Victor Stinner5d926472018-03-06 14:31:37 +01001028 }
1029
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001030 PyThreadState *tstate = PyGILState_GetThisThreadState();
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001031 PyThread_tss_delete(&_PyRuntime.gilstate.autoTSSkey);
1032 if (PyThread_tss_create(&_PyRuntime.gilstate.autoTSSkey) != 0) {
1033 Py_FatalError("Could not allocate TSS entry");
1034 }
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001035
Charles-François Natalia233df82011-11-22 19:49:51 +01001036 /* If the thread had an associated auto thread state, reassociate it with
1037 * the new key. */
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001038 if (tstate &&
1039 PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, (void *)tstate) != 0)
1040 {
1041 Py_FatalError("Couldn't create autoTSSkey mapping");
1042 }
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001043}
1044
Michael W. Hudson188d4362005-06-20 16:52:57 +00001045/* When a thread state is created for a thread by some mechanism other than
1046 PyGILState_Ensure, it's important that the GILState machinery knows about
1047 it so it doesn't try to create another thread state for the thread (this is
1048 a better fix for SF bug #1010677 than the first one attempted).
1049*/
Thomas Wouters89f507f2006-12-13 04:49:30 +00001050static void
Michael W. Hudson188d4362005-06-20 16:52:57 +00001051_PyGILState_NoteThreadState(PyThreadState* tstate)
1052{
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001053 /* If autoTSSkey isn't initialized, this must be the very first
Antoine Pitrou079ce542010-09-08 12:37:10 +00001054 threadstate created in Py_Initialize(). Don't do anything for now
1055 (we'll be back here when _PyGILState_Init is called). */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001056 if (!_PyRuntime.gilstate.autoInterpreterState)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 return;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001058
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001059 /* Stick the thread state for this thread in thread specific storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +00001060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 The only situation where you can legitimately have more than one
1062 thread state for an OS level thread is when there are multiple
Victor Stinner590cebe2013-12-13 11:08:56 +01001063 interpreters.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001064
Victor Stinner590cebe2013-12-13 11:08:56 +01001065 You shouldn't really be using the PyGILState_ APIs anyway (see issues
1066 #10915 and #15751).
Michael W. Hudson188d4362005-06-20 16:52:57 +00001067
Victor Stinner590cebe2013-12-13 11:08:56 +01001068 The first thread state created for that given OS level thread will
1069 "win", which seems reasonable behaviour.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 */
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001071 if (PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == NULL) {
1072 if ((PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, (void *)tstate)
1073 ) != 0)
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001074 {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001075 Py_FatalError("Couldn't create autoTSSkey mapping");
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001076 }
Victor Stinner590cebe2013-12-13 11:08:56 +01001077 }
Michael W. Hudson188d4362005-06-20 16:52:57 +00001078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 /* PyGILState_Release must not try to delete this thread state. */
1080 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +00001081}
1082
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001083/* The public functions */
Tim Peters19717fa2004-10-09 17:38:29 +00001084PyThreadState *
1085PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001086{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001087 if (_PyRuntime.gilstate.autoInterpreterState == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 return NULL;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001089 return (PyThreadState *)PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001090}
1091
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -07001092int
1093PyGILState_Check(void)
1094{
Victor Stinner8a1be612016-03-14 22:07:55 +01001095 PyThreadState *tstate;
1096
1097 if (!_PyGILState_check_enabled)
1098 return 1;
1099
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001100 if (!PyThread_tss_is_created(&_PyRuntime.gilstate.autoTSSkey)) {
Victor Stinner8a1be612016-03-14 22:07:55 +01001101 return 1;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001102 }
Victor Stinner8a1be612016-03-14 22:07:55 +01001103
Victor Stinner50b48572018-11-01 01:51:40 +01001104 tstate = _PyThreadState_GET();
Victor Stinner8a1be612016-03-14 22:07:55 +01001105 if (tstate == NULL)
1106 return 0;
1107
1108 return (tstate == PyGILState_GetThisThreadState());
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -07001109}
1110
Tim Peters19717fa2004-10-09 17:38:29 +00001111PyGILState_STATE
1112PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001113{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 int current;
1115 PyThreadState *tcur;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001116 int need_init_threads = 0;
1117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 /* Note that we do not auto-init Python here - apart from
1119 potential races with 2 threads auto-initializing, pep-311
1120 spells out other issues. Embedders are expected to have
1121 called Py_Initialize() and usually PyEval_InitThreads().
1122 */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001123 /* Py_Initialize() hasn't been called! */
1124 assert(_PyRuntime.gilstate.autoInterpreterState);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001125
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001126 tcur = (PyThreadState *)PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 if (tcur == NULL) {
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001128 need_init_threads = 1;
Victor Stinner62ca1002013-12-13 01:46:43 +01001129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 /* Create a new thread state for this thread */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001131 tcur = PyThreadState_New(_PyRuntime.gilstate.autoInterpreterState);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 if (tcur == NULL)
1133 Py_FatalError("Couldn't create thread-state for new thread");
1134 /* This is our thread state! We'll need to delete it in the
1135 matching call to PyGILState_Release(). */
1136 tcur->gilstate_counter = 0;
1137 current = 0; /* new thread state is never current */
1138 }
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001139 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 current = PyThreadState_IsCurrent(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001141 }
1142
1143 if (current == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 PyEval_RestoreThread(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001145 }
1146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 /* Update our counter in the thread-state - no need for locks:
1148 - tcur will remain valid as we hold the GIL.
1149 - the counter is safe as we are the only thread "allowed"
1150 to modify this value
1151 */
1152 ++tcur->gilstate_counter;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001153
1154 if (need_init_threads) {
1155 /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is
1156 called from a new thread for the first time, we need the create the
1157 GIL. */
1158 PyEval_InitThreads();
1159 }
1160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001162}
1163
Tim Peters19717fa2004-10-09 17:38:29 +00001164void
1165PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001166{
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001167 PyThreadState *tcur = (PyThreadState *)PyThread_tss_get(
1168 &_PyRuntime.gilstate.autoTSSkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 if (tcur == NULL)
1170 Py_FatalError("auto-releasing thread-state, "
1171 "but no thread-state for this thread");
1172 /* We must hold the GIL and have our thread state current */
1173 /* XXX - remove the check - the assert should be fine,
1174 but while this is very new (April 2003), the extra check
1175 by release-only users can't hurt.
1176 */
1177 if (! PyThreadState_IsCurrent(tcur))
1178 Py_FatalError("This thread state must be current when releasing");
1179 assert(PyThreadState_IsCurrent(tcur));
1180 --tcur->gilstate_counter;
1181 assert(tcur->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 /* If we're going to destroy this thread-state, we must
1184 * clear it while the GIL is held, as destructors may run.
1185 */
1186 if (tcur->gilstate_counter == 0) {
1187 /* can't have been locked when we created it */
1188 assert(oldstate == PyGILState_UNLOCKED);
1189 PyThreadState_Clear(tcur);
1190 /* Delete the thread-state. Note this releases the GIL too!
1191 * It's vital that the GIL be held here, to avoid shutdown
1192 * races; see bugs 225673 and 1061968 (that nasty bug has a
1193 * habit of coming back).
1194 */
1195 PyThreadState_DeleteCurrent();
1196 }
1197 /* Release the lock if necessary */
1198 else if (oldstate == PyGILState_UNLOCKED)
1199 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001200}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001201
Benjamin Peterson3bf01752012-04-13 18:06:36 -04001202
Eric Snow7f8bfc92018-01-29 18:23:44 -07001203/**************************/
1204/* cross-interpreter data */
1205/**************************/
1206
1207/* cross-interpreter data */
1208
1209crossinterpdatafunc _PyCrossInterpreterData_Lookup(PyObject *);
1210
1211/* This is a separate func from _PyCrossInterpreterData_Lookup in order
1212 to keep the registry code separate. */
1213static crossinterpdatafunc
1214_lookup_getdata(PyObject *obj)
1215{
1216 crossinterpdatafunc getdata = _PyCrossInterpreterData_Lookup(obj);
1217 if (getdata == NULL && PyErr_Occurred() == 0)
1218 PyErr_Format(PyExc_ValueError,
1219 "%S does not support cross-interpreter data", obj);
1220 return getdata;
1221}
1222
1223int
1224_PyObject_CheckCrossInterpreterData(PyObject *obj)
1225{
1226 crossinterpdatafunc getdata = _lookup_getdata(obj);
1227 if (getdata == NULL) {
1228 return -1;
1229 }
1230 return 0;
1231}
1232
1233static int
1234_check_xidata(_PyCrossInterpreterData *data)
1235{
1236 // data->data can be anything, including NULL, so we don't check it.
1237
1238 // data->obj may be NULL, so we don't check it.
1239
1240 if (data->interp < 0) {
1241 PyErr_SetString(PyExc_SystemError, "missing interp");
1242 return -1;
1243 }
1244
1245 if (data->new_object == NULL) {
1246 PyErr_SetString(PyExc_SystemError, "missing new_object func");
1247 return -1;
1248 }
1249
1250 // data->free may be NULL, so we don't check it.
1251
1252 return 0;
1253}
1254
1255int
1256_PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data)
1257{
Victor Stinnercaba55b2018-08-03 15:33:52 +02001258 // _PyInterpreterState_Get() aborts if lookup fails, so we don't need
Eric Snow7f8bfc92018-01-29 18:23:44 -07001259 // to check the result for NULL.
Victor Stinnercaba55b2018-08-03 15:33:52 +02001260 PyInterpreterState *interp = _PyInterpreterState_Get();
Eric Snow7f8bfc92018-01-29 18:23:44 -07001261
1262 // Reset data before re-populating.
1263 *data = (_PyCrossInterpreterData){0};
1264 data->free = PyMem_RawFree; // Set a default that may be overridden.
1265
1266 // Call the "getdata" func for the object.
1267 Py_INCREF(obj);
1268 crossinterpdatafunc getdata = _lookup_getdata(obj);
1269 if (getdata == NULL) {
1270 Py_DECREF(obj);
1271 return -1;
1272 }
1273 int res = getdata(obj, data);
1274 Py_DECREF(obj);
1275 if (res != 0) {
1276 return -1;
1277 }
1278
1279 // Fill in the blanks and validate the result.
Eric Snow7f8bfc92018-01-29 18:23:44 -07001280 data->interp = interp->id;
1281 if (_check_xidata(data) != 0) {
1282 _PyCrossInterpreterData_Release(data);
1283 return -1;
1284 }
1285
1286 return 0;
1287}
1288
Victor Stinner4d61e6e2019-03-04 14:21:28 +01001289static void
Eric Snow63799132018-06-01 18:45:20 -06001290_release_xidata(void *arg)
1291{
1292 _PyCrossInterpreterData *data = (_PyCrossInterpreterData *)arg;
1293 if (data->free != NULL) {
1294 data->free(data->data);
1295 }
1296 Py_XDECREF(data->obj);
Victor Stinner4d61e6e2019-03-04 14:21:28 +01001297}
1298
1299static void
1300_call_in_interpreter(PyInterpreterState *interp,
1301 void (*func)(void *), void *arg)
1302{
1303 /* We would use Py_AddPendingCall() if it weren't specific to the
1304 * main interpreter (see bpo-33608). In the meantime we take a
1305 * naive approach.
1306 */
1307 PyThreadState *save_tstate = NULL;
1308 if (interp != _PyInterpreterState_Get()) {
1309 // XXX Using the "head" thread isn't strictly correct.
1310 PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
1311 // XXX Possible GILState issues?
1312 save_tstate = PyThreadState_Swap(tstate);
1313 }
1314
1315 func(arg);
1316
1317 // Switch back.
1318 if (save_tstate != NULL) {
1319 PyThreadState_Swap(save_tstate);
1320 }
Eric Snow63799132018-06-01 18:45:20 -06001321}
1322
Eric Snow7f8bfc92018-01-29 18:23:44 -07001323void
1324_PyCrossInterpreterData_Release(_PyCrossInterpreterData *data)
1325{
1326 if (data->data == NULL && data->obj == NULL) {
1327 // Nothing to release!
1328 return;
1329 }
1330
Victor Stinner4d61e6e2019-03-04 14:21:28 +01001331 // Switch to the original interpreter.
Eric Snow7f8bfc92018-01-29 18:23:44 -07001332 PyInterpreterState *interp = _PyInterpreterState_LookUpID(data->interp);
1333 if (interp == NULL) {
1334 // The intepreter was already destroyed.
1335 if (data->free != NULL) {
1336 // XXX Someone leaked some memory...
1337 }
1338 return;
1339 }
Eric Snowf53d9f22018-02-20 16:30:17 -07001340
Eric Snow7f8bfc92018-01-29 18:23:44 -07001341 // "Release" the data and/or the object.
Victor Stinner4d61e6e2019-03-04 14:21:28 +01001342 _call_in_interpreter(interp, _release_xidata, data);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001343}
1344
1345PyObject *
1346_PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *data)
1347{
1348 return data->new_object(data);
1349}
1350
1351/* registry of {type -> crossinterpdatafunc} */
1352
1353/* For now we use a global registry of shareable classes. An
1354 alternative would be to add a tp_* slot for a class's
1355 crossinterpdatafunc. It would be simpler and more efficient. */
1356
1357static int
1358_register_xidata(PyTypeObject *cls, crossinterpdatafunc getdata)
1359{
1360 // Note that we effectively replace already registered classes
1361 // rather than failing.
1362 struct _xidregitem *newhead = PyMem_RawMalloc(sizeof(struct _xidregitem));
1363 if (newhead == NULL)
1364 return -1;
1365 newhead->cls = cls;
1366 newhead->getdata = getdata;
1367 newhead->next = _PyRuntime.xidregistry.head;
1368 _PyRuntime.xidregistry.head = newhead;
1369 return 0;
1370}
1371
1372static void _register_builtins_for_crossinterpreter_data(void);
1373
1374int
Victor Stinner4d61e6e2019-03-04 14:21:28 +01001375_PyCrossInterpreterData_Register_Class(PyTypeObject *cls,
Eric Snow7f8bfc92018-01-29 18:23:44 -07001376 crossinterpdatafunc getdata)
1377{
1378 if (!PyType_Check(cls)) {
1379 PyErr_Format(PyExc_ValueError, "only classes may be registered");
1380 return -1;
1381 }
1382 if (getdata == NULL) {
1383 PyErr_Format(PyExc_ValueError, "missing 'getdata' func");
1384 return -1;
1385 }
1386
1387 // Make sure the class isn't ever deallocated.
1388 Py_INCREF((PyObject *)cls);
1389
1390 PyThread_acquire_lock(_PyRuntime.xidregistry.mutex, WAIT_LOCK);
1391 if (_PyRuntime.xidregistry.head == NULL) {
1392 _register_builtins_for_crossinterpreter_data();
1393 }
1394 int res = _register_xidata(cls, getdata);
1395 PyThread_release_lock(_PyRuntime.xidregistry.mutex);
1396 return res;
1397}
1398
Eric Snow6d2cd902018-05-16 15:04:57 -04001399/* Cross-interpreter objects are looked up by exact match on the class.
1400 We can reassess this policy when we move from a global registry to a
1401 tp_* slot. */
1402
Eric Snow7f8bfc92018-01-29 18:23:44 -07001403crossinterpdatafunc
1404_PyCrossInterpreterData_Lookup(PyObject *obj)
1405{
1406 PyObject *cls = PyObject_Type(obj);
1407 crossinterpdatafunc getdata = NULL;
1408 PyThread_acquire_lock(_PyRuntime.xidregistry.mutex, WAIT_LOCK);
1409 struct _xidregitem *cur = _PyRuntime.xidregistry.head;
1410 if (cur == NULL) {
1411 _register_builtins_for_crossinterpreter_data();
1412 cur = _PyRuntime.xidregistry.head;
1413 }
1414 for(; cur != NULL; cur = cur->next) {
1415 if (cur->cls == (PyTypeObject *)cls) {
1416 getdata = cur->getdata;
1417 break;
1418 }
1419 }
Eric Snow4e9da0d2018-02-02 21:49:49 -07001420 Py_DECREF(cls);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001421 PyThread_release_lock(_PyRuntime.xidregistry.mutex);
1422 return getdata;
1423}
1424
1425/* cross-interpreter data for builtin types */
1426
Eric Snow6d2cd902018-05-16 15:04:57 -04001427struct _shared_bytes_data {
1428 char *bytes;
1429 Py_ssize_t len;
1430};
1431
Eric Snow7f8bfc92018-01-29 18:23:44 -07001432static PyObject *
1433_new_bytes_object(_PyCrossInterpreterData *data)
1434{
Eric Snow6d2cd902018-05-16 15:04:57 -04001435 struct _shared_bytes_data *shared = (struct _shared_bytes_data *)(data->data);
1436 return PyBytes_FromStringAndSize(shared->bytes, shared->len);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001437}
1438
1439static int
1440_bytes_shared(PyObject *obj, _PyCrossInterpreterData *data)
1441{
Eric Snow6d2cd902018-05-16 15:04:57 -04001442 struct _shared_bytes_data *shared = PyMem_NEW(struct _shared_bytes_data, 1);
1443 if (PyBytes_AsStringAndSize(obj, &shared->bytes, &shared->len) < 0) {
1444 return -1;
1445 }
1446 data->data = (void *)shared;
Eric Snow63799132018-06-01 18:45:20 -06001447 Py_INCREF(obj);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001448 data->obj = obj; // Will be "released" (decref'ed) when data released.
1449 data->new_object = _new_bytes_object;
Eric Snow6d2cd902018-05-16 15:04:57 -04001450 data->free = PyMem_Free;
1451 return 0;
1452}
1453
1454struct _shared_str_data {
1455 int kind;
1456 const void *buffer;
1457 Py_ssize_t len;
1458};
1459
1460static PyObject *
1461_new_str_object(_PyCrossInterpreterData *data)
1462{
1463 struct _shared_str_data *shared = (struct _shared_str_data *)(data->data);
1464 return PyUnicode_FromKindAndData(shared->kind, shared->buffer, shared->len);
1465}
1466
1467static int
1468_str_shared(PyObject *obj, _PyCrossInterpreterData *data)
1469{
1470 struct _shared_str_data *shared = PyMem_NEW(struct _shared_str_data, 1);
1471 shared->kind = PyUnicode_KIND(obj);
1472 shared->buffer = PyUnicode_DATA(obj);
1473 shared->len = PyUnicode_GET_LENGTH(obj) - 1;
1474 data->data = (void *)shared;
Eric Snow63799132018-06-01 18:45:20 -06001475 Py_INCREF(obj);
Eric Snow6d2cd902018-05-16 15:04:57 -04001476 data->obj = obj; // Will be "released" (decref'ed) when data released.
1477 data->new_object = _new_str_object;
1478 data->free = PyMem_Free;
1479 return 0;
1480}
1481
1482static PyObject *
1483_new_long_object(_PyCrossInterpreterData *data)
1484{
Alexey Izbyshev16f842d2019-02-12 19:06:43 +03001485 return PyLong_FromSsize_t((Py_ssize_t)(data->data));
Eric Snow6d2cd902018-05-16 15:04:57 -04001486}
1487
1488static int
1489_long_shared(PyObject *obj, _PyCrossInterpreterData *data)
1490{
Alexey Izbyshev16f842d2019-02-12 19:06:43 +03001491 /* Note that this means the size of shareable ints is bounded by
1492 * sys.maxsize. Hence on 32-bit architectures that is half the
1493 * size of maximum shareable ints on 64-bit.
1494 */
1495 Py_ssize_t value = PyLong_AsSsize_t(obj);
Eric Snow6d2cd902018-05-16 15:04:57 -04001496 if (value == -1 && PyErr_Occurred()) {
1497 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1498 PyErr_SetString(PyExc_OverflowError, "try sending as bytes");
1499 }
1500 return -1;
1501 }
1502 data->data = (void *)value;
1503 data->obj = NULL;
1504 data->new_object = _new_long_object;
1505 data->free = NULL;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001506 return 0;
1507}
1508
1509static PyObject *
1510_new_none_object(_PyCrossInterpreterData *data)
1511{
1512 // XXX Singleton refcounts are problematic across interpreters...
1513 Py_INCREF(Py_None);
1514 return Py_None;
1515}
1516
1517static int
1518_none_shared(PyObject *obj, _PyCrossInterpreterData *data)
1519{
1520 data->data = NULL;
1521 // data->obj remains NULL
1522 data->new_object = _new_none_object;
1523 data->free = NULL; // There is nothing to free.
1524 return 0;
1525}
1526
1527static void
1528_register_builtins_for_crossinterpreter_data(void)
1529{
1530 // None
1531 if (_register_xidata((PyTypeObject *)PyObject_Type(Py_None), _none_shared) != 0) {
1532 Py_FatalError("could not register None for cross-interpreter sharing");
1533 }
1534
Eric Snow6d2cd902018-05-16 15:04:57 -04001535 // int
1536 if (_register_xidata(&PyLong_Type, _long_shared) != 0) {
1537 Py_FatalError("could not register int for cross-interpreter sharing");
1538 }
1539
Eric Snow7f8bfc92018-01-29 18:23:44 -07001540 // bytes
1541 if (_register_xidata(&PyBytes_Type, _bytes_shared) != 0) {
1542 Py_FatalError("could not register bytes for cross-interpreter sharing");
1543 }
Eric Snow6d2cd902018-05-16 15:04:57 -04001544
1545 // str
1546 if (_register_xidata(&PyUnicode_Type, _str_shared) != 0) {
1547 Py_FatalError("could not register str for cross-interpreter sharing");
1548 }
Eric Snow7f8bfc92018-01-29 18:23:44 -07001549}
1550
1551
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001552#ifdef __cplusplus
1553}
1554#endif