blob: d612d3a171b62088f6ea724c3ce116618dfd4c4e [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 Snowef4ac962019-02-24 15:40:47 -0800136 memset(interp, 0, sizeof(*interp));
Eric Snow4c6955e2018-02-16 18:53:40 -0700137 interp->id_refcount = -1;
Victor Stinnerd4341102017-11-23 00:12:09 +0100138 interp->check_interval = 100;
Eric Snowef4ac962019-02-24 15:40:47 -0800139
140 interp->ceval.pending.lock = PyThread_allocate_lock();
141 if (interp->ceval.pending.lock == NULL) {
142 PyErr_SetString(PyExc_RuntimeError,
143 "failed to create interpreter ceval pending mutex");
144 return NULL;
145 }
Victor Stinnerd4341102017-11-23 00:12:09 +0100146 interp->core_config = _PyCoreConfig_INIT;
147 interp->config = _PyMainInterpreterConfig_INIT;
Victor Stinnerd4341102017-11-23 00:12:09 +0100148 interp->eval_frame = _PyEval_EvalFrameDefault;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000149#ifdef HAVE_DLOPEN
Serhiy Storchakac2f7d872016-05-04 09:44:44 +0300150#if HAVE_DECL_RTLD_NOW
Victor Stinnerd4341102017-11-23 00:12:09 +0100151 interp->dlopenflags = RTLD_NOW;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000152#else
Victor Stinnerd4341102017-11-23 00:12:09 +0100153 interp->dlopenflags = RTLD_LAZY;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000154#endif
155#endif
Eric Snowef4ac962019-02-24 15:40:47 -0800156
157 if (_PyRuntime.main_thread == 0) {
158 _PyRuntime.main_thread = PyThread_get_thread_ident();
159 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000160
Victor Stinnerd4341102017-11-23 00:12:09 +0100161 HEAD_LOCK();
Victor Stinnerd4341102017-11-23 00:12:09 +0100162 if (_PyRuntime.interpreters.next_id < 0) {
163 /* overflow or Py_Initialize() not called! */
164 PyErr_SetString(PyExc_RuntimeError,
165 "failed to get an interpreter ID");
Pablo Galindo95d630e2018-08-31 22:49:29 +0100166 PyMem_RawFree(interp);
Victor Stinnerd4341102017-11-23 00:12:09 +0100167 interp = NULL;
168 } else {
169 interp->id = _PyRuntime.interpreters.next_id;
170 _PyRuntime.interpreters.next_id += 1;
Pablo Galindo95d630e2018-08-31 22:49:29 +0100171 interp->next = _PyRuntime.interpreters.head;
172 if (_PyRuntime.interpreters.main == NULL) {
173 _PyRuntime.interpreters.main = interp;
174 }
175 _PyRuntime.interpreters.head = interp;
Victor Stinnerd4341102017-11-23 00:12:09 +0100176 }
177 HEAD_UNLOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000178
Pablo Galindo95d630e2018-08-31 22:49:29 +0100179 if (interp == NULL) {
180 return NULL;
181 }
182
Yury Selivanovf23746a2018-01-22 19:11:18 -0500183 interp->tstate_next_unique_id = 0;
184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000185 return interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000186}
187
188
189void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000190PyInterpreterState_Clear(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000191{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000192 PyThreadState *p;
193 HEAD_LOCK();
194 for (p = interp->tstate_head; p != NULL; p = p->next)
195 PyThreadState_Clear(p);
196 HEAD_UNLOCK();
Victor Stinnerda273412017-12-15 01:46:02 +0100197 _PyCoreConfig_Clear(&interp->core_config);
198 _PyMainInterpreterConfig_Clear(&interp->config);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000199 Py_CLEAR(interp->codec_search_path);
200 Py_CLEAR(interp->codec_search_cache);
201 Py_CLEAR(interp->codec_error_registry);
Eric Snow93c92f72017-09-13 23:46:04 -0700202 Py_CLEAR(interp->modules);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000203 Py_CLEAR(interp->modules_by_index);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 Py_CLEAR(interp->sysdict);
205 Py_CLEAR(interp->builtins);
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200206 Py_CLEAR(interp->builtins_copy);
Brett Cannonfd074152012-04-14 14:10:13 -0400207 Py_CLEAR(interp->importlib);
Serhiy Storchaka133138a2016-08-02 22:51:21 +0300208 Py_CLEAR(interp->import_func);
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200209#ifdef HAVE_FORK
210 Py_CLEAR(interp->before_forkers);
211 Py_CLEAR(interp->after_forkers_parent);
212 Py_CLEAR(interp->after_forkers_child);
213#endif
Eric Snowef4ac962019-02-24 15:40:47 -0800214 // XXX Once we have one allocator per interpreter (i.e.
215 // per-interpreter GC) we must ensure that all of the interpreter's
216 // objects have been cleaned up at the point.
Guido van Rossum25ce5661997-08-02 03:10:38 +0000217}
218
219
220static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000221zapthreads(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000222{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 PyThreadState *p;
224 /* No need to lock the mutex here because this should only happen
225 when the threads are all really dead (XXX famous last words). */
226 while ((p = interp->tstate_head) != NULL) {
227 PyThreadState_Delete(p);
228 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000229}
230
231
232void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000233PyInterpreterState_Delete(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000234{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 PyInterpreterState **p;
236 zapthreads(interp);
237 HEAD_LOCK();
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600238 for (p = &_PyRuntime.interpreters.head; ; p = &(*p)->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 if (*p == NULL)
240 Py_FatalError(
241 "PyInterpreterState_Delete: invalid interp");
242 if (*p == interp)
243 break;
244 }
245 if (interp->tstate_head != NULL)
246 Py_FatalError("PyInterpreterState_Delete: remaining threads");
247 *p = interp->next;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600248 if (_PyRuntime.interpreters.main == interp) {
249 _PyRuntime.interpreters.main = NULL;
250 if (_PyRuntime.interpreters.head != NULL)
Eric Snow6b4be192017-05-22 21:36:03 -0700251 Py_FatalError("PyInterpreterState_Delete: remaining subinterpreters");
252 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000253 HEAD_UNLOCK();
Eric Snow4c6955e2018-02-16 18:53:40 -0700254 if (interp->id_mutex != NULL) {
255 PyThread_free_lock(interp->id_mutex);
256 }
Eric Snowef4ac962019-02-24 15:40:47 -0800257 if (interp->ceval.pending.lock != NULL) {
258 PyThread_free_lock(interp->ceval.pending.lock);
259 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200260 PyMem_RawFree(interp);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000261}
262
263
Eric Snow59032962018-09-14 14:17:20 -0700264/*
265 * Delete all interpreter states except the main interpreter. If there
266 * is a current interpreter state, it *must* be the main interpreter.
267 */
268void
269_PyInterpreterState_DeleteExceptMain()
270{
271 PyThreadState *tstate = PyThreadState_Swap(NULL);
272 if (tstate != NULL && tstate->interp != _PyRuntime.interpreters.main) {
273 Py_FatalError("PyInterpreterState_DeleteExceptMain: not main interpreter");
274 }
275
276 HEAD_LOCK();
277 PyInterpreterState *interp = _PyRuntime.interpreters.head;
278 _PyRuntime.interpreters.head = NULL;
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100279 while (interp != NULL) {
Eric Snow59032962018-09-14 14:17:20 -0700280 if (interp == _PyRuntime.interpreters.main) {
281 _PyRuntime.interpreters.main->next = NULL;
282 _PyRuntime.interpreters.head = interp;
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100283 interp = interp->next;
Eric Snow59032962018-09-14 14:17:20 -0700284 continue;
285 }
286
287 PyInterpreterState_Clear(interp); // XXX must activate?
288 zapthreads(interp);
289 if (interp->id_mutex != NULL) {
290 PyThread_free_lock(interp->id_mutex);
291 }
Stéphane Wirtelb5409da2019-02-20 15:27:22 +0100292 PyInterpreterState *prev_interp = interp;
293 interp = interp->next;
294 PyMem_RawFree(prev_interp);
Eric Snow59032962018-09-14 14:17:20 -0700295 }
296 HEAD_UNLOCK();
297
298 if (_PyRuntime.interpreters.head == NULL) {
299 Py_FatalError("PyInterpreterState_DeleteExceptMain: missing main");
300 }
301 PyThreadState_Swap(tstate);
302}
303
304
Victor Stinnercaba55b2018-08-03 15:33:52 +0200305PyInterpreterState *
306_PyInterpreterState_Get(void)
307{
Victor Stinner50b48572018-11-01 01:51:40 +0100308 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinnercaba55b2018-08-03 15:33:52 +0200309 if (tstate == NULL) {
310 Py_FatalError("_PyInterpreterState_Get(): no current thread state");
311 }
312 PyInterpreterState *interp = tstate->interp;
313 if (interp == NULL) {
314 Py_FatalError("_PyInterpreterState_Get(): no current interpreter");
315 }
316 return interp;
317}
318
319
Eric Snowe3774162017-05-22 19:46:40 -0700320int64_t
321PyInterpreterState_GetID(PyInterpreterState *interp)
322{
323 if (interp == NULL) {
324 PyErr_SetString(PyExc_RuntimeError, "no interpreter provided");
325 return -1;
326 }
327 return interp->id;
328}
329
330
Eric Snowb05b7112019-03-01 12:35:10 -0700331static PyInterpreterState *
332interp_look_up_id(PY_INT64_T requested_id)
Eric Snow7f8bfc92018-01-29 18:23:44 -0700333{
Eric Snow7f8bfc92018-01-29 18:23:44 -0700334 PyInterpreterState *interp = PyInterpreterState_Head();
335 while (interp != NULL) {
336 PY_INT64_T id = PyInterpreterState_GetID(interp);
Eric Snowb05b7112019-03-01 12:35:10 -0700337 if (id < 0) {
Eric Snow7f8bfc92018-01-29 18:23:44 -0700338 return NULL;
Eric Snowb05b7112019-03-01 12:35:10 -0700339 }
340 if (requested_id == id) {
Eric Snow7f8bfc92018-01-29 18:23:44 -0700341 return interp;
Eric Snowb05b7112019-03-01 12:35:10 -0700342 }
Eric Snow7f8bfc92018-01-29 18:23:44 -0700343 interp = PyInterpreterState_Next(interp);
344 }
Eric Snow7f8bfc92018-01-29 18:23:44 -0700345 return NULL;
346}
347
Eric Snowb05b7112019-03-01 12:35:10 -0700348PyInterpreterState *
349_PyInterpreterState_LookUpID(PY_INT64_T requested_id)
350{
351 PyInterpreterState *interp = NULL;
352 if (requested_id >= 0) {
353 HEAD_UNLOCK();
354 interp = interp_look_up_id(requested_id);
355 HEAD_UNLOCK();
356 }
357 if (interp == NULL && !PyErr_Occurred()) {
358 PyErr_Format(PyExc_RuntimeError,
359 "unrecognized interpreter ID %lld", requested_id);
360 }
361 return interp;
362}
363
Eric Snow4c6955e2018-02-16 18:53:40 -0700364
365int
366_PyInterpreterState_IDInitref(PyInterpreterState *interp)
367{
368 if (interp->id_mutex != NULL) {
369 return 0;
370 }
371 interp->id_mutex = PyThread_allocate_lock();
372 if (interp->id_mutex == NULL) {
373 PyErr_SetString(PyExc_RuntimeError,
374 "failed to create init interpreter ID mutex");
375 return -1;
376 }
377 interp->id_refcount = 0;
378 return 0;
379}
380
381
382void
383_PyInterpreterState_IDIncref(PyInterpreterState *interp)
384{
385 if (interp->id_mutex == NULL) {
386 return;
387 }
388 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
389 interp->id_refcount += 1;
390 PyThread_release_lock(interp->id_mutex);
391}
392
393
394void
395_PyInterpreterState_IDDecref(PyInterpreterState *interp)
396{
397 if (interp->id_mutex == NULL) {
398 return;
399 }
400 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
401 assert(interp->id_refcount != 0);
402 interp->id_refcount -= 1;
403 int64_t refcount = interp->id_refcount;
404 PyThread_release_lock(interp->id_mutex);
405
406 if (refcount == 0) {
Eric Snowf53d9f22018-02-20 16:30:17 -0700407 // XXX Using the "head" thread isn't strictly correct.
408 PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
409 // XXX Possible GILState issues?
410 PyThreadState *save_tstate = PyThreadState_Swap(tstate);
Eric Snow4c6955e2018-02-16 18:53:40 -0700411 Py_EndInterpreter(tstate);
412 PyThreadState_Swap(save_tstate);
413 }
414}
415
Eric Snowbe3b2952019-02-23 11:35:52 -0700416_PyCoreConfig *
417_PyInterpreterState_GetCoreConfig(PyInterpreterState *interp)
418{
419 return &interp->core_config;
420}
421
422_PyMainInterpreterConfig *
423_PyInterpreterState_GetMainConfig(PyInterpreterState *interp)
424{
425 return &interp->config;
426}
Eric Snow4c6955e2018-02-16 18:53:40 -0700427
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000428/* Default implementation for _PyThreadState_GetFrame */
429static struct _frame *
430threadstate_getframe(PyThreadState *self)
431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 return self->frame;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000433}
434
Victor Stinner45b9be52010-03-03 23:28:07 +0000435static PyThreadState *
436new_threadstate(PyInterpreterState *interp, int init)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000437{
Victor Stinner1a7425f2013-07-07 16:25:15 +0200438 PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState));
Tim Peters84705582004-10-10 02:47:33 +0000439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000440 if (_PyThreadState_GetFrame == NULL)
441 _PyThreadState_GetFrame = threadstate_getframe;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 if (tstate != NULL) {
444 tstate->interp = interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000446 tstate->frame = NULL;
447 tstate->recursion_depth = 0;
448 tstate->overflowed = 0;
449 tstate->recursion_critical = 0;
pdox18967932017-10-25 23:03:01 -0700450 tstate->stackcheck_counter = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 tstate->tracing = 0;
452 tstate->use_tracing = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 tstate->gilstate_counter = 0;
454 tstate->async_exc = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 tstate->thread_id = PyThread_get_thread_ident();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 tstate->dict = NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 tstate->curexc_type = NULL;
460 tstate->curexc_value = NULL;
461 tstate->curexc_traceback = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000462
Mark Shannonae3087c2017-10-22 22:41:51 +0100463 tstate->exc_state.exc_type = NULL;
464 tstate->exc_state.exc_value = NULL;
465 tstate->exc_state.exc_traceback = NULL;
466 tstate->exc_state.previous_item = NULL;
467 tstate->exc_info = &tstate->exc_state;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 tstate->c_profilefunc = NULL;
470 tstate->c_tracefunc = NULL;
471 tstate->c_profileobj = NULL;
472 tstate->c_traceobj = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000473
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200474 tstate->trash_delete_nesting = 0;
475 tstate->trash_delete_later = NULL;
Antoine Pitrou7b476992013-09-07 23:38:37 +0200476 tstate->on_delete = NULL;
477 tstate->on_delete_data = NULL;
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200478
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -0800479 tstate->coroutine_origin_tracking_depth = 0;
480
Yury Selivanov75445082015-05-11 22:57:16 -0400481 tstate->coroutine_wrapper = NULL;
Yury Selivanovaab3c4a2015-06-02 18:43:51 -0400482 tstate->in_coroutine_wrapper = 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400483
Yury Selivanoveb636452016-09-08 22:01:51 -0700484 tstate->async_gen_firstiter = NULL;
485 tstate->async_gen_finalizer = NULL;
486
Yury Selivanovf23746a2018-01-22 19:11:18 -0500487 tstate->context = NULL;
488 tstate->context_ver = 1;
489
490 tstate->id = ++interp->tstate_next_unique_id;
491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 if (init)
493 _PyThreadState_Init(tstate);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200496 tstate->prev = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 tstate->next = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200498 if (tstate->next)
499 tstate->next->prev = tstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000500 interp->tstate_head = tstate;
501 HEAD_UNLOCK();
502 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000505}
506
Victor Stinner45b9be52010-03-03 23:28:07 +0000507PyThreadState *
508PyThreadState_New(PyInterpreterState *interp)
509{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 return new_threadstate(interp, 1);
Victor Stinner45b9be52010-03-03 23:28:07 +0000511}
512
513PyThreadState *
514_PyThreadState_Prealloc(PyInterpreterState *interp)
515{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 return new_threadstate(interp, 0);
Victor Stinner45b9be52010-03-03 23:28:07 +0000517}
518
519void
520_PyThreadState_Init(PyThreadState *tstate)
521{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 _PyGILState_NoteThreadState(tstate);
Victor Stinner45b9be52010-03-03 23:28:07 +0000523}
524
Martin v. Löwis1a214512008-06-11 05:26:20 +0000525PyObject*
Martin v. Löwis7800f752012-06-22 12:20:55 +0200526PyState_FindModule(struct PyModuleDef* module)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000527{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200528 Py_ssize_t index = module->m_base.m_index;
Victor Stinner9204fb82018-10-30 15:13:17 +0100529 PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 PyObject *res;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000531 if (module->m_slots) {
532 return NULL;
533 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 if (index == 0)
535 return NULL;
536 if (state->modules_by_index == NULL)
537 return NULL;
Antoine Pitrou75506e82012-08-20 19:30:46 +0200538 if (index >= PyList_GET_SIZE(state->modules_by_index))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 return NULL;
540 res = PyList_GET_ITEM(state->modules_by_index, index);
541 return res==Py_None ? NULL : res;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000542}
543
544int
545_PyState_AddModule(PyObject* module, struct PyModuleDef* def)
546{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000547 PyInterpreterState *state;
Berker Peksag4b7b5652016-08-22 18:05:56 +0300548 if (!def) {
549 assert(PyErr_Occurred());
550 return -1;
551 }
Nick Coghland5cacbb2015-05-23 22:24:10 +1000552 if (def->m_slots) {
553 PyErr_SetString(PyExc_SystemError,
554 "PyState_AddModule called on module with slots");
555 return -1;
556 }
Victor Stinner9204fb82018-10-30 15:13:17 +0100557 state = _PyInterpreterState_GET_UNSAFE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 if (!state->modules_by_index) {
559 state->modules_by_index = PyList_New(0);
560 if (!state->modules_by_index)
561 return -1;
562 }
563 while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
564 if (PyList_Append(state->modules_by_index, Py_None) < 0)
565 return -1;
566 Py_INCREF(module);
567 return PyList_SetItem(state->modules_by_index,
568 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000569}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000570
Martin v. Löwis7800f752012-06-22 12:20:55 +0200571int
572PyState_AddModule(PyObject* module, struct PyModuleDef* def)
573{
574 Py_ssize_t index;
Victor Stinner9204fb82018-10-30 15:13:17 +0100575 PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200576 if (!def) {
577 Py_FatalError("PyState_AddModule: Module Definition is NULL");
578 return -1;
579 }
580 index = def->m_base.m_index;
581 if (state->modules_by_index) {
582 if(PyList_GET_SIZE(state->modules_by_index) >= index) {
583 if(module == PyList_GET_ITEM(state->modules_by_index, index)) {
584 Py_FatalError("PyState_AddModule: Module already added!");
585 return -1;
586 }
587 }
588 }
589 return _PyState_AddModule(module, def);
590}
591
592int
593PyState_RemoveModule(struct PyModuleDef* def)
594{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000595 PyInterpreterState *state;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200596 Py_ssize_t index = def->m_base.m_index;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000597 if (def->m_slots) {
598 PyErr_SetString(PyExc_SystemError,
599 "PyState_RemoveModule called on module with slots");
600 return -1;
601 }
Victor Stinner9204fb82018-10-30 15:13:17 +0100602 state = _PyInterpreterState_GET_UNSAFE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200603 if (index == 0) {
604 Py_FatalError("PyState_RemoveModule: Module index invalid.");
605 return -1;
606 }
607 if (state->modules_by_index == NULL) {
608 Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible.");
609 return -1;
610 }
611 if (index > PyList_GET_SIZE(state->modules_by_index)) {
612 Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
613 return -1;
614 }
Zackery Spytz2a893432018-12-05 00:14:00 -0700615 Py_INCREF(Py_None);
Martin v. Löwis7800f752012-06-22 12:20:55 +0200616 return PyList_SetItem(state->modules_by_index, index, Py_None);
617}
618
Antoine Pitrou40322e62013-08-11 00:30:09 +0200619/* used by import.c:PyImport_Cleanup */
620void
621_PyState_ClearModules(void)
622{
Victor Stinner9204fb82018-10-30 15:13:17 +0100623 PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE();
Antoine Pitrou40322e62013-08-11 00:30:09 +0200624 if (state->modules_by_index) {
625 Py_ssize_t i;
626 for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) {
627 PyObject *m = PyList_GET_ITEM(state->modules_by_index, i);
628 if (PyModule_Check(m)) {
629 /* cleanup the saved copy of module dicts */
630 PyModuleDef *md = PyModule_GetDef(m);
631 if (md)
632 Py_CLEAR(md->m_base.m_copy);
633 }
634 }
635 /* Setting modules_by_index to NULL could be dangerous, so we
636 clear the list instead. */
637 if (PyList_SetSlice(state->modules_by_index,
638 0, PyList_GET_SIZE(state->modules_by_index),
639 NULL))
640 PyErr_WriteUnraisable(state->modules_by_index);
641 }
642}
643
Guido van Rossuma027efa1997-05-05 20:56:21 +0000644void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000645PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000646{
Victor Stinner53b7d4e2018-07-25 01:37:05 +0200647 int verbose = tstate->interp->core_config.verbose;
648
649 if (verbose && tstate->frame != NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 fprintf(stderr,
651 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 Py_CLEAR(tstate->frame);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 Py_CLEAR(tstate->dict);
656 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 Py_CLEAR(tstate->curexc_type);
659 Py_CLEAR(tstate->curexc_value);
660 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000661
Mark Shannonae3087c2017-10-22 22:41:51 +0100662 Py_CLEAR(tstate->exc_state.exc_type);
663 Py_CLEAR(tstate->exc_state.exc_value);
664 Py_CLEAR(tstate->exc_state.exc_traceback);
Serhiy Storchakabdf42982017-10-26 16:59:40 +0300665
Mark Shannonae3087c2017-10-22 22:41:51 +0100666 /* The stack of exception states should contain just this thread. */
Victor Stinner53b7d4e2018-07-25 01:37:05 +0200667 if (verbose && tstate->exc_info != &tstate->exc_state) {
Mark Shannonae3087c2017-10-22 22:41:51 +0100668 fprintf(stderr,
669 "PyThreadState_Clear: warning: thread still has a generator\n");
670 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 tstate->c_profilefunc = NULL;
673 tstate->c_tracefunc = NULL;
674 Py_CLEAR(tstate->c_profileobj);
675 Py_CLEAR(tstate->c_traceobj);
Yury Selivanov75445082015-05-11 22:57:16 -0400676
677 Py_CLEAR(tstate->coroutine_wrapper);
Yury Selivanoveb636452016-09-08 22:01:51 -0700678 Py_CLEAR(tstate->async_gen_firstiter);
679 Py_CLEAR(tstate->async_gen_finalizer);
Yury Selivanovf23746a2018-01-22 19:11:18 -0500680
681 Py_CLEAR(tstate->context);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000682}
683
684
Guido van Rossum29757862001-01-23 01:46:06 +0000685/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
686static void
687tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000688{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 PyInterpreterState *interp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 if (tstate == NULL)
691 Py_FatalError("PyThreadState_Delete: NULL tstate");
692 interp = tstate->interp;
693 if (interp == NULL)
694 Py_FatalError("PyThreadState_Delete: NULL interp");
695 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200696 if (tstate->prev)
697 tstate->prev->next = tstate->next;
698 else
699 interp->tstate_head = tstate->next;
700 if (tstate->next)
701 tstate->next->prev = tstate->prev;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 HEAD_UNLOCK();
Antoine Pitrou7b476992013-09-07 23:38:37 +0200703 if (tstate->on_delete != NULL) {
704 tstate->on_delete(tstate->on_delete_data);
705 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200706 PyMem_RawFree(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000707}
708
709
Guido van Rossum29757862001-01-23 01:46:06 +0000710void
711PyThreadState_Delete(PyThreadState *tstate)
712{
Victor Stinner50b48572018-11-01 01:51:40 +0100713 if (tstate == _PyThreadState_GET())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 Py_FatalError("PyThreadState_Delete: tstate is still current");
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600715 if (_PyRuntime.gilstate.autoInterpreterState &&
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900716 PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == tstate)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600717 {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900718 PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, NULL);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600719 }
Christian Heimesb9dbc7d2013-07-01 23:42:28 +0200720 tstate_delete_common(tstate);
Guido van Rossum29757862001-01-23 01:46:06 +0000721}
722
723
Guido van Rossum29757862001-01-23 01:46:06 +0000724void
725PyThreadState_DeleteCurrent()
726{
Victor Stinner50b48572018-11-01 01:51:40 +0100727 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 if (tstate == NULL)
729 Py_FatalError(
730 "PyThreadState_DeleteCurrent: no current tstate");
Victor Stinner8a1be612016-03-14 22:07:55 +0100731 tstate_delete_common(tstate);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600732 if (_PyRuntime.gilstate.autoInterpreterState &&
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900733 PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == tstate)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600734 {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900735 PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, NULL);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600736 }
Victor Stinner9204fb82018-10-30 15:13:17 +0100737 _PyThreadState_SET(NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000738 PyEval_ReleaseLock();
Guido van Rossum29757862001-01-23 01:46:06 +0000739}
Guido van Rossum29757862001-01-23 01:46:06 +0000740
741
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200742/*
743 * Delete all thread states except the one passed as argument.
744 * Note that, if there is a current thread state, it *must* be the one
745 * passed as argument. Also, this won't touch any other interpreters
746 * than the current one, since we don't know which thread state should
747 * be kept in those other interpreteres.
748 */
749void
750_PyThreadState_DeleteExcept(PyThreadState *tstate)
751{
752 PyInterpreterState *interp = tstate->interp;
753 PyThreadState *p, *next, *garbage;
754 HEAD_LOCK();
755 /* Remove all thread states, except tstate, from the linked list of
756 thread states. This will allow calling PyThreadState_Clear()
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200757 without holding the lock. */
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200758 garbage = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200759 if (garbage == tstate)
760 garbage = tstate->next;
761 if (tstate->prev)
762 tstate->prev->next = tstate->next;
763 if (tstate->next)
764 tstate->next->prev = tstate->prev;
765 tstate->prev = tstate->next = NULL;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200766 interp->tstate_head = tstate;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200767 HEAD_UNLOCK();
768 /* Clear and deallocate all stale thread states. Even if this
769 executes Python code, we should be safe since it executes
770 in the current thread, not one of the stale threads. */
771 for (p = garbage; p; p = next) {
772 next = p->next;
773 PyThreadState_Clear(p);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200774 PyMem_RawFree(p);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200775 }
776}
777
778
Guido van Rossuma027efa1997-05-05 20:56:21 +0000779PyThreadState *
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100780_PyThreadState_UncheckedGet(void)
781{
Victor Stinner50b48572018-11-01 01:51:40 +0100782 return _PyThreadState_GET();
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100783}
784
785
786PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000787PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000788{
Victor Stinner50b48572018-11-01 01:51:40 +0100789 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 if (tstate == NULL)
791 Py_FatalError("PyThreadState_Get: no current thread");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000794}
795
796
797PyThreadState *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000798PyThreadState_Swap(PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000799{
Victor Stinner50b48572018-11-01 01:51:40 +0100800 PyThreadState *oldts = _PyThreadState_GET();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000801
Victor Stinner9204fb82018-10-30 15:13:17 +0100802 _PyThreadState_SET(newts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 /* It should not be possible for more than one thread state
804 to be used for a thread. Check this the best we can in debug
805 builds.
806 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200807#if defined(Py_DEBUG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 if (newts) {
809 /* This can be called from PyEval_RestoreThread(). Similar
810 to it, we need to ensure errno doesn't change.
811 */
812 int err = errno;
813 PyThreadState *check = PyGILState_GetThisThreadState();
814 if (check && check->interp == newts->interp && check != newts)
815 Py_FatalError("Invalid thread state for this thread");
816 errno = err;
817 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000818#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000820}
Guido van Rossumede04391998-04-10 20:18:25 +0000821
822/* An extension mechanism to store arbitrary additional per-thread state.
823 PyThreadState_GetDict() returns a dictionary that can be used to hold such
824 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +0000825 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
826 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +0000827
828PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000829PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000830{
Victor Stinner50b48572018-11-01 01:51:40 +0100831 PyThreadState *tstate = _PyThreadState_GET();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 if (tstate == NULL)
833 return NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 if (tstate->dict == NULL) {
836 PyObject *d;
837 tstate->dict = d = PyDict_New();
838 if (d == NULL)
839 PyErr_Clear();
840 }
841 return tstate->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000842}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000843
844
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000845/* Asynchronously raise an exception in a thread.
846 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +0000847 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000848 to call this, or use ctypes. Must be called with the GIL held.
849 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
850 match any known thread id). Can be called with exc=NULL to clear an
851 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000852
853int
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200854PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc)
855{
Victor Stinner9204fb82018-10-30 15:13:17 +0100856 PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 PyThreadState *p;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 /* Although the GIL is held, a few C API functions can be called
860 * without the GIL held, and in particular some that create and
861 * destroy thread and interpreter states. Those can mutate the
862 * list of thread states we're traversing, so to prevent that we lock
863 * head_mutex for the duration.
864 */
865 HEAD_LOCK();
866 for (p = interp->tstate_head; p != NULL; p = p->next) {
867 if (p->thread_id == id) {
868 /* Tricky: we need to decref the current value
869 * (if any) in p->async_exc, but that can in turn
870 * allow arbitrary Python code to run, including
871 * perhaps calls to this function. To prevent
872 * deadlock, we need to release head_mutex before
873 * the decref.
874 */
875 PyObject *old_exc = p->async_exc;
876 Py_XINCREF(exc);
877 p->async_exc = exc;
878 HEAD_UNLOCK();
879 Py_XDECREF(old_exc);
Eric Snowef4ac962019-02-24 15:40:47 -0800880 _PyEval_SignalAsyncExc(interp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 return 1;
882 }
883 }
884 HEAD_UNLOCK();
885 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000886}
887
888
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000889/* Routines for advanced debuggers, requested by David Beazley.
890 Don't use unless you know what you are doing! */
891
892PyInterpreterState *
893PyInterpreterState_Head(void)
894{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600895 return _PyRuntime.interpreters.head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000896}
897
898PyInterpreterState *
Eric Snow6b4be192017-05-22 21:36:03 -0700899PyInterpreterState_Main(void)
900{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600901 return _PyRuntime.interpreters.main;
Eric Snow6b4be192017-05-22 21:36:03 -0700902}
903
904PyInterpreterState *
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000905PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000907}
908
909PyThreadState *
910PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000912}
913
914PyThreadState *
915PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000917}
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000918
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000919/* The implementation of sys._current_frames(). This is intended to be
920 called with the GIL held, as it will be when called via
921 sys._current_frames(). It's possible it would work fine even without
922 the GIL held, but haven't thought enough about that.
923*/
924PyObject *
925_PyThread_CurrentFrames(void)
926{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 PyObject *result;
928 PyInterpreterState *i;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 result = PyDict_New();
931 if (result == NULL)
932 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 /* for i in all interpreters:
935 * for t in all of i's thread states:
936 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +0200937 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 * need to grab head_mutex for the duration.
939 */
940 HEAD_LOCK();
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600941 for (i = _PyRuntime.interpreters.head; i != NULL; i = i->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 PyThreadState *t;
943 for (t = i->tstate_head; t != NULL; t = t->next) {
944 PyObject *id;
945 int stat;
946 struct _frame *frame = t->frame;
947 if (frame == NULL)
948 continue;
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200949 id = PyLong_FromUnsignedLong(t->thread_id);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 if (id == NULL)
951 goto Fail;
952 stat = PyDict_SetItem(result, id, (PyObject *)frame);
953 Py_DECREF(id);
954 if (stat < 0)
955 goto Fail;
956 }
957 }
958 HEAD_UNLOCK();
959 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000960
961 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 HEAD_UNLOCK();
963 Py_DECREF(result);
964 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000965}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000966
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000967/* Python "auto thread state" API. */
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000968
969/* Keep this as a static, as it is not reliable! It can only
970 ever be compared to the state for the *current* thread.
971 * If not equal, then it doesn't matter that the actual
972 value may change immediately after comparison, as it can't
973 possibly change to the current thread's state.
974 * If equal, then the current thread holds the lock, so the value can't
975 change until we yield the lock.
976*/
977static int
978PyThreadState_IsCurrent(PyThreadState *tstate)
979{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 /* Must be the tstate for this thread */
981 assert(PyGILState_GetThisThreadState()==tstate);
Victor Stinner50b48572018-11-01 01:51:40 +0100982 return tstate == _PyThreadState_GET();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000983}
984
Tim Peters4c1f5ec2004-10-09 17:25:05 +0000985/* Internal initialization/finalization functions called by
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000986 Py_Initialize/Py_FinalizeEx
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000987*/
Tim Peters19717fa2004-10-09 17:38:29 +0000988void
989_PyGILState_Init(PyInterpreterState *i, PyThreadState *t)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000990{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991 assert(i && t); /* must init with valid states */
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900992 if (PyThread_tss_create(&_PyRuntime.gilstate.autoTSSkey) != 0) {
993 Py_FatalError("Could not allocate TSS entry");
994 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600995 _PyRuntime.gilstate.autoInterpreterState = i;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900996 assert(PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 assert(t->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000998
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 _PyGILState_NoteThreadState(t);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001000}
1001
Victor Stinner861d9ab2016-03-16 22:45:24 +01001002PyInterpreterState *
1003_PyGILState_GetInterpreterStateUnsafe(void)
1004{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001005 return _PyRuntime.gilstate.autoInterpreterState;
Victor Stinner861d9ab2016-03-16 22:45:24 +01001006}
1007
Tim Peters19717fa2004-10-09 17:38:29 +00001008void
1009_PyGILState_Fini(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001010{
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001011 PyThread_tss_delete(&_PyRuntime.gilstate.autoTSSkey);
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001012 _PyRuntime.gilstate.autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001013}
1014
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001015/* Reset the TSS key - called by PyOS_AfterFork_Child().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001016 * This should not be necessary, but some - buggy - pthread implementations
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001017 * don't reset TSS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001018 */
1019void
1020_PyGILState_Reinit(void)
1021{
Victor Stinner5d926472018-03-06 14:31:37 +01001022 /* Force default allocator, since _PyRuntimeState_Fini() must
1023 use the same allocator than this function. */
1024 PyMemAllocatorEx old_alloc;
1025 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
1026
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001027 _PyRuntime.interpreters.mutex = PyThread_allocate_lock();
Victor Stinner5d926472018-03-06 14:31:37 +01001028
1029 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
1030
1031 if (_PyRuntime.interpreters.mutex == NULL) {
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001032 Py_FatalError("Can't initialize threads for interpreter");
Victor Stinner5d926472018-03-06 14:31:37 +01001033 }
1034
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001035 PyThreadState *tstate = PyGILState_GetThisThreadState();
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001036 PyThread_tss_delete(&_PyRuntime.gilstate.autoTSSkey);
1037 if (PyThread_tss_create(&_PyRuntime.gilstate.autoTSSkey) != 0) {
1038 Py_FatalError("Could not allocate TSS entry");
1039 }
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001040
Charles-François Natalia233df82011-11-22 19:49:51 +01001041 /* If the thread had an associated auto thread state, reassociate it with
1042 * the new key. */
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001043 if (tstate &&
1044 PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, (void *)tstate) != 0)
1045 {
1046 Py_FatalError("Couldn't create autoTSSkey mapping");
1047 }
Antoine Pitrou0c759fe2011-04-27 19:28:05 +02001048}
1049
Michael W. Hudson188d4362005-06-20 16:52:57 +00001050/* When a thread state is created for a thread by some mechanism other than
1051 PyGILState_Ensure, it's important that the GILState machinery knows about
1052 it so it doesn't try to create another thread state for the thread (this is
1053 a better fix for SF bug #1010677 than the first one attempted).
1054*/
Thomas Wouters89f507f2006-12-13 04:49:30 +00001055static void
Michael W. Hudson188d4362005-06-20 16:52:57 +00001056_PyGILState_NoteThreadState(PyThreadState* tstate)
1057{
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001058 /* If autoTSSkey isn't initialized, this must be the very first
Antoine Pitrou079ce542010-09-08 12:37:10 +00001059 threadstate created in Py_Initialize(). Don't do anything for now
1060 (we'll be back here when _PyGILState_Init is called). */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001061 if (!_PyRuntime.gilstate.autoInterpreterState)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 return;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001063
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001064 /* Stick the thread state for this thread in thread specific storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +00001065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 The only situation where you can legitimately have more than one
1067 thread state for an OS level thread is when there are multiple
Victor Stinner590cebe2013-12-13 11:08:56 +01001068 interpreters.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001069
Victor Stinner590cebe2013-12-13 11:08:56 +01001070 You shouldn't really be using the PyGILState_ APIs anyway (see issues
1071 #10915 and #15751).
Michael W. Hudson188d4362005-06-20 16:52:57 +00001072
Victor Stinner590cebe2013-12-13 11:08:56 +01001073 The first thread state created for that given OS level thread will
1074 "win", which seems reasonable behaviour.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 */
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001076 if (PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == NULL) {
1077 if ((PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, (void *)tstate)
1078 ) != 0)
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001079 {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001080 Py_FatalError("Couldn't create autoTSSkey mapping");
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001081 }
Victor Stinner590cebe2013-12-13 11:08:56 +01001082 }
Michael W. Hudson188d4362005-06-20 16:52:57 +00001083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 /* PyGILState_Release must not try to delete this thread state. */
1085 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +00001086}
1087
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001088/* The public functions */
Tim Peters19717fa2004-10-09 17:38:29 +00001089PyThreadState *
1090PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001091{
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001092 if (_PyRuntime.gilstate.autoInterpreterState == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001093 return NULL;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001094 return (PyThreadState *)PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey);
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001095}
1096
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -07001097int
1098PyGILState_Check(void)
1099{
Victor Stinner8a1be612016-03-14 22:07:55 +01001100 PyThreadState *tstate;
1101
1102 if (!_PyGILState_check_enabled)
1103 return 1;
1104
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001105 if (!PyThread_tss_is_created(&_PyRuntime.gilstate.autoTSSkey)) {
Victor Stinner8a1be612016-03-14 22:07:55 +01001106 return 1;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001107 }
Victor Stinner8a1be612016-03-14 22:07:55 +01001108
Victor Stinner50b48572018-11-01 01:51:40 +01001109 tstate = _PyThreadState_GET();
Victor Stinner8a1be612016-03-14 22:07:55 +01001110 if (tstate == NULL)
1111 return 0;
1112
1113 return (tstate == PyGILState_GetThisThreadState());
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -07001114}
1115
Tim Peters19717fa2004-10-09 17:38:29 +00001116PyGILState_STATE
1117PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001118{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 int current;
1120 PyThreadState *tcur;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001121 int need_init_threads = 0;
1122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001123 /* Note that we do not auto-init Python here - apart from
1124 potential races with 2 threads auto-initializing, pep-311
1125 spells out other issues. Embedders are expected to have
1126 called Py_Initialize() and usually PyEval_InitThreads().
1127 */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001128 /* Py_Initialize() hasn't been called! */
1129 assert(_PyRuntime.gilstate.autoInterpreterState);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001130
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001131 tcur = (PyThreadState *)PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 if (tcur == NULL) {
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001133 need_init_threads = 1;
Victor Stinner62ca1002013-12-13 01:46:43 +01001134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 /* Create a new thread state for this thread */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001136 tcur = PyThreadState_New(_PyRuntime.gilstate.autoInterpreterState);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 if (tcur == NULL)
1138 Py_FatalError("Couldn't create thread-state for new thread");
1139 /* This is our thread state! We'll need to delete it in the
1140 matching call to PyGILState_Release(). */
1141 tcur->gilstate_counter = 0;
1142 current = 0; /* new thread state is never current */
1143 }
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001144 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 current = PyThreadState_IsCurrent(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001146 }
1147
1148 if (current == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 PyEval_RestoreThread(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001150 }
1151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 /* Update our counter in the thread-state - no need for locks:
1153 - tcur will remain valid as we hold the GIL.
1154 - the counter is safe as we are the only thread "allowed"
1155 to modify this value
1156 */
1157 ++tcur->gilstate_counter;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001158
1159 if (need_init_threads) {
1160 /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is
1161 called from a new thread for the first time, we need the create the
1162 GIL. */
1163 PyEval_InitThreads();
1164 }
1165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001167}
1168
Tim Peters19717fa2004-10-09 17:38:29 +00001169void
1170PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001171{
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001172 PyThreadState *tcur = (PyThreadState *)PyThread_tss_get(
1173 &_PyRuntime.gilstate.autoTSSkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 if (tcur == NULL)
1175 Py_FatalError("auto-releasing thread-state, "
1176 "but no thread-state for this thread");
1177 /* We must hold the GIL and have our thread state current */
1178 /* XXX - remove the check - the assert should be fine,
1179 but while this is very new (April 2003), the extra check
1180 by release-only users can't hurt.
1181 */
1182 if (! PyThreadState_IsCurrent(tcur))
1183 Py_FatalError("This thread state must be current when releasing");
1184 assert(PyThreadState_IsCurrent(tcur));
1185 --tcur->gilstate_counter;
1186 assert(tcur->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 /* If we're going to destroy this thread-state, we must
1189 * clear it while the GIL is held, as destructors may run.
1190 */
1191 if (tcur->gilstate_counter == 0) {
1192 /* can't have been locked when we created it */
1193 assert(oldstate == PyGILState_UNLOCKED);
1194 PyThreadState_Clear(tcur);
1195 /* Delete the thread-state. Note this releases the GIL too!
1196 * It's vital that the GIL be held here, to avoid shutdown
1197 * races; see bugs 225673 and 1061968 (that nasty bug has a
1198 * habit of coming back).
1199 */
1200 PyThreadState_DeleteCurrent();
1201 }
1202 /* Release the lock if necessary */
1203 else if (oldstate == PyGILState_UNLOCKED)
1204 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001205}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001206
Benjamin Peterson3bf01752012-04-13 18:06:36 -04001207
Eric Snow7f8bfc92018-01-29 18:23:44 -07001208/**************************/
1209/* cross-interpreter data */
1210/**************************/
1211
1212/* cross-interpreter data */
1213
1214crossinterpdatafunc _PyCrossInterpreterData_Lookup(PyObject *);
1215
1216/* This is a separate func from _PyCrossInterpreterData_Lookup in order
1217 to keep the registry code separate. */
1218static crossinterpdatafunc
1219_lookup_getdata(PyObject *obj)
1220{
1221 crossinterpdatafunc getdata = _PyCrossInterpreterData_Lookup(obj);
1222 if (getdata == NULL && PyErr_Occurred() == 0)
1223 PyErr_Format(PyExc_ValueError,
1224 "%S does not support cross-interpreter data", obj);
1225 return getdata;
1226}
1227
1228int
1229_PyObject_CheckCrossInterpreterData(PyObject *obj)
1230{
1231 crossinterpdatafunc getdata = _lookup_getdata(obj);
1232 if (getdata == NULL) {
1233 return -1;
1234 }
1235 return 0;
1236}
1237
1238static int
1239_check_xidata(_PyCrossInterpreterData *data)
1240{
1241 // data->data can be anything, including NULL, so we don't check it.
1242
1243 // data->obj may be NULL, so we don't check it.
1244
1245 if (data->interp < 0) {
1246 PyErr_SetString(PyExc_SystemError, "missing interp");
1247 return -1;
1248 }
1249
1250 if (data->new_object == NULL) {
1251 PyErr_SetString(PyExc_SystemError, "missing new_object func");
1252 return -1;
1253 }
1254
1255 // data->free may be NULL, so we don't check it.
1256
1257 return 0;
1258}
1259
1260int
1261_PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data)
1262{
Victor Stinnercaba55b2018-08-03 15:33:52 +02001263 // _PyInterpreterState_Get() aborts if lookup fails, so we don't need
Eric Snow7f8bfc92018-01-29 18:23:44 -07001264 // to check the result for NULL.
Victor Stinnercaba55b2018-08-03 15:33:52 +02001265 PyInterpreterState *interp = _PyInterpreterState_Get();
Eric Snow7f8bfc92018-01-29 18:23:44 -07001266
1267 // Reset data before re-populating.
1268 *data = (_PyCrossInterpreterData){0};
1269 data->free = PyMem_RawFree; // Set a default that may be overridden.
1270
1271 // Call the "getdata" func for the object.
1272 Py_INCREF(obj);
1273 crossinterpdatafunc getdata = _lookup_getdata(obj);
1274 if (getdata == NULL) {
1275 Py_DECREF(obj);
1276 return -1;
1277 }
1278 int res = getdata(obj, data);
1279 Py_DECREF(obj);
1280 if (res != 0) {
1281 return -1;
1282 }
1283
1284 // Fill in the blanks and validate the result.
Eric Snow7f8bfc92018-01-29 18:23:44 -07001285 data->interp = interp->id;
1286 if (_check_xidata(data) != 0) {
1287 _PyCrossInterpreterData_Release(data);
1288 return -1;
1289 }
1290
1291 return 0;
1292}
1293
Eric Snowb05b7112019-03-01 12:35:10 -07001294static int
Eric Snow63799132018-06-01 18:45:20 -06001295_release_xidata(void *arg)
1296{
1297 _PyCrossInterpreterData *data = (_PyCrossInterpreterData *)arg;
1298 if (data->free != NULL) {
1299 data->free(data->data);
1300 }
1301 Py_XDECREF(data->obj);
Eric Snowb05b7112019-03-01 12:35:10 -07001302 PyMem_Free(data);
1303 return 0;
Eric Snow63799132018-06-01 18:45:20 -06001304}
1305
Eric Snow7f8bfc92018-01-29 18:23:44 -07001306void
1307_PyCrossInterpreterData_Release(_PyCrossInterpreterData *data)
1308{
1309 if (data->data == NULL && data->obj == NULL) {
1310 // Nothing to release!
1311 return;
1312 }
1313
Eric Snowb05b7112019-03-01 12:35:10 -07001314 // Get the original interpreter.
Eric Snow7f8bfc92018-01-29 18:23:44 -07001315 PyInterpreterState *interp = _PyInterpreterState_LookUpID(data->interp);
1316 if (interp == NULL) {
1317 // The intepreter was already destroyed.
1318 if (data->free != NULL) {
1319 // XXX Someone leaked some memory...
1320 }
1321 return;
1322 }
Eric Snowb05b7112019-03-01 12:35:10 -07001323 // XXX There's an ever-so-slight race here...
1324 if (interp->finalizing) {
1325 // XXX Someone leaked some memory...
1326 return;
1327 }
Eric Snowf53d9f22018-02-20 16:30:17 -07001328
Eric Snow7f8bfc92018-01-29 18:23:44 -07001329 // "Release" the data and/or the object.
Eric Snowb05b7112019-03-01 12:35:10 -07001330 _PyCrossInterpreterData *copied = PyMem_Malloc(sizeof(_PyCrossInterpreterData));
1331 if (copied == NULL) {
1332 PyErr_SetString(PyExc_MemoryError,
1333 "Not enough memory to preserve cross-interpreter data");
1334 PyErr_Print();
1335 return;
1336 }
1337 memcpy(copied, data, sizeof(_PyCrossInterpreterData));
1338 if (_Py_AddPendingCall(interp, 0, _release_xidata, copied) != 0) {
1339 // XXX Queue full or couldn't get lock. Try again somehow?
1340 }
Eric Snow7f8bfc92018-01-29 18:23:44 -07001341}
1342
1343PyObject *
1344_PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *data)
1345{
1346 return data->new_object(data);
1347}
1348
1349/* registry of {type -> crossinterpdatafunc} */
1350
1351/* For now we use a global registry of shareable classes. An
1352 alternative would be to add a tp_* slot for a class's
1353 crossinterpdatafunc. It would be simpler and more efficient. */
1354
1355static int
1356_register_xidata(PyTypeObject *cls, crossinterpdatafunc getdata)
1357{
1358 // Note that we effectively replace already registered classes
1359 // rather than failing.
1360 struct _xidregitem *newhead = PyMem_RawMalloc(sizeof(struct _xidregitem));
1361 if (newhead == NULL)
1362 return -1;
1363 newhead->cls = cls;
1364 newhead->getdata = getdata;
1365 newhead->next = _PyRuntime.xidregistry.head;
1366 _PyRuntime.xidregistry.head = newhead;
1367 return 0;
1368}
1369
1370static void _register_builtins_for_crossinterpreter_data(void);
1371
1372int
1373_PyCrossInterpreterData_Register_Class(PyTypeObject *cls,
1374 crossinterpdatafunc getdata)
1375{
1376 if (!PyType_Check(cls)) {
1377 PyErr_Format(PyExc_ValueError, "only classes may be registered");
1378 return -1;
1379 }
1380 if (getdata == NULL) {
1381 PyErr_Format(PyExc_ValueError, "missing 'getdata' func");
1382 return -1;
1383 }
1384
1385 // Make sure the class isn't ever deallocated.
1386 Py_INCREF((PyObject *)cls);
1387
1388 PyThread_acquire_lock(_PyRuntime.xidregistry.mutex, WAIT_LOCK);
1389 if (_PyRuntime.xidregistry.head == NULL) {
1390 _register_builtins_for_crossinterpreter_data();
1391 }
1392 int res = _register_xidata(cls, getdata);
1393 PyThread_release_lock(_PyRuntime.xidregistry.mutex);
1394 return res;
1395}
1396
Eric Snow6d2cd902018-05-16 15:04:57 -04001397/* Cross-interpreter objects are looked up by exact match on the class.
1398 We can reassess this policy when we move from a global registry to a
1399 tp_* slot. */
1400
Eric Snow7f8bfc92018-01-29 18:23:44 -07001401crossinterpdatafunc
1402_PyCrossInterpreterData_Lookup(PyObject *obj)
1403{
1404 PyObject *cls = PyObject_Type(obj);
1405 crossinterpdatafunc getdata = NULL;
1406 PyThread_acquire_lock(_PyRuntime.xidregistry.mutex, WAIT_LOCK);
1407 struct _xidregitem *cur = _PyRuntime.xidregistry.head;
1408 if (cur == NULL) {
1409 _register_builtins_for_crossinterpreter_data();
1410 cur = _PyRuntime.xidregistry.head;
1411 }
1412 for(; cur != NULL; cur = cur->next) {
1413 if (cur->cls == (PyTypeObject *)cls) {
1414 getdata = cur->getdata;
1415 break;
1416 }
1417 }
Eric Snow4e9da0d2018-02-02 21:49:49 -07001418 Py_DECREF(cls);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001419 PyThread_release_lock(_PyRuntime.xidregistry.mutex);
1420 return getdata;
1421}
1422
1423/* cross-interpreter data for builtin types */
1424
Eric Snow6d2cd902018-05-16 15:04:57 -04001425struct _shared_bytes_data {
1426 char *bytes;
1427 Py_ssize_t len;
1428};
1429
Eric Snow7f8bfc92018-01-29 18:23:44 -07001430static PyObject *
1431_new_bytes_object(_PyCrossInterpreterData *data)
1432{
Eric Snow6d2cd902018-05-16 15:04:57 -04001433 struct _shared_bytes_data *shared = (struct _shared_bytes_data *)(data->data);
1434 return PyBytes_FromStringAndSize(shared->bytes, shared->len);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001435}
1436
1437static int
1438_bytes_shared(PyObject *obj, _PyCrossInterpreterData *data)
1439{
Eric Snow6d2cd902018-05-16 15:04:57 -04001440 struct _shared_bytes_data *shared = PyMem_NEW(struct _shared_bytes_data, 1);
1441 if (PyBytes_AsStringAndSize(obj, &shared->bytes, &shared->len) < 0) {
1442 return -1;
1443 }
1444 data->data = (void *)shared;
Eric Snow63799132018-06-01 18:45:20 -06001445 Py_INCREF(obj);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001446 data->obj = obj; // Will be "released" (decref'ed) when data released.
1447 data->new_object = _new_bytes_object;
Eric Snow6d2cd902018-05-16 15:04:57 -04001448 data->free = PyMem_Free;
1449 return 0;
1450}
1451
1452struct _shared_str_data {
1453 int kind;
1454 const void *buffer;
1455 Py_ssize_t len;
1456};
1457
1458static PyObject *
1459_new_str_object(_PyCrossInterpreterData *data)
1460{
1461 struct _shared_str_data *shared = (struct _shared_str_data *)(data->data);
1462 return PyUnicode_FromKindAndData(shared->kind, shared->buffer, shared->len);
1463}
1464
1465static int
1466_str_shared(PyObject *obj, _PyCrossInterpreterData *data)
1467{
1468 struct _shared_str_data *shared = PyMem_NEW(struct _shared_str_data, 1);
1469 shared->kind = PyUnicode_KIND(obj);
1470 shared->buffer = PyUnicode_DATA(obj);
1471 shared->len = PyUnicode_GET_LENGTH(obj) - 1;
1472 data->data = (void *)shared;
Eric Snow63799132018-06-01 18:45:20 -06001473 Py_INCREF(obj);
Eric Snow6d2cd902018-05-16 15:04:57 -04001474 data->obj = obj; // Will be "released" (decref'ed) when data released.
1475 data->new_object = _new_str_object;
1476 data->free = PyMem_Free;
1477 return 0;
1478}
1479
1480static PyObject *
1481_new_long_object(_PyCrossInterpreterData *data)
1482{
Alexey Izbyshev16f842d2019-02-12 19:06:43 +03001483 return PyLong_FromSsize_t((Py_ssize_t)(data->data));
Eric Snow6d2cd902018-05-16 15:04:57 -04001484}
1485
1486static int
1487_long_shared(PyObject *obj, _PyCrossInterpreterData *data)
1488{
Alexey Izbyshev16f842d2019-02-12 19:06:43 +03001489 /* Note that this means the size of shareable ints is bounded by
1490 * sys.maxsize. Hence on 32-bit architectures that is half the
1491 * size of maximum shareable ints on 64-bit.
1492 */
1493 Py_ssize_t value = PyLong_AsSsize_t(obj);
Eric Snow6d2cd902018-05-16 15:04:57 -04001494 if (value == -1 && PyErr_Occurred()) {
1495 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1496 PyErr_SetString(PyExc_OverflowError, "try sending as bytes");
1497 }
1498 return -1;
1499 }
1500 data->data = (void *)value;
1501 data->obj = NULL;
1502 data->new_object = _new_long_object;
1503 data->free = NULL;
Eric Snow7f8bfc92018-01-29 18:23:44 -07001504 return 0;
1505}
1506
1507static PyObject *
1508_new_none_object(_PyCrossInterpreterData *data)
1509{
1510 // XXX Singleton refcounts are problematic across interpreters...
1511 Py_INCREF(Py_None);
1512 return Py_None;
1513}
1514
1515static int
1516_none_shared(PyObject *obj, _PyCrossInterpreterData *data)
1517{
1518 data->data = NULL;
1519 // data->obj remains NULL
1520 data->new_object = _new_none_object;
1521 data->free = NULL; // There is nothing to free.
1522 return 0;
1523}
1524
1525static void
1526_register_builtins_for_crossinterpreter_data(void)
1527{
1528 // None
1529 if (_register_xidata((PyTypeObject *)PyObject_Type(Py_None), _none_shared) != 0) {
1530 Py_FatalError("could not register None for cross-interpreter sharing");
1531 }
1532
Eric Snow6d2cd902018-05-16 15:04:57 -04001533 // int
1534 if (_register_xidata(&PyLong_Type, _long_shared) != 0) {
1535 Py_FatalError("could not register int for cross-interpreter sharing");
1536 }
1537
Eric Snow7f8bfc92018-01-29 18:23:44 -07001538 // bytes
1539 if (_register_xidata(&PyBytes_Type, _bytes_shared) != 0) {
1540 Py_FatalError("could not register bytes for cross-interpreter sharing");
1541 }
Eric Snow6d2cd902018-05-16 15:04:57 -04001542
1543 // str
1544 if (_register_xidata(&PyUnicode_Type, _str_shared) != 0) {
1545 Py_FatalError("could not register str for cross-interpreter sharing");
1546 }
Eric Snow7f8bfc92018-01-29 18:23:44 -07001547}
1548
1549
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001550#ifdef __cplusplus
1551}
1552#endif