blob: 8cbf1fa10a59c3c97110cb47847f5832db5d754c [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"
Eric Snow2ebc5ce2017-09-07 23:51:28 -06005#include "internal/pystate.h"
Guido van Rossuma027efa1997-05-05 20:56:21 +00006
Victor Stinnerb02ef712016-01-22 14:09:55 +01007#define GET_TSTATE() \
8 ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current))
9#define SET_TSTATE(value) \
Benjamin Petersonca470632016-09-06 13:47:26 -070010 _Py_atomic_store_relaxed(&_PyThreadState_Current, (uintptr_t)(value))
Victor Stinnerb02ef712016-01-22 14:09:55 +010011#define GET_INTERP_STATE() \
12 (GET_TSTATE()->interp)
13
Victor Stinnerbfd316e2016-01-20 11:12:38 +010014
Tim Peters84705582004-10-10 02:47:33 +000015/* --------------------------------------------------------------------------
16CAUTION
17
Victor Stinner1a7425f2013-07-07 16:25:15 +020018Always use PyMem_RawMalloc() and PyMem_RawFree() directly in this file. A
19number of these functions are advertised as safe to call when the GIL isn't
20held, and in a debug build Python redirects (e.g.) PyMem_NEW (etc) to Python's
21debugging obmalloc functions. Those aren't thread-safe (they rely on the GIL
22to avoid the expense of doing their own locking).
Tim Peters84705582004-10-10 02:47:33 +000023-------------------------------------------------------------------------- */
24
Martin v. Löwisf0473d52001-07-18 16:17:16 +000025#ifdef HAVE_DLOPEN
26#ifdef HAVE_DLFCN_H
27#include <dlfcn.h>
28#endif
Serhiy Storchakac2f7d872016-05-04 09:44:44 +030029#if !HAVE_DECL_RTLD_LAZY
Martin v. Löwisf0473d52001-07-18 16:17:16 +000030#define RTLD_LAZY 1
31#endif
32#endif
33
Benjamin Peterson43162b82012-04-13 11:58:27 -040034#ifdef __cplusplus
35extern "C" {
36#endif
Martin v. Löwisf0473d52001-07-18 16:17:16 +000037
Victor Stinner5d39e042017-11-29 17:20:38 +010038static _PyInitError
39_PyRuntimeState_Init_impl(_PyRuntimeState *runtime)
Eric Snow2ebc5ce2017-09-07 23:51:28 -060040{
41 memset(runtime, 0, sizeof(*runtime));
Victor Stinner8a1be612016-03-14 22:07:55 +010042
Eric Snow2ebc5ce2017-09-07 23:51:28 -060043 _PyGC_Initialize(&runtime->gc);
44 _PyEval_Initialize(&runtime->ceval);
Michael W. Hudson188d4362005-06-20 16:52:57 +000045
Eric Snow2ebc5ce2017-09-07 23:51:28 -060046 runtime->gilstate.check_enabled = 1;
Victor Stinnerf7e5b562017-11-15 15:48:08 -080047
Masayuki Yamamoto731e1892017-10-06 19:41:34 +090048 /* A TSS key must be initialized with Py_tss_NEEDS_INIT
49 in accordance with the specification. */
Victor Stinnerf7e5b562017-11-15 15:48:08 -080050 Py_tss_t initial = Py_tss_NEEDS_INIT;
51 runtime->gilstate.autoTSSkey = initial;
Guido van Rossum1d5ad901999-06-18 14:22:24 +000052
Eric Snow2ebc5ce2017-09-07 23:51:28 -060053 runtime->interpreters.mutex = PyThread_allocate_lock();
Victor Stinnerf7e5b562017-11-15 15:48:08 -080054 if (runtime->interpreters.mutex == NULL) {
55 return _Py_INIT_ERR("Can't initialize threads for interpreter");
56 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -060057 runtime->interpreters.next_id = -1;
Eric Snow7f8bfc92018-01-29 18:23:44 -070058
59 runtime->xidregistry.mutex = PyThread_allocate_lock();
60 if (runtime->xidregistry.mutex == NULL) {
61 return _Py_INIT_ERR("Can't initialize threads for cross-interpreter data registry");
62 }
63
Victor Stinnerf7e5b562017-11-15 15:48:08 -080064 return _Py_INIT_OK();
Eric Snow2ebc5ce2017-09-07 23:51:28 -060065}
Eric Snow05351c12017-09-05 21:43:08 -070066
Victor Stinner5d39e042017-11-29 17:20:38 +010067_PyInitError
68_PyRuntimeState_Init(_PyRuntimeState *runtime)
69{
70 /* Force default allocator, since _PyRuntimeState_Fini() must
71 use the same allocator than this function. */
72 PyMemAllocatorEx old_alloc;
73 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
74
75 _PyInitError err = _PyRuntimeState_Init_impl(runtime);
76
77 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
78 return err;
79}
80
Eric Snow2ebc5ce2017-09-07 23:51:28 -060081void
82_PyRuntimeState_Fini(_PyRuntimeState *runtime)
83{
Victor Stinner5d39e042017-11-29 17:20:38 +010084 /* Force the allocator used by _PyRuntimeState_Init(). */
85 PyMemAllocatorEx old_alloc;
86 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Victor Stinnerccb04422017-11-16 03:20:31 -080087
Eric Snow2ebc5ce2017-09-07 23:51:28 -060088 if (runtime->interpreters.mutex != NULL) {
89 PyThread_free_lock(runtime->interpreters.mutex);
90 runtime->interpreters.mutex = NULL;
91 }
Victor Stinnerccb04422017-11-16 03:20:31 -080092
93 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
Eric Snow2ebc5ce2017-09-07 23:51:28 -060094}
95
96#define HEAD_LOCK() PyThread_acquire_lock(_PyRuntime.interpreters.mutex, \
97 WAIT_LOCK)
98#define HEAD_UNLOCK() PyThread_release_lock(_PyRuntime.interpreters.mutex)
Eric Snow05351c12017-09-05 21:43:08 -070099
Michael W. Hudson188d4362005-06-20 16:52:57 +0000100static void _PyGILState_NoteThreadState(PyThreadState* tstate);
101
Victor Stinnera7368ac2017-11-15 18:11:45 -0800102_PyInitError
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600103_PyInterpreterState_Enable(_PyRuntimeState *runtime)
Eric Snowe3774162017-05-22 19:46:40 -0700104{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600105 runtime->interpreters.next_id = 0;
106 /* Since we only call _PyRuntimeState_Init() once per process
107 (see _PyRuntime_Initialize()), we make sure the mutex is
108 initialized here. */
109 if (runtime->interpreters.mutex == NULL) {
110 runtime->interpreters.mutex = PyThread_allocate_lock();
Victor Stinnera7368ac2017-11-15 18:11:45 -0800111 if (runtime->interpreters.mutex == NULL) {
112 return _Py_INIT_ERR("Can't initialize threads for interpreter");
113 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600114 }
Victor Stinnera7368ac2017-11-15 18:11:45 -0800115 return _Py_INIT_OK();
Eric Snowe3774162017-05-22 19:46:40 -0700116}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000117
118PyInterpreterState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000119PyInterpreterState_New(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000120{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000121 PyInterpreterState *interp = (PyInterpreterState *)
Victor Stinner1a7425f2013-07-07 16:25:15 +0200122 PyMem_RawMalloc(sizeof(PyInterpreterState));
Guido van Rossum25ce5661997-08-02 03:10:38 +0000123
Victor Stinnerd4341102017-11-23 00:12:09 +0100124 if (interp == NULL) {
125 return NULL;
126 }
127
Eric Snow4c6955e2018-02-16 18:53:40 -0700128 interp->id_refcount = -1;
129 interp->id_mutex = NULL;
Victor Stinnerd4341102017-11-23 00:12:09 +0100130 interp->modules = NULL;
131 interp->modules_by_index = NULL;
132 interp->sysdict = NULL;
133 interp->builtins = NULL;
134 interp->builtins_copy = NULL;
135 interp->tstate_head = NULL;
136 interp->check_interval = 100;
137 interp->num_threads = 0;
138 interp->pythread_stacksize = 0;
139 interp->codec_search_path = NULL;
140 interp->codec_search_cache = NULL;
141 interp->codec_error_registry = NULL;
142 interp->codecs_initialized = 0;
143 interp->fscodec_initialized = 0;
144 interp->core_config = _PyCoreConfig_INIT;
145 interp->config = _PyMainInterpreterConfig_INIT;
146 interp->importlib = NULL;
147 interp->import_func = NULL;
148 interp->eval_frame = _PyEval_EvalFrameDefault;
149 interp->co_extra_user_count = 0;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000150#ifdef HAVE_DLOPEN
Serhiy Storchakac2f7d872016-05-04 09:44:44 +0300151#if HAVE_DECL_RTLD_NOW
Victor Stinnerd4341102017-11-23 00:12:09 +0100152 interp->dlopenflags = RTLD_NOW;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000153#else
Victor Stinnerd4341102017-11-23 00:12:09 +0100154 interp->dlopenflags = RTLD_LAZY;
Martin v. Löwisf0473d52001-07-18 16:17:16 +0000155#endif
156#endif
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200157#ifdef HAVE_FORK
Victor Stinnerd4341102017-11-23 00:12:09 +0100158 interp->before_forkers = NULL;
159 interp->after_forkers_parent = NULL;
160 interp->after_forkers_child = NULL;
Antoine Pitrou346cbd32017-05-27 17:50:54 +0200161#endif
Marcel Plch776407f2017-12-20 11:17:58 +0100162 interp->pyexitfunc = NULL;
163 interp->pyexitmodule = NULL;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000164
Victor Stinnerd4341102017-11-23 00:12:09 +0100165 HEAD_LOCK();
166 interp->next = _PyRuntime.interpreters.head;
167 if (_PyRuntime.interpreters.main == NULL) {
168 _PyRuntime.interpreters.main = interp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000169 }
Victor Stinnerd4341102017-11-23 00:12:09 +0100170 _PyRuntime.interpreters.head = interp;
171 if (_PyRuntime.interpreters.next_id < 0) {
172 /* overflow or Py_Initialize() not called! */
173 PyErr_SetString(PyExc_RuntimeError,
174 "failed to get an interpreter ID");
Eric Snow7f8bfc92018-01-29 18:23:44 -0700175 /* XXX deallocate! */
Victor Stinnerd4341102017-11-23 00:12:09 +0100176 interp = NULL;
177 } else {
178 interp->id = _PyRuntime.interpreters.next_id;
179 _PyRuntime.interpreters.next_id += 1;
180 }
181 HEAD_UNLOCK();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000182
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
Guido van Rossum25ce5661997-08-02 03:10:38 +0000214}
215
216
217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000218zapthreads(PyInterpreterState *interp)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 PyThreadState *p;
221 /* No need to lock the mutex here because this should only happen
222 when the threads are all really dead (XXX famous last words). */
223 while ((p = interp->tstate_head) != NULL) {
224 PyThreadState_Delete(p);
225 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000226}
227
228
229void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000230PyInterpreterState_Delete(PyInterpreterState *interp)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000231{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 PyInterpreterState **p;
233 zapthreads(interp);
234 HEAD_LOCK();
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600235 for (p = &_PyRuntime.interpreters.head; ; p = &(*p)->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 if (*p == NULL)
237 Py_FatalError(
238 "PyInterpreterState_Delete: invalid interp");
239 if (*p == interp)
240 break;
241 }
242 if (interp->tstate_head != NULL)
243 Py_FatalError("PyInterpreterState_Delete: remaining threads");
244 *p = interp->next;
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600245 if (_PyRuntime.interpreters.main == interp) {
246 _PyRuntime.interpreters.main = NULL;
247 if (_PyRuntime.interpreters.head != NULL)
Eric Snow6b4be192017-05-22 21:36:03 -0700248 Py_FatalError("PyInterpreterState_Delete: remaining subinterpreters");
249 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 HEAD_UNLOCK();
Eric Snow4c6955e2018-02-16 18:53:40 -0700251 if (interp->id_mutex != NULL) {
252 PyThread_free_lock(interp->id_mutex);
253 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200254 PyMem_RawFree(interp);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000255}
256
257
Eric Snowe3774162017-05-22 19:46:40 -0700258int64_t
259PyInterpreterState_GetID(PyInterpreterState *interp)
260{
261 if (interp == NULL) {
262 PyErr_SetString(PyExc_RuntimeError, "no interpreter provided");
263 return -1;
264 }
265 return interp->id;
266}
267
268
Eric Snow7f8bfc92018-01-29 18:23:44 -0700269PyInterpreterState *
270_PyInterpreterState_LookUpID(PY_INT64_T requested_id)
271{
272 if (requested_id < 0)
273 goto error;
274
275 PyInterpreterState *interp = PyInterpreterState_Head();
276 while (interp != NULL) {
277 PY_INT64_T id = PyInterpreterState_GetID(interp);
278 if (id < 0)
279 return NULL;
280 if (requested_id == id)
281 return interp;
282 interp = PyInterpreterState_Next(interp);
283 }
284
285error:
286 PyErr_Format(PyExc_RuntimeError,
287 "unrecognized interpreter ID %lld", requested_id);
288 return NULL;
289}
290
Eric Snow4c6955e2018-02-16 18:53:40 -0700291
292int
293_PyInterpreterState_IDInitref(PyInterpreterState *interp)
294{
295 if (interp->id_mutex != NULL) {
296 return 0;
297 }
298 interp->id_mutex = PyThread_allocate_lock();
299 if (interp->id_mutex == NULL) {
300 PyErr_SetString(PyExc_RuntimeError,
301 "failed to create init interpreter ID mutex");
302 return -1;
303 }
304 interp->id_refcount = 0;
305 return 0;
306}
307
308
309void
310_PyInterpreterState_IDIncref(PyInterpreterState *interp)
311{
312 if (interp->id_mutex == NULL) {
313 return;
314 }
315 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
316 interp->id_refcount += 1;
317 PyThread_release_lock(interp->id_mutex);
318}
319
320
321void
322_PyInterpreterState_IDDecref(PyInterpreterState *interp)
323{
324 if (interp->id_mutex == NULL) {
325 return;
326 }
327 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
328 assert(interp->id_refcount != 0);
329 interp->id_refcount -= 1;
330 int64_t refcount = interp->id_refcount;
331 PyThread_release_lock(interp->id_mutex);
332
333 if (refcount == 0) {
334 PyThreadState *tstate, *save_tstate;
335 tstate = PyInterpreterState_ThreadHead(interp);
336 save_tstate = PyThreadState_Swap(tstate);
337 Py_EndInterpreter(tstate);
338 PyThreadState_Swap(save_tstate);
339 }
340}
341
342
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000343/* Default implementation for _PyThreadState_GetFrame */
344static struct _frame *
345threadstate_getframe(PyThreadState *self)
346{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 return self->frame;
Michael W. Hudson019a78e2002-11-08 12:53:11 +0000348}
349
Victor Stinner45b9be52010-03-03 23:28:07 +0000350static PyThreadState *
351new_threadstate(PyInterpreterState *interp, int init)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000352{
Victor Stinner1a7425f2013-07-07 16:25:15 +0200353 PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState));
Tim Peters84705582004-10-10 02:47:33 +0000354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000355 if (_PyThreadState_GetFrame == NULL)
356 _PyThreadState_GetFrame = threadstate_getframe;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 if (tstate != NULL) {
359 tstate->interp = interp;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 tstate->frame = NULL;
362 tstate->recursion_depth = 0;
363 tstate->overflowed = 0;
364 tstate->recursion_critical = 0;
pdox18967932017-10-25 23:03:01 -0700365 tstate->stackcheck_counter = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000366 tstate->tracing = 0;
367 tstate->use_tracing = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 tstate->gilstate_counter = 0;
369 tstate->async_exc = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 tstate->thread_id = PyThread_get_thread_ident();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 tstate->dict = NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 tstate->curexc_type = NULL;
375 tstate->curexc_value = NULL;
376 tstate->curexc_traceback = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000377
Mark Shannonae3087c2017-10-22 22:41:51 +0100378 tstate->exc_state.exc_type = NULL;
379 tstate->exc_state.exc_value = NULL;
380 tstate->exc_state.exc_traceback = NULL;
381 tstate->exc_state.previous_item = NULL;
382 tstate->exc_info = &tstate->exc_state;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 tstate->c_profilefunc = NULL;
385 tstate->c_tracefunc = NULL;
386 tstate->c_profileobj = NULL;
387 tstate->c_traceobj = NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000388
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200389 tstate->trash_delete_nesting = 0;
390 tstate->trash_delete_later = NULL;
Antoine Pitrou7b476992013-09-07 23:38:37 +0200391 tstate->on_delete = NULL;
392 tstate->on_delete_data = NULL;
Antoine Pitrou2b0218a2012-09-06 00:59:49 +0200393
Nathaniel J. Smithfc2f4072018-01-21 06:44:07 -0800394 tstate->coroutine_origin_tracking_depth = 0;
395
Yury Selivanov75445082015-05-11 22:57:16 -0400396 tstate->coroutine_wrapper = NULL;
Yury Selivanovaab3c4a2015-06-02 18:43:51 -0400397 tstate->in_coroutine_wrapper = 0;
Yury Selivanov75445082015-05-11 22:57:16 -0400398
Yury Selivanoveb636452016-09-08 22:01:51 -0700399 tstate->async_gen_firstiter = NULL;
400 tstate->async_gen_finalizer = NULL;
401
Yury Selivanovf23746a2018-01-22 19:11:18 -0500402 tstate->context = NULL;
403 tstate->context_ver = 1;
404
405 tstate->id = ++interp->tstate_next_unique_id;
406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 if (init)
408 _PyThreadState_Init(tstate);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200411 tstate->prev = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 tstate->next = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200413 if (tstate->next)
414 tstate->next->prev = tstate;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000415 interp->tstate_head = tstate;
416 HEAD_UNLOCK();
417 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000420}
421
Victor Stinner45b9be52010-03-03 23:28:07 +0000422PyThreadState *
423PyThreadState_New(PyInterpreterState *interp)
424{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 return new_threadstate(interp, 1);
Victor Stinner45b9be52010-03-03 23:28:07 +0000426}
427
428PyThreadState *
429_PyThreadState_Prealloc(PyInterpreterState *interp)
430{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 return new_threadstate(interp, 0);
Victor Stinner45b9be52010-03-03 23:28:07 +0000432}
433
434void
435_PyThreadState_Init(PyThreadState *tstate)
436{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 _PyGILState_NoteThreadState(tstate);
Victor Stinner45b9be52010-03-03 23:28:07 +0000438}
439
Martin v. Löwis1a214512008-06-11 05:26:20 +0000440PyObject*
Martin v. Löwis7800f752012-06-22 12:20:55 +0200441PyState_FindModule(struct PyModuleDef* module)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000442{
Martin v. Löwis7800f752012-06-22 12:20:55 +0200443 Py_ssize_t index = module->m_base.m_index;
Victor Stinnerb02ef712016-01-22 14:09:55 +0100444 PyInterpreterState *state = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 PyObject *res;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000446 if (module->m_slots) {
447 return NULL;
448 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449 if (index == 0)
450 return NULL;
451 if (state->modules_by_index == NULL)
452 return NULL;
Antoine Pitrou75506e82012-08-20 19:30:46 +0200453 if (index >= PyList_GET_SIZE(state->modules_by_index))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 return NULL;
455 res = PyList_GET_ITEM(state->modules_by_index, index);
456 return res==Py_None ? NULL : res;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000457}
458
459int
460_PyState_AddModule(PyObject* module, struct PyModuleDef* def)
461{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000462 PyInterpreterState *state;
Berker Peksag4b7b5652016-08-22 18:05:56 +0300463 if (!def) {
464 assert(PyErr_Occurred());
465 return -1;
466 }
Nick Coghland5cacbb2015-05-23 22:24:10 +1000467 if (def->m_slots) {
468 PyErr_SetString(PyExc_SystemError,
469 "PyState_AddModule called on module with slots");
470 return -1;
471 }
Victor Stinnerb02ef712016-01-22 14:09:55 +0100472 state = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 if (!state->modules_by_index) {
474 state->modules_by_index = PyList_New(0);
475 if (!state->modules_by_index)
476 return -1;
477 }
478 while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index)
479 if (PyList_Append(state->modules_by_index, Py_None) < 0)
480 return -1;
481 Py_INCREF(module);
482 return PyList_SetItem(state->modules_by_index,
483 def->m_base.m_index, module);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000484}
Guido van Rossuma027efa1997-05-05 20:56:21 +0000485
Martin v. Löwis7800f752012-06-22 12:20:55 +0200486int
487PyState_AddModule(PyObject* module, struct PyModuleDef* def)
488{
489 Py_ssize_t index;
Victor Stinnerb02ef712016-01-22 14:09:55 +0100490 PyInterpreterState *state = GET_INTERP_STATE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200491 if (!def) {
492 Py_FatalError("PyState_AddModule: Module Definition is NULL");
493 return -1;
494 }
495 index = def->m_base.m_index;
496 if (state->modules_by_index) {
497 if(PyList_GET_SIZE(state->modules_by_index) >= index) {
498 if(module == PyList_GET_ITEM(state->modules_by_index, index)) {
499 Py_FatalError("PyState_AddModule: Module already added!");
500 return -1;
501 }
502 }
503 }
504 return _PyState_AddModule(module, def);
505}
506
507int
508PyState_RemoveModule(struct PyModuleDef* def)
509{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000510 PyInterpreterState *state;
Martin v. Löwis7800f752012-06-22 12:20:55 +0200511 Py_ssize_t index = def->m_base.m_index;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000512 if (def->m_slots) {
513 PyErr_SetString(PyExc_SystemError,
514 "PyState_RemoveModule called on module with slots");
515 return -1;
516 }
Victor Stinnerb02ef712016-01-22 14:09:55 +0100517 state = GET_INTERP_STATE();
Martin v. Löwis7800f752012-06-22 12:20:55 +0200518 if (index == 0) {
519 Py_FatalError("PyState_RemoveModule: Module index invalid.");
520 return -1;
521 }
522 if (state->modules_by_index == NULL) {
523 Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible.");
524 return -1;
525 }
526 if (index > PyList_GET_SIZE(state->modules_by_index)) {
527 Py_FatalError("PyState_RemoveModule: Module index out of bounds.");
528 return -1;
529 }
530 return PyList_SetItem(state->modules_by_index, index, Py_None);
531}
532
Antoine Pitrou40322e62013-08-11 00:30:09 +0200533/* used by import.c:PyImport_Cleanup */
534void
535_PyState_ClearModules(void)
536{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100537 PyInterpreterState *state = GET_INTERP_STATE();
Antoine Pitrou40322e62013-08-11 00:30:09 +0200538 if (state->modules_by_index) {
539 Py_ssize_t i;
540 for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) {
541 PyObject *m = PyList_GET_ITEM(state->modules_by_index, i);
542 if (PyModule_Check(m)) {
543 /* cleanup the saved copy of module dicts */
544 PyModuleDef *md = PyModule_GetDef(m);
545 if (md)
546 Py_CLEAR(md->m_base.m_copy);
547 }
548 }
549 /* Setting modules_by_index to NULL could be dangerous, so we
550 clear the list instead. */
551 if (PyList_SetSlice(state->modules_by_index,
552 0, PyList_GET_SIZE(state->modules_by_index),
553 NULL))
554 PyErr_WriteUnraisable(state->modules_by_index);
555 }
556}
557
Guido van Rossuma027efa1997-05-05 20:56:21 +0000558void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000559PyThreadState_Clear(PyThreadState *tstate)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000560{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 if (Py_VerboseFlag && tstate->frame != NULL)
562 fprintf(stderr,
563 "PyThreadState_Clear: warning: thread still has a frame\n");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 Py_CLEAR(tstate->frame);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 Py_CLEAR(tstate->dict);
568 Py_CLEAR(tstate->async_exc);
Guido van Rossumede04391998-04-10 20:18:25 +0000569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 Py_CLEAR(tstate->curexc_type);
571 Py_CLEAR(tstate->curexc_value);
572 Py_CLEAR(tstate->curexc_traceback);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000573
Mark Shannonae3087c2017-10-22 22:41:51 +0100574 Py_CLEAR(tstate->exc_state.exc_type);
575 Py_CLEAR(tstate->exc_state.exc_value);
576 Py_CLEAR(tstate->exc_state.exc_traceback);
Serhiy Storchakabdf42982017-10-26 16:59:40 +0300577
Mark Shannonae3087c2017-10-22 22:41:51 +0100578 /* The stack of exception states should contain just this thread. */
579 assert(tstate->exc_info->previous_item == NULL);
580 if (Py_VerboseFlag && tstate->exc_info != &tstate->exc_state) {
581 fprintf(stderr,
582 "PyThreadState_Clear: warning: thread still has a generator\n");
583 }
Guido van Rossum25ce5661997-08-02 03:10:38 +0000584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 tstate->c_profilefunc = NULL;
586 tstate->c_tracefunc = NULL;
587 Py_CLEAR(tstate->c_profileobj);
588 Py_CLEAR(tstate->c_traceobj);
Yury Selivanov75445082015-05-11 22:57:16 -0400589
590 Py_CLEAR(tstate->coroutine_wrapper);
Yury Selivanoveb636452016-09-08 22:01:51 -0700591 Py_CLEAR(tstate->async_gen_firstiter);
592 Py_CLEAR(tstate->async_gen_finalizer);
Yury Selivanovf23746a2018-01-22 19:11:18 -0500593
594 Py_CLEAR(tstate->context);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000595}
596
597
Guido van Rossum29757862001-01-23 01:46:06 +0000598/* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
599static void
600tstate_delete_common(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000601{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 PyInterpreterState *interp;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 if (tstate == NULL)
604 Py_FatalError("PyThreadState_Delete: NULL tstate");
605 interp = tstate->interp;
606 if (interp == NULL)
607 Py_FatalError("PyThreadState_Delete: NULL interp");
608 HEAD_LOCK();
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200609 if (tstate->prev)
610 tstate->prev->next = tstate->next;
611 else
612 interp->tstate_head = tstate->next;
613 if (tstate->next)
614 tstate->next->prev = tstate->prev;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 HEAD_UNLOCK();
Antoine Pitrou7b476992013-09-07 23:38:37 +0200616 if (tstate->on_delete != NULL) {
617 tstate->on_delete(tstate->on_delete_data);
618 }
Victor Stinner1a7425f2013-07-07 16:25:15 +0200619 PyMem_RawFree(tstate);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000620}
621
622
Guido van Rossum29757862001-01-23 01:46:06 +0000623void
624PyThreadState_Delete(PyThreadState *tstate)
625{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100626 if (tstate == GET_TSTATE())
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 Py_FatalError("PyThreadState_Delete: tstate is still current");
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600628 if (_PyRuntime.gilstate.autoInterpreterState &&
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900629 PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == tstate)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600630 {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900631 PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, NULL);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600632 }
Christian Heimesb9dbc7d2013-07-01 23:42:28 +0200633 tstate_delete_common(tstate);
Guido van Rossum29757862001-01-23 01:46:06 +0000634}
635
636
Guido van Rossum29757862001-01-23 01:46:06 +0000637void
638PyThreadState_DeleteCurrent()
639{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100640 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 if (tstate == NULL)
642 Py_FatalError(
643 "PyThreadState_DeleteCurrent: no current tstate");
Victor Stinner8a1be612016-03-14 22:07:55 +0100644 tstate_delete_common(tstate);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600645 if (_PyRuntime.gilstate.autoInterpreterState &&
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900646 PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == tstate)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600647 {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900648 PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, NULL);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600649 }
Victor Stinner8a1be612016-03-14 22:07:55 +0100650 SET_TSTATE(NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 PyEval_ReleaseLock();
Guido van Rossum29757862001-01-23 01:46:06 +0000652}
Guido van Rossum29757862001-01-23 01:46:06 +0000653
654
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200655/*
656 * Delete all thread states except the one passed as argument.
657 * Note that, if there is a current thread state, it *must* be the one
658 * passed as argument. Also, this won't touch any other interpreters
659 * than the current one, since we don't know which thread state should
660 * be kept in those other interpreteres.
661 */
662void
663_PyThreadState_DeleteExcept(PyThreadState *tstate)
664{
665 PyInterpreterState *interp = tstate->interp;
666 PyThreadState *p, *next, *garbage;
667 HEAD_LOCK();
668 /* Remove all thread states, except tstate, from the linked list of
669 thread states. This will allow calling PyThreadState_Clear()
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200670 without holding the lock. */
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200671 garbage = interp->tstate_head;
Charles-Francois Natalif28dfdd2013-05-08 21:09:52 +0200672 if (garbage == tstate)
673 garbage = tstate->next;
674 if (tstate->prev)
675 tstate->prev->next = tstate->next;
676 if (tstate->next)
677 tstate->next->prev = tstate->prev;
678 tstate->prev = tstate->next = NULL;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200679 interp->tstate_head = tstate;
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200680 HEAD_UNLOCK();
681 /* Clear and deallocate all stale thread states. Even if this
682 executes Python code, we should be safe since it executes
683 in the current thread, not one of the stale threads. */
684 for (p = garbage; p; p = next) {
685 next = p->next;
686 PyThreadState_Clear(p);
Victor Stinner1a7425f2013-07-07 16:25:15 +0200687 PyMem_RawFree(p);
Antoine Pitrou8408cea2013-05-05 23:47:09 +0200688 }
689}
690
691
Guido van Rossuma027efa1997-05-05 20:56:21 +0000692PyThreadState *
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100693_PyThreadState_UncheckedGet(void)
694{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100695 return GET_TSTATE();
Victor Stinnerbfd316e2016-01-20 11:12:38 +0100696}
697
698
699PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000700PyThreadState_Get(void)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000701{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100702 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 if (tstate == NULL)
704 Py_FatalError("PyThreadState_Get: no current thread");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 return tstate;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000707}
708
709
710PyThreadState *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000711PyThreadState_Swap(PyThreadState *newts)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000712{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100713 PyThreadState *oldts = GET_TSTATE();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000714
Victor Stinnerb02ef712016-01-22 14:09:55 +0100715 SET_TSTATE(newts);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 /* It should not be possible for more than one thread state
717 to be used for a thread. Check this the best we can in debug
718 builds.
719 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200720#if defined(Py_DEBUG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 if (newts) {
722 /* This can be called from PyEval_RestoreThread(). Similar
723 to it, we need to ensure errno doesn't change.
724 */
725 int err = errno;
726 PyThreadState *check = PyGILState_GetThisThreadState();
727 if (check && check->interp == newts->interp && check != newts)
728 Py_FatalError("Invalid thread state for this thread");
729 errno = err;
730 }
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000731#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 return oldts;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000733}
Guido van Rossumede04391998-04-10 20:18:25 +0000734
735/* An extension mechanism to store arbitrary additional per-thread state.
736 PyThreadState_GetDict() returns a dictionary that can be used to hold such
737 state; the caller should pick a unique key and store its state there. If
Guido van Rossum0fc8f002003-04-15 15:12:39 +0000738 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
739 and the caller should assume no per-thread state is available. */
Guido van Rossumede04391998-04-10 20:18:25 +0000740
741PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000742PyThreadState_GetDict(void)
Guido van Rossumede04391998-04-10 20:18:25 +0000743{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100744 PyThreadState *tstate = GET_TSTATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 if (tstate == NULL)
746 return NULL;
Guido van Rossumede04391998-04-10 20:18:25 +0000747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000748 if (tstate->dict == NULL) {
749 PyObject *d;
750 tstate->dict = d = PyDict_New();
751 if (d == NULL)
752 PyErr_Clear();
753 }
754 return tstate->dict;
Guido van Rossumede04391998-04-10 20:18:25 +0000755}
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000756
757
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000758/* Asynchronously raise an exception in a thread.
759 Requested by Just van Rossum and Alex Martelli.
Guido van Rossum0f1f63c2005-02-08 02:07:57 +0000760 To prevent naive misuse, you must write your own extension
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000761 to call this, or use ctypes. Must be called with the GIL held.
762 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
763 match any known thread id). Can be called with exc=NULL to clear an
764 existing async exception. This raises no exceptions. */
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000765
766int
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200767PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc)
768{
Victor Stinnerb02ef712016-01-22 14:09:55 +0100769 PyInterpreterState *interp = GET_INTERP_STATE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 PyThreadState *p;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 /* Although the GIL is held, a few C API functions can be called
773 * without the GIL held, and in particular some that create and
774 * destroy thread and interpreter states. Those can mutate the
775 * list of thread states we're traversing, so to prevent that we lock
776 * head_mutex for the duration.
777 */
778 HEAD_LOCK();
779 for (p = interp->tstate_head; p != NULL; p = p->next) {
780 if (p->thread_id == id) {
781 /* Tricky: we need to decref the current value
782 * (if any) in p->async_exc, but that can in turn
783 * allow arbitrary Python code to run, including
784 * perhaps calls to this function. To prevent
785 * deadlock, we need to release head_mutex before
786 * the decref.
787 */
788 PyObject *old_exc = p->async_exc;
789 Py_XINCREF(exc);
790 p->async_exc = exc;
791 HEAD_UNLOCK();
792 Py_XDECREF(old_exc);
793 _PyEval_SignalAsyncExc();
794 return 1;
795 }
796 }
797 HEAD_UNLOCK();
798 return 0;
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000799}
800
801
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000802/* Routines for advanced debuggers, requested by David Beazley.
803 Don't use unless you know what you are doing! */
804
805PyInterpreterState *
806PyInterpreterState_Head(void)
807{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600808 return _PyRuntime.interpreters.head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000809}
810
811PyInterpreterState *
Eric Snow6b4be192017-05-22 21:36:03 -0700812PyInterpreterState_Main(void)
813{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600814 return _PyRuntime.interpreters.main;
Eric Snow6b4be192017-05-22 21:36:03 -0700815}
816
817PyInterpreterState *
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000818PyInterpreterState_Next(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 return interp->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000820}
821
822PyThreadState *
823PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 return interp->tstate_head;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000825}
826
827PyThreadState *
828PyThreadState_Next(PyThreadState *tstate) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 return tstate->next;
Guido van Rossumf5df46d2001-07-19 12:19:27 +0000830}
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000831
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000832/* The implementation of sys._current_frames(). This is intended to be
833 called with the GIL held, as it will be when called via
834 sys._current_frames(). It's possible it would work fine even without
835 the GIL held, but haven't thought enough about that.
836*/
837PyObject *
838_PyThread_CurrentFrames(void)
839{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 PyObject *result;
841 PyInterpreterState *i;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 result = PyDict_New();
844 if (result == NULL)
845 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 /* for i in all interpreters:
848 * for t in all of i's thread states:
849 * if t's frame isn't NULL, map t's id to its frame
Ezio Melotti13925002011-03-16 11:05:33 +0200850 * Because these lists can mutate even when the GIL is held, we
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 * need to grab head_mutex for the duration.
852 */
853 HEAD_LOCK();
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600854 for (i = _PyRuntime.interpreters.head; i != NULL; i = i->next) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 PyThreadState *t;
856 for (t = i->tstate_head; t != NULL; t = t->next) {
857 PyObject *id;
858 int stat;
859 struct _frame *frame = t->frame;
860 if (frame == NULL)
861 continue;
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200862 id = PyLong_FromUnsignedLong(t->thread_id);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 if (id == NULL)
864 goto Fail;
865 stat = PyDict_SetItem(result, id, (PyObject *)frame);
866 Py_DECREF(id);
867 if (stat < 0)
868 goto Fail;
869 }
870 }
871 HEAD_UNLOCK();
872 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000873
874 Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 HEAD_UNLOCK();
876 Py_DECREF(result);
877 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000878}
Guido van Rossumb8b6d0c2003-06-28 21:53:52 +0000879
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000880/* Python "auto thread state" API. */
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000881
882/* Keep this as a static, as it is not reliable! It can only
883 ever be compared to the state for the *current* thread.
884 * If not equal, then it doesn't matter that the actual
885 value may change immediately after comparison, as it can't
886 possibly change to the current thread's state.
887 * If equal, then the current thread holds the lock, so the value can't
888 change until we yield the lock.
889*/
890static int
891PyThreadState_IsCurrent(PyThreadState *tstate)
892{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 /* Must be the tstate for this thread */
894 assert(PyGILState_GetThisThreadState()==tstate);
Victor Stinnerb02ef712016-01-22 14:09:55 +0100895 return tstate == GET_TSTATE();
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000896}
897
Tim Peters4c1f5ec2004-10-09 17:25:05 +0000898/* Internal initialization/finalization functions called by
Martin Panterb4ce1fc2015-11-30 03:18:29 +0000899 Py_Initialize/Py_FinalizeEx
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000900*/
Tim Peters19717fa2004-10-09 17:38:29 +0000901void
902_PyGILState_Init(PyInterpreterState *i, PyThreadState *t)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000903{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 assert(i && t); /* must init with valid states */
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900905 if (PyThread_tss_create(&_PyRuntime.gilstate.autoTSSkey) != 0) {
906 Py_FatalError("Could not allocate TSS entry");
907 }
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600908 _PyRuntime.gilstate.autoInterpreterState = i;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900909 assert(PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 assert(t->gilstate_counter == 0);
Michael W. Hudson188d4362005-06-20 16:52:57 +0000911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 _PyGILState_NoteThreadState(t);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000913}
914
Victor Stinner861d9ab2016-03-16 22:45:24 +0100915PyInterpreterState *
916_PyGILState_GetInterpreterStateUnsafe(void)
917{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600918 return _PyRuntime.gilstate.autoInterpreterState;
Victor Stinner861d9ab2016-03-16 22:45:24 +0100919}
920
Tim Peters19717fa2004-10-09 17:38:29 +0000921void
922_PyGILState_Fini(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000923{
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900924 PyThread_tss_delete(&_PyRuntime.gilstate.autoTSSkey);
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600925 _PyRuntime.gilstate.autoInterpreterState = NULL;
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000926}
927
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900928/* Reset the TSS key - called by PyOS_AfterFork_Child().
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200929 * This should not be necessary, but some - buggy - pthread implementations
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900930 * don't reset TSS upon fork(), see issue #10517.
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200931 */
932void
933_PyGILState_Reinit(void)
934{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600935 _PyRuntime.interpreters.mutex = PyThread_allocate_lock();
936 if (_PyRuntime.interpreters.mutex == NULL)
937 Py_FatalError("Can't initialize threads for interpreter");
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200938 PyThreadState *tstate = PyGILState_GetThisThreadState();
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900939 PyThread_tss_delete(&_PyRuntime.gilstate.autoTSSkey);
940 if (PyThread_tss_create(&_PyRuntime.gilstate.autoTSSkey) != 0) {
941 Py_FatalError("Could not allocate TSS entry");
942 }
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200943
Charles-François Natalia233df82011-11-22 19:49:51 +0100944 /* If the thread had an associated auto thread state, reassociate it with
945 * the new key. */
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900946 if (tstate &&
947 PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, (void *)tstate) != 0)
948 {
949 Py_FatalError("Couldn't create autoTSSkey mapping");
950 }
Antoine Pitrou0c759fe2011-04-27 19:28:05 +0200951}
952
Michael W. Hudson188d4362005-06-20 16:52:57 +0000953/* When a thread state is created for a thread by some mechanism other than
954 PyGILState_Ensure, it's important that the GILState machinery knows about
955 it so it doesn't try to create another thread state for the thread (this is
956 a better fix for SF bug #1010677 than the first one attempted).
957*/
Thomas Wouters89f507f2006-12-13 04:49:30 +0000958static void
Michael W. Hudson188d4362005-06-20 16:52:57 +0000959_PyGILState_NoteThreadState(PyThreadState* tstate)
960{
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900961 /* If autoTSSkey isn't initialized, this must be the very first
Antoine Pitrou079ce542010-09-08 12:37:10 +0000962 threadstate created in Py_Initialize(). Don't do anything for now
963 (we'll be back here when _PyGILState_Init is called). */
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600964 if (!_PyRuntime.gilstate.autoInterpreterState)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 return;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000966
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900967 /* Stick the thread state for this thread in thread specific storage.
Michael W. Hudson188d4362005-06-20 16:52:57 +0000968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 The only situation where you can legitimately have more than one
970 thread state for an OS level thread is when there are multiple
Victor Stinner590cebe2013-12-13 11:08:56 +0100971 interpreters.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000972
Victor Stinner590cebe2013-12-13 11:08:56 +0100973 You shouldn't really be using the PyGILState_ APIs anyway (see issues
974 #10915 and #15751).
Michael W. Hudson188d4362005-06-20 16:52:57 +0000975
Victor Stinner590cebe2013-12-13 11:08:56 +0100976 The first thread state created for that given OS level thread will
977 "win", which seems reasonable behaviour.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 */
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900979 if (PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey) == NULL) {
980 if ((PyThread_tss_set(&_PyRuntime.gilstate.autoTSSkey, (void *)tstate)
981 ) != 0)
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600982 {
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900983 Py_FatalError("Couldn't create autoTSSkey mapping");
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600984 }
Victor Stinner590cebe2013-12-13 11:08:56 +0100985 }
Michael W. Hudson188d4362005-06-20 16:52:57 +0000986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 /* PyGILState_Release must not try to delete this thread state. */
988 tstate->gilstate_counter = 1;
Michael W. Hudson188d4362005-06-20 16:52:57 +0000989}
990
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000991/* The public functions */
Tim Peters19717fa2004-10-09 17:38:29 +0000992PyThreadState *
993PyGILState_GetThisThreadState(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000994{
Eric Snow2ebc5ce2017-09-07 23:51:28 -0600995 if (_PyRuntime.gilstate.autoInterpreterState == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 return NULL;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900997 return (PyThreadState *)PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey);
Mark Hammond8d98d2c2003-04-19 15:41:53 +0000998}
999
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -07001000int
1001PyGILState_Check(void)
1002{
Victor Stinner8a1be612016-03-14 22:07:55 +01001003 PyThreadState *tstate;
1004
1005 if (!_PyGILState_check_enabled)
1006 return 1;
1007
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001008 if (!PyThread_tss_is_created(&_PyRuntime.gilstate.autoTSSkey)) {
Victor Stinner8a1be612016-03-14 22:07:55 +01001009 return 1;
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001010 }
Victor Stinner8a1be612016-03-14 22:07:55 +01001011
1012 tstate = GET_TSTATE();
1013 if (tstate == NULL)
1014 return 0;
1015
1016 return (tstate == PyGILState_GetThisThreadState());
Kristján Valur Jónsson684cd0e2013-03-23 03:36:16 -07001017}
1018
Tim Peters19717fa2004-10-09 17:38:29 +00001019PyGILState_STATE
1020PyGILState_Ensure(void)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001021{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 int current;
1023 PyThreadState *tcur;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001024 int need_init_threads = 0;
1025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 /* Note that we do not auto-init Python here - apart from
1027 potential races with 2 threads auto-initializing, pep-311
1028 spells out other issues. Embedders are expected to have
1029 called Py_Initialize() and usually PyEval_InitThreads().
1030 */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001031 /* Py_Initialize() hasn't been called! */
1032 assert(_PyRuntime.gilstate.autoInterpreterState);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001033
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001034 tcur = (PyThreadState *)PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 if (tcur == NULL) {
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001036 need_init_threads = 1;
Victor Stinner62ca1002013-12-13 01:46:43 +01001037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 /* Create a new thread state for this thread */
Eric Snow2ebc5ce2017-09-07 23:51:28 -06001039 tcur = PyThreadState_New(_PyRuntime.gilstate.autoInterpreterState);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 if (tcur == NULL)
1041 Py_FatalError("Couldn't create thread-state for new thread");
1042 /* This is our thread state! We'll need to delete it in the
1043 matching call to PyGILState_Release(). */
1044 tcur->gilstate_counter = 0;
1045 current = 0; /* new thread state is never current */
1046 }
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001047 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 current = PyThreadState_IsCurrent(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001049 }
1050
1051 if (current == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 PyEval_RestoreThread(tcur);
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001053 }
1054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 /* Update our counter in the thread-state - no need for locks:
1056 - tcur will remain valid as we hold the GIL.
1057 - the counter is safe as we are the only thread "allowed"
1058 to modify this value
1059 */
1060 ++tcur->gilstate_counter;
Victor Stinnerb4d1e1f2017-11-30 22:05:00 +01001061
1062 if (need_init_threads) {
1063 /* At startup, Python has no concrete GIL. If PyGILState_Ensure() is
1064 called from a new thread for the first time, we need the create the
1065 GIL. */
1066 PyEval_InitThreads();
1067 }
1068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001070}
1071
Tim Peters19717fa2004-10-09 17:38:29 +00001072void
1073PyGILState_Release(PyGILState_STATE oldstate)
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001074{
Masayuki Yamamoto731e1892017-10-06 19:41:34 +09001075 PyThreadState *tcur = (PyThreadState *)PyThread_tss_get(
1076 &_PyRuntime.gilstate.autoTSSkey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 if (tcur == NULL)
1078 Py_FatalError("auto-releasing thread-state, "
1079 "but no thread-state for this thread");
1080 /* We must hold the GIL and have our thread state current */
1081 /* XXX - remove the check - the assert should be fine,
1082 but while this is very new (April 2003), the extra check
1083 by release-only users can't hurt.
1084 */
1085 if (! PyThreadState_IsCurrent(tcur))
1086 Py_FatalError("This thread state must be current when releasing");
1087 assert(PyThreadState_IsCurrent(tcur));
1088 --tcur->gilstate_counter;
1089 assert(tcur->gilstate_counter >= 0); /* illegal counter value */
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 /* If we're going to destroy this thread-state, we must
1092 * clear it while the GIL is held, as destructors may run.
1093 */
1094 if (tcur->gilstate_counter == 0) {
1095 /* can't have been locked when we created it */
1096 assert(oldstate == PyGILState_UNLOCKED);
1097 PyThreadState_Clear(tcur);
1098 /* Delete the thread-state. Note this releases the GIL too!
1099 * It's vital that the GIL be held here, to avoid shutdown
1100 * races; see bugs 225673 and 1061968 (that nasty bug has a
1101 * habit of coming back).
1102 */
1103 PyThreadState_DeleteCurrent();
1104 }
1105 /* Release the lock if necessary */
1106 else if (oldstate == PyGILState_UNLOCKED)
1107 PyEval_SaveThread();
Mark Hammond8d98d2c2003-04-19 15:41:53 +00001108}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001109
Benjamin Peterson3bf01752012-04-13 18:06:36 -04001110
Eric Snow7f8bfc92018-01-29 18:23:44 -07001111/**************************/
1112/* cross-interpreter data */
1113/**************************/
1114
1115/* cross-interpreter data */
1116
1117crossinterpdatafunc _PyCrossInterpreterData_Lookup(PyObject *);
1118
1119/* This is a separate func from _PyCrossInterpreterData_Lookup in order
1120 to keep the registry code separate. */
1121static crossinterpdatafunc
1122_lookup_getdata(PyObject *obj)
1123{
1124 crossinterpdatafunc getdata = _PyCrossInterpreterData_Lookup(obj);
1125 if (getdata == NULL && PyErr_Occurred() == 0)
1126 PyErr_Format(PyExc_ValueError,
1127 "%S does not support cross-interpreter data", obj);
1128 return getdata;
1129}
1130
1131int
1132_PyObject_CheckCrossInterpreterData(PyObject *obj)
1133{
1134 crossinterpdatafunc getdata = _lookup_getdata(obj);
1135 if (getdata == NULL) {
1136 return -1;
1137 }
1138 return 0;
1139}
1140
1141static int
1142_check_xidata(_PyCrossInterpreterData *data)
1143{
1144 // data->data can be anything, including NULL, so we don't check it.
1145
1146 // data->obj may be NULL, so we don't check it.
1147
1148 if (data->interp < 0) {
1149 PyErr_SetString(PyExc_SystemError, "missing interp");
1150 return -1;
1151 }
1152
1153 if (data->new_object == NULL) {
1154 PyErr_SetString(PyExc_SystemError, "missing new_object func");
1155 return -1;
1156 }
1157
1158 // data->free may be NULL, so we don't check it.
1159
1160 return 0;
1161}
1162
1163int
1164_PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data)
1165{
1166 PyThreadState *tstate = PyThreadState_Get();
1167 // PyThreadState_Get() aborts if lookup fails, so we don't need
1168 // to check the result for NULL.
1169 PyInterpreterState *interp = tstate->interp;
1170
1171 // Reset data before re-populating.
1172 *data = (_PyCrossInterpreterData){0};
1173 data->free = PyMem_RawFree; // Set a default that may be overridden.
1174
1175 // Call the "getdata" func for the object.
1176 Py_INCREF(obj);
1177 crossinterpdatafunc getdata = _lookup_getdata(obj);
1178 if (getdata == NULL) {
1179 Py_DECREF(obj);
1180 return -1;
1181 }
1182 int res = getdata(obj, data);
1183 Py_DECREF(obj);
1184 if (res != 0) {
1185 return -1;
1186 }
1187
1188 // Fill in the blanks and validate the result.
1189 Py_XINCREF(data->obj);
1190 data->interp = interp->id;
1191 if (_check_xidata(data) != 0) {
1192 _PyCrossInterpreterData_Release(data);
1193 return -1;
1194 }
1195
1196 return 0;
1197}
1198
1199void
1200_PyCrossInterpreterData_Release(_PyCrossInterpreterData *data)
1201{
1202 if (data->data == NULL && data->obj == NULL) {
1203 // Nothing to release!
1204 return;
1205 }
1206
1207 // Switch to the original interpreter.
1208 PyInterpreterState *interp = _PyInterpreterState_LookUpID(data->interp);
1209 if (interp == NULL) {
1210 // The intepreter was already destroyed.
1211 if (data->free != NULL) {
1212 // XXX Someone leaked some memory...
1213 }
1214 return;
1215 }
1216 PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
1217 PyThreadState *save_tstate = PyThreadState_Swap(tstate);
1218
1219 // "Release" the data and/or the object.
1220 if (data->free != NULL) {
1221 data->free(data->data);
1222 }
1223 Py_XDECREF(data->obj);
1224
1225 // Switch back.
1226 if (save_tstate != NULL)
1227 PyThreadState_Swap(save_tstate);
1228}
1229
1230PyObject *
1231_PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *data)
1232{
1233 return data->new_object(data);
1234}
1235
1236/* registry of {type -> crossinterpdatafunc} */
1237
1238/* For now we use a global registry of shareable classes. An
1239 alternative would be to add a tp_* slot for a class's
1240 crossinterpdatafunc. It would be simpler and more efficient. */
1241
1242static int
1243_register_xidata(PyTypeObject *cls, crossinterpdatafunc getdata)
1244{
1245 // Note that we effectively replace already registered classes
1246 // rather than failing.
1247 struct _xidregitem *newhead = PyMem_RawMalloc(sizeof(struct _xidregitem));
1248 if (newhead == NULL)
1249 return -1;
1250 newhead->cls = cls;
1251 newhead->getdata = getdata;
1252 newhead->next = _PyRuntime.xidregistry.head;
1253 _PyRuntime.xidregistry.head = newhead;
1254 return 0;
1255}
1256
1257static void _register_builtins_for_crossinterpreter_data(void);
1258
1259int
1260_PyCrossInterpreterData_Register_Class(PyTypeObject *cls,
1261 crossinterpdatafunc getdata)
1262{
1263 if (!PyType_Check(cls)) {
1264 PyErr_Format(PyExc_ValueError, "only classes may be registered");
1265 return -1;
1266 }
1267 if (getdata == NULL) {
1268 PyErr_Format(PyExc_ValueError, "missing 'getdata' func");
1269 return -1;
1270 }
1271
1272 // Make sure the class isn't ever deallocated.
1273 Py_INCREF((PyObject *)cls);
1274
1275 PyThread_acquire_lock(_PyRuntime.xidregistry.mutex, WAIT_LOCK);
1276 if (_PyRuntime.xidregistry.head == NULL) {
1277 _register_builtins_for_crossinterpreter_data();
1278 }
1279 int res = _register_xidata(cls, getdata);
1280 PyThread_release_lock(_PyRuntime.xidregistry.mutex);
1281 return res;
1282}
1283
1284crossinterpdatafunc
1285_PyCrossInterpreterData_Lookup(PyObject *obj)
1286{
1287 PyObject *cls = PyObject_Type(obj);
1288 crossinterpdatafunc getdata = NULL;
1289 PyThread_acquire_lock(_PyRuntime.xidregistry.mutex, WAIT_LOCK);
1290 struct _xidregitem *cur = _PyRuntime.xidregistry.head;
1291 if (cur == NULL) {
1292 _register_builtins_for_crossinterpreter_data();
1293 cur = _PyRuntime.xidregistry.head;
1294 }
1295 for(; cur != NULL; cur = cur->next) {
1296 if (cur->cls == (PyTypeObject *)cls) {
1297 getdata = cur->getdata;
1298 break;
1299 }
1300 }
Eric Snow4e9da0d2018-02-02 21:49:49 -07001301 Py_DECREF(cls);
Eric Snow7f8bfc92018-01-29 18:23:44 -07001302 PyThread_release_lock(_PyRuntime.xidregistry.mutex);
1303 return getdata;
1304}
1305
1306/* cross-interpreter data for builtin types */
1307
1308static PyObject *
1309_new_bytes_object(_PyCrossInterpreterData *data)
1310{
1311 return PyBytes_FromString((char *)(data->data));
1312}
1313
1314static int
1315_bytes_shared(PyObject *obj, _PyCrossInterpreterData *data)
1316{
1317 data->data = (void *)(PyBytes_AS_STRING(obj));
1318 data->obj = obj; // Will be "released" (decref'ed) when data released.
1319 data->new_object = _new_bytes_object;
1320 data->free = NULL; // Do not free the data (it belongs to the object).
1321 return 0;
1322}
1323
1324static PyObject *
1325_new_none_object(_PyCrossInterpreterData *data)
1326{
1327 // XXX Singleton refcounts are problematic across interpreters...
1328 Py_INCREF(Py_None);
1329 return Py_None;
1330}
1331
1332static int
1333_none_shared(PyObject *obj, _PyCrossInterpreterData *data)
1334{
1335 data->data = NULL;
1336 // data->obj remains NULL
1337 data->new_object = _new_none_object;
1338 data->free = NULL; // There is nothing to free.
1339 return 0;
1340}
1341
1342static void
1343_register_builtins_for_crossinterpreter_data(void)
1344{
1345 // None
1346 if (_register_xidata((PyTypeObject *)PyObject_Type(Py_None), _none_shared) != 0) {
1347 Py_FatalError("could not register None for cross-interpreter sharing");
1348 }
1349
1350 // bytes
1351 if (_register_xidata(&PyBytes_Type, _bytes_shared) != 0) {
1352 Py_FatalError("could not register bytes for cross-interpreter sharing");
1353 }
1354}
1355
1356
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001357#ifdef __cplusplus
1358}
1359#endif