1
2 /* Thread and interpreter state structures and their interfaces */
3
4 #include "Python.h"
5 #include "pycore_ceval.h"
6 #include "pycore_initconfig.h"
7 #include "pycore_pyerrors.h"
8 #include "pycore_pylifecycle.h"
9 #include "pycore_pymem.h" // _PyMem_SetDefaultAllocator()
10 #include "pycore_pystate.h" // _PyThreadState_GET()
11 #include "pycore_sysmodule.h"
12
13 /* --------------------------------------------------------------------------
14 CAUTION
15
16 Always use PyMem_RawMalloc() and PyMem_RawFree() directly in this file. A
17 number of these functions are advertised as safe to call when the GIL isn't
18 held, and in a debug build Python redirects (e.g.) PyMem_NEW (etc) to Python's
19 debugging obmalloc functions. Those aren't thread-safe (they rely on the GIL
20 to avoid the expense of doing their own locking).
21 -------------------------------------------------------------------------- */
22
23 #ifdef HAVE_DLOPEN
24 #ifdef HAVE_DLFCN_H
25 #include <dlfcn.h>
26 #endif
27 #if !HAVE_DECL_RTLD_LAZY
28 #define RTLD_LAZY 1
29 #endif
30 #endif
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35
36 #define _PyRuntimeGILState_GetThreadState(gilstate) \
37 ((PyThreadState*)_Py_atomic_load_relaxed(&(gilstate)->tstate_current))
38 #define _PyRuntimeGILState_SetThreadState(gilstate, value) \
39 _Py_atomic_store_relaxed(&(gilstate)->tstate_current, \
40 (uintptr_t)(value))
41
42 /* Forward declarations */
43 static PyThreadState *_PyGILState_GetThisThreadState(struct _gilstate_runtime_state *gilstate);
44 static void _PyThreadState_Delete(PyThreadState *tstate, int check_current);
45
46
47 static PyStatus
_PyRuntimeState_Init_impl(_PyRuntimeState * runtime)48 _PyRuntimeState_Init_impl(_PyRuntimeState *runtime)
49 {
50 /* We preserve the hook across init, because there is
51 currently no public API to set it between runtime
52 initialization and interpreter initialization. */
53 void *open_code_hook = runtime->open_code_hook;
54 void *open_code_userdata = runtime->open_code_userdata;
55 _Py_AuditHookEntry *audit_hook_head = runtime->audit_hook_head;
56
57 memset(runtime, 0, sizeof(*runtime));
58
59 runtime->open_code_hook = open_code_hook;
60 runtime->open_code_userdata = open_code_userdata;
61 runtime->audit_hook_head = audit_hook_head;
62
63 _PyEval_InitRuntimeState(&runtime->ceval);
64
65 PyPreConfig_InitPythonConfig(&runtime->preconfig);
66
67 runtime->gilstate.check_enabled = 1;
68
69 /* A TSS key must be initialized with Py_tss_NEEDS_INIT
70 in accordance with the specification. */
71 Py_tss_t initial = Py_tss_NEEDS_INIT;
72 runtime->gilstate.autoTSSkey = initial;
73
74 runtime->interpreters.mutex = PyThread_allocate_lock();
75 if (runtime->interpreters.mutex == NULL) {
76 return _PyStatus_ERR("Can't initialize threads for interpreter");
77 }
78 runtime->interpreters.next_id = -1;
79
80 runtime->xidregistry.mutex = PyThread_allocate_lock();
81 if (runtime->xidregistry.mutex == NULL) {
82 return _PyStatus_ERR("Can't initialize threads for cross-interpreter data registry");
83 }
84
85 // Set it to the ID of the main thread of the main interpreter.
86 runtime->main_thread = PyThread_get_thread_ident();
87
88 return _PyStatus_OK();
89 }
90
91 PyStatus
_PyRuntimeState_Init(_PyRuntimeState * runtime)92 _PyRuntimeState_Init(_PyRuntimeState *runtime)
93 {
94 /* Force default allocator, since _PyRuntimeState_Fini() must
95 use the same allocator than this function. */
96 PyMemAllocatorEx old_alloc;
97 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
98
99 PyStatus status = _PyRuntimeState_Init_impl(runtime);
100
101 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
102 return status;
103 }
104
105 void
_PyRuntimeState_Fini(_PyRuntimeState * runtime)106 _PyRuntimeState_Fini(_PyRuntimeState *runtime)
107 {
108 /* Force the allocator used by _PyRuntimeState_Init(). */
109 PyMemAllocatorEx old_alloc;
110 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
111
112 if (runtime->interpreters.mutex != NULL) {
113 PyThread_free_lock(runtime->interpreters.mutex);
114 runtime->interpreters.mutex = NULL;
115 }
116
117 if (runtime->xidregistry.mutex != NULL) {
118 PyThread_free_lock(runtime->xidregistry.mutex);
119 runtime->xidregistry.mutex = NULL;
120 }
121
122 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
123 }
124
125 #ifdef HAVE_FORK
126 /* This function is called from PyOS_AfterFork_Child to ensure that
127 * newly created child processes do not share locks with the parent.
128 */
129
130 void
_PyRuntimeState_ReInitThreads(_PyRuntimeState * runtime)131 _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime)
132 {
133 // This was initially set in _PyRuntimeState_Init().
134 runtime->main_thread = PyThread_get_thread_ident();
135
136 /* Force default allocator, since _PyRuntimeState_Fini() must
137 use the same allocator than this function. */
138 PyMemAllocatorEx old_alloc;
139 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
140
141 int interp_mutex = _PyThread_at_fork_reinit(&runtime->interpreters.mutex);
142 int main_interp_id_mutex = _PyThread_at_fork_reinit(&runtime->interpreters.main->id_mutex);
143 int xidregistry_mutex = _PyThread_at_fork_reinit(&runtime->xidregistry.mutex);
144
145 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
146
147 if (interp_mutex < 0) {
148 Py_FatalError("Can't initialize lock for runtime interpreters");
149 }
150
151 if (main_interp_id_mutex < 0) {
152 Py_FatalError("Can't initialize ID lock for main interpreter");
153 }
154
155 if (xidregistry_mutex < 0) {
156 Py_FatalError("Can't initialize lock for cross-interpreter data registry");
157 }
158 }
159 #endif
160
161 #define HEAD_LOCK(runtime) \
162 PyThread_acquire_lock((runtime)->interpreters.mutex, WAIT_LOCK)
163 #define HEAD_UNLOCK(runtime) \
164 PyThread_release_lock((runtime)->interpreters.mutex)
165
166 /* Forward declaration */
167 static void _PyGILState_NoteThreadState(
168 struct _gilstate_runtime_state *gilstate, PyThreadState* tstate);
169
170 PyStatus
_PyInterpreterState_Enable(_PyRuntimeState * runtime)171 _PyInterpreterState_Enable(_PyRuntimeState *runtime)
172 {
173 struct pyinterpreters *interpreters = &runtime->interpreters;
174 interpreters->next_id = 0;
175
176 /* Py_Finalize() calls _PyRuntimeState_Fini() which clears the mutex.
177 Create a new mutex if needed. */
178 if (interpreters->mutex == NULL) {
179 /* Force default allocator, since _PyRuntimeState_Fini() must
180 use the same allocator than this function. */
181 PyMemAllocatorEx old_alloc;
182 _PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
183
184 interpreters->mutex = PyThread_allocate_lock();
185
186 PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
187
188 if (interpreters->mutex == NULL) {
189 return _PyStatus_ERR("Can't initialize threads for interpreter");
190 }
191 }
192
193 return _PyStatus_OK();
194 }
195
196 PyInterpreterState *
PyInterpreterState_New(void)197 PyInterpreterState_New(void)
198 {
199 PyThreadState *tstate = _PyThreadState_GET();
200 /* tstate is NULL when Py_InitializeFromConfig() calls
201 PyInterpreterState_New() to create the main interpreter. */
202 if (_PySys_Audit(tstate, "cpython.PyInterpreterState_New", NULL) < 0) {
203 return NULL;
204 }
205
206 PyInterpreterState *interp = PyMem_RawCalloc(1, sizeof(PyInterpreterState));
207 if (interp == NULL) {
208 return NULL;
209 }
210
211 interp->id_refcount = -1;
212
213 /* Don't get runtime from tstate since tstate can be NULL */
214 _PyRuntimeState *runtime = &_PyRuntime;
215 interp->runtime = runtime;
216
217 if (_PyEval_InitState(&interp->ceval) < 0) {
218 goto out_of_memory;
219 }
220
221 _PyGC_InitState(&interp->gc);
222 PyConfig_InitPythonConfig(&interp->config);
223
224 interp->eval_frame = _PyEval_EvalFrameDefault;
225 #ifdef HAVE_DLOPEN
226 #if HAVE_DECL_RTLD_NOW
227 interp->dlopenflags = RTLD_NOW;
228 #else
229 interp->dlopenflags = RTLD_LAZY;
230 #endif
231 #endif
232
233 struct pyinterpreters *interpreters = &runtime->interpreters;
234
235 HEAD_LOCK(runtime);
236 if (interpreters->next_id < 0) {
237 /* overflow or Py_Initialize() not called! */
238 if (tstate != NULL) {
239 _PyErr_SetString(tstate, PyExc_RuntimeError,
240 "failed to get an interpreter ID");
241 }
242 PyMem_RawFree(interp);
243 interp = NULL;
244 }
245 else {
246 interp->id = interpreters->next_id;
247 interpreters->next_id += 1;
248 interp->next = interpreters->head;
249 if (interpreters->main == NULL) {
250 interpreters->main = interp;
251 }
252 interpreters->head = interp;
253 }
254 HEAD_UNLOCK(runtime);
255
256 if (interp == NULL) {
257 return NULL;
258 }
259
260 interp->tstate_next_unique_id = 0;
261
262 interp->audit_hooks = NULL;
263
264 return interp;
265
266 out_of_memory:
267 if (tstate != NULL) {
268 _PyErr_NoMemory(tstate);
269 }
270
271 PyMem_RawFree(interp);
272 return NULL;
273 }
274
275
276 void
PyInterpreterState_Clear(PyInterpreterState * interp)277 PyInterpreterState_Clear(PyInterpreterState *interp)
278 {
279 _PyRuntimeState *runtime = interp->runtime;
280
281 /* Use the current Python thread state to call audit hooks,
282 not the current Python thread state of 'interp'. */
283 PyThreadState *tstate = _PyThreadState_GET();
284 if (_PySys_Audit(tstate, "cpython.PyInterpreterState_Clear", NULL) < 0) {
285 _PyErr_Clear(tstate);
286 }
287
288 HEAD_LOCK(runtime);
289 for (PyThreadState *p = interp->tstate_head; p != NULL; p = p->next) {
290 PyThreadState_Clear(p);
291 }
292 HEAD_UNLOCK(runtime);
293
294 Py_CLEAR(interp->audit_hooks);
295
296 PyConfig_Clear(&interp->config);
297 Py_CLEAR(interp->codec_search_path);
298 Py_CLEAR(interp->codec_search_cache);
299 Py_CLEAR(interp->codec_error_registry);
300 Py_CLEAR(interp->modules);
301 Py_CLEAR(interp->modules_by_index);
302 Py_CLEAR(interp->sysdict);
303 Py_CLEAR(interp->builtins);
304 Py_CLEAR(interp->builtins_copy);
305 Py_CLEAR(interp->importlib);
306 Py_CLEAR(interp->import_func);
307 Py_CLEAR(interp->dict);
308 #ifdef HAVE_FORK
309 Py_CLEAR(interp->before_forkers);
310 Py_CLEAR(interp->after_forkers_parent);
311 Py_CLEAR(interp->after_forkers_child);
312 #endif
313 if (_PyRuntimeState_GetFinalizing(runtime) == NULL) {
314 _PyWarnings_Fini(interp);
315 }
316 // XXX Once we have one allocator per interpreter (i.e.
317 // per-interpreter GC) we must ensure that all of the interpreter's
318 // objects have been cleaned up at the point.
319 }
320
321
322 static void
zapthreads(PyInterpreterState * interp,int check_current)323 zapthreads(PyInterpreterState *interp, int check_current)
324 {
325 PyThreadState *tstate;
326 /* No need to lock the mutex here because this should only happen
327 when the threads are all really dead (XXX famous last words). */
328 while ((tstate = interp->tstate_head) != NULL) {
329 _PyThreadState_Delete(tstate, check_current);
330 }
331 }
332
333
334 void
PyInterpreterState_Delete(PyInterpreterState * interp)335 PyInterpreterState_Delete(PyInterpreterState *interp)
336 {
337 _PyRuntimeState *runtime = interp->runtime;
338 struct pyinterpreters *interpreters = &runtime->interpreters;
339 zapthreads(interp, 0);
340
341 _PyEval_FiniState(&interp->ceval);
342
343 /* Delete current thread. After this, many C API calls become crashy. */
344 _PyThreadState_Swap(&runtime->gilstate, NULL);
345
346 HEAD_LOCK(runtime);
347 PyInterpreterState **p;
348 for (p = &interpreters->head; ; p = &(*p)->next) {
349 if (*p == NULL) {
350 Py_FatalError("NULL interpreter");
351 }
352 if (*p == interp) {
353 break;
354 }
355 }
356 if (interp->tstate_head != NULL) {
357 Py_FatalError("remaining threads");
358 }
359 *p = interp->next;
360
361 if (interpreters->main == interp) {
362 interpreters->main = NULL;
363 if (interpreters->head != NULL) {
364 Py_FatalError("remaining subinterpreters");
365 }
366 }
367 HEAD_UNLOCK(runtime);
368
369 if (interp->id_mutex != NULL) {
370 PyThread_free_lock(interp->id_mutex);
371 }
372 PyMem_RawFree(interp);
373 }
374
375
376 /*
377 * Delete all interpreter states except the main interpreter. If there
378 * is a current interpreter state, it *must* be the main interpreter.
379 */
380 void
_PyInterpreterState_DeleteExceptMain(_PyRuntimeState * runtime)381 _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime)
382 {
383 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
384 struct pyinterpreters *interpreters = &runtime->interpreters;
385
386 PyThreadState *tstate = _PyThreadState_Swap(gilstate, NULL);
387 if (tstate != NULL && tstate->interp != interpreters->main) {
388 Py_FatalError("not main interpreter");
389 }
390
391 HEAD_LOCK(runtime);
392 PyInterpreterState *interp = interpreters->head;
393 interpreters->head = NULL;
394 while (interp != NULL) {
395 if (interp == interpreters->main) {
396 interpreters->main->next = NULL;
397 interpreters->head = interp;
398 interp = interp->next;
399 continue;
400 }
401
402 PyInterpreterState_Clear(interp); // XXX must activate?
403 zapthreads(interp, 1);
404 if (interp->id_mutex != NULL) {
405 PyThread_free_lock(interp->id_mutex);
406 }
407 PyInterpreterState *prev_interp = interp;
408 interp = interp->next;
409 PyMem_RawFree(prev_interp);
410 }
411 HEAD_UNLOCK(runtime);
412
413 if (interpreters->head == NULL) {
414 Py_FatalError("missing main interpreter");
415 }
416 _PyThreadState_Swap(gilstate, tstate);
417 }
418
419
420 PyInterpreterState *
PyInterpreterState_Get(void)421 PyInterpreterState_Get(void)
422 {
423 PyThreadState *tstate = _PyThreadState_GET();
424 _Py_EnsureTstateNotNULL(tstate);
425 PyInterpreterState *interp = tstate->interp;
426 if (interp == NULL) {
427 Py_FatalError("no current interpreter");
428 }
429 return interp;
430 }
431
432
433 int64_t
PyInterpreterState_GetID(PyInterpreterState * interp)434 PyInterpreterState_GetID(PyInterpreterState *interp)
435 {
436 if (interp == NULL) {
437 PyErr_SetString(PyExc_RuntimeError, "no interpreter provided");
438 return -1;
439 }
440 return interp->id;
441 }
442
443
444 static PyInterpreterState *
interp_look_up_id(_PyRuntimeState * runtime,int64_t requested_id)445 interp_look_up_id(_PyRuntimeState *runtime, int64_t requested_id)
446 {
447 PyInterpreterState *interp = runtime->interpreters.head;
448 while (interp != NULL) {
449 int64_t id = PyInterpreterState_GetID(interp);
450 if (id < 0) {
451 return NULL;
452 }
453 if (requested_id == id) {
454 return interp;
455 }
456 interp = PyInterpreterState_Next(interp);
457 }
458 return NULL;
459 }
460
461 PyInterpreterState *
_PyInterpreterState_LookUpID(int64_t requested_id)462 _PyInterpreterState_LookUpID(int64_t requested_id)
463 {
464 PyInterpreterState *interp = NULL;
465 if (requested_id >= 0) {
466 _PyRuntimeState *runtime = &_PyRuntime;
467 HEAD_LOCK(runtime);
468 interp = interp_look_up_id(runtime, requested_id);
469 HEAD_UNLOCK(runtime);
470 }
471 if (interp == NULL && !PyErr_Occurred()) {
472 PyErr_Format(PyExc_RuntimeError,
473 "unrecognized interpreter ID %lld", requested_id);
474 }
475 return interp;
476 }
477
478
479 int
_PyInterpreterState_IDInitref(PyInterpreterState * interp)480 _PyInterpreterState_IDInitref(PyInterpreterState *interp)
481 {
482 if (interp->id_mutex != NULL) {
483 return 0;
484 }
485 interp->id_mutex = PyThread_allocate_lock();
486 if (interp->id_mutex == NULL) {
487 PyErr_SetString(PyExc_RuntimeError,
488 "failed to create init interpreter ID mutex");
489 return -1;
490 }
491 interp->id_refcount = 0;
492 return 0;
493 }
494
495
496 void
_PyInterpreterState_IDIncref(PyInterpreterState * interp)497 _PyInterpreterState_IDIncref(PyInterpreterState *interp)
498 {
499 if (interp->id_mutex == NULL) {
500 return;
501 }
502 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
503 interp->id_refcount += 1;
504 PyThread_release_lock(interp->id_mutex);
505 }
506
507
508 void
_PyInterpreterState_IDDecref(PyInterpreterState * interp)509 _PyInterpreterState_IDDecref(PyInterpreterState *interp)
510 {
511 if (interp->id_mutex == NULL) {
512 return;
513 }
514 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
515 PyThread_acquire_lock(interp->id_mutex, WAIT_LOCK);
516 assert(interp->id_refcount != 0);
517 interp->id_refcount -= 1;
518 int64_t refcount = interp->id_refcount;
519 PyThread_release_lock(interp->id_mutex);
520
521 if (refcount == 0 && interp->requires_idref) {
522 // XXX Using the "head" thread isn't strictly correct.
523 PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
524 // XXX Possible GILState issues?
525 PyThreadState *save_tstate = _PyThreadState_Swap(gilstate, tstate);
526 Py_EndInterpreter(tstate);
527 _PyThreadState_Swap(gilstate, save_tstate);
528 }
529 }
530
531 int
_PyInterpreterState_RequiresIDRef(PyInterpreterState * interp)532 _PyInterpreterState_RequiresIDRef(PyInterpreterState *interp)
533 {
534 return interp->requires_idref;
535 }
536
537 void
_PyInterpreterState_RequireIDRef(PyInterpreterState * interp,int required)538 _PyInterpreterState_RequireIDRef(PyInterpreterState *interp, int required)
539 {
540 interp->requires_idref = required ? 1 : 0;
541 }
542
543 PyObject *
_PyInterpreterState_GetMainModule(PyInterpreterState * interp)544 _PyInterpreterState_GetMainModule(PyInterpreterState *interp)
545 {
546 if (interp->modules == NULL) {
547 PyErr_SetString(PyExc_RuntimeError, "interpreter not initialized");
548 return NULL;
549 }
550 return PyMapping_GetItemString(interp->modules, "__main__");
551 }
552
553 PyObject *
PyInterpreterState_GetDict(PyInterpreterState * interp)554 PyInterpreterState_GetDict(PyInterpreterState *interp)
555 {
556 if (interp->dict == NULL) {
557 interp->dict = PyDict_New();
558 if (interp->dict == NULL) {
559 PyErr_Clear();
560 }
561 }
562 /* Returning NULL means no per-interpreter dict is available. */
563 return interp->dict;
564 }
565
566 static PyThreadState *
new_threadstate(PyInterpreterState * interp,int init)567 new_threadstate(PyInterpreterState *interp, int init)
568 {
569 _PyRuntimeState *runtime = interp->runtime;
570 PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState));
571 if (tstate == NULL) {
572 return NULL;
573 }
574
575 tstate->interp = interp;
576
577 tstate->frame = NULL;
578 tstate->recursion_depth = 0;
579 tstate->overflowed = 0;
580 tstate->recursion_critical = 0;
581 tstate->stackcheck_counter = 0;
582 tstate->tracing = 0;
583 tstate->use_tracing = 0;
584 tstate->gilstate_counter = 0;
585 tstate->async_exc = NULL;
586 tstate->thread_id = PyThread_get_thread_ident();
587
588 tstate->dict = NULL;
589
590 tstate->curexc_type = NULL;
591 tstate->curexc_value = NULL;
592 tstate->curexc_traceback = NULL;
593
594 tstate->exc_state.exc_type = NULL;
595 tstate->exc_state.exc_value = NULL;
596 tstate->exc_state.exc_traceback = NULL;
597 tstate->exc_state.previous_item = NULL;
598 tstate->exc_info = &tstate->exc_state;
599
600 tstate->c_profilefunc = NULL;
601 tstate->c_tracefunc = NULL;
602 tstate->c_profileobj = NULL;
603 tstate->c_traceobj = NULL;
604
605 tstate->trash_delete_nesting = 0;
606 tstate->trash_delete_later = NULL;
607 tstate->on_delete = NULL;
608 tstate->on_delete_data = NULL;
609
610 tstate->coroutine_origin_tracking_depth = 0;
611
612 tstate->async_gen_firstiter = NULL;
613 tstate->async_gen_finalizer = NULL;
614
615 tstate->context = NULL;
616 tstate->context_ver = 1;
617
618 if (init) {
619 _PyThreadState_Init(tstate);
620 }
621
622 HEAD_LOCK(runtime);
623 tstate->id = ++interp->tstate_next_unique_id;
624 tstate->prev = NULL;
625 tstate->next = interp->tstate_head;
626 if (tstate->next)
627 tstate->next->prev = tstate;
628 interp->tstate_head = tstate;
629 HEAD_UNLOCK(runtime);
630
631 return tstate;
632 }
633
634 PyThreadState *
PyThreadState_New(PyInterpreterState * interp)635 PyThreadState_New(PyInterpreterState *interp)
636 {
637 return new_threadstate(interp, 1);
638 }
639
640 PyThreadState *
_PyThreadState_Prealloc(PyInterpreterState * interp)641 _PyThreadState_Prealloc(PyInterpreterState *interp)
642 {
643 return new_threadstate(interp, 0);
644 }
645
646 void
_PyThreadState_Init(PyThreadState * tstate)647 _PyThreadState_Init(PyThreadState *tstate)
648 {
649 _PyGILState_NoteThreadState(&tstate->interp->runtime->gilstate, tstate);
650 }
651
652 PyObject*
PyState_FindModule(struct PyModuleDef * module)653 PyState_FindModule(struct PyModuleDef* module)
654 {
655 Py_ssize_t index = module->m_base.m_index;
656 PyInterpreterState *state = _PyInterpreterState_GET();
657 PyObject *res;
658 if (module->m_slots) {
659 return NULL;
660 }
661 if (index == 0)
662 return NULL;
663 if (state->modules_by_index == NULL)
664 return NULL;
665 if (index >= PyList_GET_SIZE(state->modules_by_index))
666 return NULL;
667 res = PyList_GET_ITEM(state->modules_by_index, index);
668 return res==Py_None ? NULL : res;
669 }
670
671 int
_PyState_AddModule(PyThreadState * tstate,PyObject * module,struct PyModuleDef * def)672 _PyState_AddModule(PyThreadState *tstate, PyObject* module, struct PyModuleDef* def)
673 {
674 if (!def) {
675 assert(_PyErr_Occurred(tstate));
676 return -1;
677 }
678 if (def->m_slots) {
679 _PyErr_SetString(tstate,
680 PyExc_SystemError,
681 "PyState_AddModule called on module with slots");
682 return -1;
683 }
684
685 PyInterpreterState *interp = tstate->interp;
686 if (!interp->modules_by_index) {
687 interp->modules_by_index = PyList_New(0);
688 if (!interp->modules_by_index) {
689 return -1;
690 }
691 }
692
693 while (PyList_GET_SIZE(interp->modules_by_index) <= def->m_base.m_index) {
694 if (PyList_Append(interp->modules_by_index, Py_None) < 0) {
695 return -1;
696 }
697 }
698
699 Py_INCREF(module);
700 return PyList_SetItem(interp->modules_by_index,
701 def->m_base.m_index, module);
702 }
703
704 int
PyState_AddModule(PyObject * module,struct PyModuleDef * def)705 PyState_AddModule(PyObject* module, struct PyModuleDef* def)
706 {
707 if (!def) {
708 Py_FatalError("module definition is NULL");
709 return -1;
710 }
711
712 PyThreadState *tstate = _PyThreadState_GET();
713 PyInterpreterState *interp = tstate->interp;
714 Py_ssize_t index = def->m_base.m_index;
715 if (interp->modules_by_index &&
716 index < PyList_GET_SIZE(interp->modules_by_index) &&
717 module == PyList_GET_ITEM(interp->modules_by_index, index))
718 {
719 _Py_FatalErrorFormat(__func__, "module %p already added", module);
720 return -1;
721 }
722 return _PyState_AddModule(tstate, module, def);
723 }
724
725 int
PyState_RemoveModule(struct PyModuleDef * def)726 PyState_RemoveModule(struct PyModuleDef* def)
727 {
728 PyThreadState *tstate = _PyThreadState_GET();
729 PyInterpreterState *interp = tstate->interp;
730
731 if (def->m_slots) {
732 _PyErr_SetString(tstate,
733 PyExc_SystemError,
734 "PyState_RemoveModule called on module with slots");
735 return -1;
736 }
737
738 Py_ssize_t index = def->m_base.m_index;
739 if (index == 0) {
740 Py_FatalError("invalid module index");
741 }
742 if (interp->modules_by_index == NULL) {
743 Py_FatalError("Interpreters module-list not accessible.");
744 }
745 if (index > PyList_GET_SIZE(interp->modules_by_index)) {
746 Py_FatalError("Module index out of bounds.");
747 }
748
749 Py_INCREF(Py_None);
750 return PyList_SetItem(interp->modules_by_index, index, Py_None);
751 }
752
753 /* Used by PyImport_Cleanup() */
754 void
_PyInterpreterState_ClearModules(PyInterpreterState * interp)755 _PyInterpreterState_ClearModules(PyInterpreterState *interp)
756 {
757 if (!interp->modules_by_index) {
758 return;
759 }
760
761 Py_ssize_t i;
762 for (i = 0; i < PyList_GET_SIZE(interp->modules_by_index); i++) {
763 PyObject *m = PyList_GET_ITEM(interp->modules_by_index, i);
764 if (PyModule_Check(m)) {
765 /* cleanup the saved copy of module dicts */
766 PyModuleDef *md = PyModule_GetDef(m);
767 if (md) {
768 Py_CLEAR(md->m_base.m_copy);
769 }
770 }
771 }
772
773 /* Setting modules_by_index to NULL could be dangerous, so we
774 clear the list instead. */
775 if (PyList_SetSlice(interp->modules_by_index,
776 0, PyList_GET_SIZE(interp->modules_by_index),
777 NULL)) {
778 PyErr_WriteUnraisable(interp->modules_by_index);
779 }
780 }
781
782 void
PyThreadState_Clear(PyThreadState * tstate)783 PyThreadState_Clear(PyThreadState *tstate)
784 {
785 int verbose = _PyInterpreterState_GetConfig(tstate->interp)->verbose;
786
787 if (verbose && tstate->frame != NULL) {
788 /* bpo-20526: After the main thread calls
789 _PyRuntimeState_SetFinalizing() in Py_FinalizeEx(), threads must
790 exit when trying to take the GIL. If a thread exit in the middle of
791 _PyEval_EvalFrameDefault(), tstate->frame is not reset to its
792 previous value. It is more likely with daemon threads, but it can
793 happen with regular threads if threading._shutdown() fails
794 (ex: interrupted by CTRL+C). */
795 fprintf(stderr,
796 "PyThreadState_Clear: warning: thread still has a frame\n");
797 }
798
799 /* Don't clear tstate->frame: it is a borrowed reference */
800
801 Py_CLEAR(tstate->dict);
802 Py_CLEAR(tstate->async_exc);
803
804 Py_CLEAR(tstate->curexc_type);
805 Py_CLEAR(tstate->curexc_value);
806 Py_CLEAR(tstate->curexc_traceback);
807
808 Py_CLEAR(tstate->exc_state.exc_type);
809 Py_CLEAR(tstate->exc_state.exc_value);
810 Py_CLEAR(tstate->exc_state.exc_traceback);
811
812 /* The stack of exception states should contain just this thread. */
813 if (verbose && tstate->exc_info != &tstate->exc_state) {
814 fprintf(stderr,
815 "PyThreadState_Clear: warning: thread still has a generator\n");
816 }
817
818 tstate->c_profilefunc = NULL;
819 tstate->c_tracefunc = NULL;
820 Py_CLEAR(tstate->c_profileobj);
821 Py_CLEAR(tstate->c_traceobj);
822
823 Py_CLEAR(tstate->async_gen_firstiter);
824 Py_CLEAR(tstate->async_gen_finalizer);
825
826 Py_CLEAR(tstate->context);
827
828 if (tstate->on_delete != NULL) {
829 tstate->on_delete(tstate->on_delete_data);
830 }
831 }
832
833
834 /* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */
835 static void
tstate_delete_common(PyThreadState * tstate,struct _gilstate_runtime_state * gilstate)836 tstate_delete_common(PyThreadState *tstate,
837 struct _gilstate_runtime_state *gilstate)
838 {
839 _Py_EnsureTstateNotNULL(tstate);
840 PyInterpreterState *interp = tstate->interp;
841 if (interp == NULL) {
842 Py_FatalError("NULL interpreter");
843 }
844 _PyRuntimeState *runtime = interp->runtime;
845
846 HEAD_LOCK(runtime);
847 if (tstate->prev) {
848 tstate->prev->next = tstate->next;
849 }
850 else {
851 interp->tstate_head = tstate->next;
852 }
853 if (tstate->next) {
854 tstate->next->prev = tstate->prev;
855 }
856 HEAD_UNLOCK(runtime);
857
858 if (gilstate->autoInterpreterState &&
859 PyThread_tss_get(&gilstate->autoTSSkey) == tstate)
860 {
861 PyThread_tss_set(&gilstate->autoTSSkey, NULL);
862 }
863 }
864
865
866 static void
_PyThreadState_Delete(PyThreadState * tstate,int check_current)867 _PyThreadState_Delete(PyThreadState *tstate, int check_current)
868 {
869 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
870 if (check_current) {
871 if (tstate == _PyRuntimeGILState_GetThreadState(gilstate)) {
872 _Py_FatalErrorFormat(__func__, "tstate %p is still current", tstate);
873 }
874 }
875 tstate_delete_common(tstate, gilstate);
876 PyMem_RawFree(tstate);
877 }
878
879
880 void
PyThreadState_Delete(PyThreadState * tstate)881 PyThreadState_Delete(PyThreadState *tstate)
882 {
883 _PyThreadState_Delete(tstate, 1);
884 }
885
886
887 void
_PyThreadState_DeleteCurrent(PyThreadState * tstate)888 _PyThreadState_DeleteCurrent(PyThreadState *tstate)
889 {
890 _Py_EnsureTstateNotNULL(tstate);
891 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
892 tstate_delete_common(tstate, gilstate);
893 _PyRuntimeGILState_SetThreadState(gilstate, NULL);
894 _PyEval_ReleaseLock(tstate);
895 PyMem_RawFree(tstate);
896 }
897
898 void
PyThreadState_DeleteCurrent(void)899 PyThreadState_DeleteCurrent(void)
900 {
901 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
902 PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate);
903 _PyThreadState_DeleteCurrent(tstate);
904 }
905
906
907 /*
908 * Delete all thread states except the one passed as argument.
909 * Note that, if there is a current thread state, it *must* be the one
910 * passed as argument. Also, this won't touch any other interpreters
911 * than the current one, since we don't know which thread state should
912 * be kept in those other interpreters.
913 */
914 void
_PyThreadState_DeleteExcept(_PyRuntimeState * runtime,PyThreadState * tstate)915 _PyThreadState_DeleteExcept(_PyRuntimeState *runtime, PyThreadState *tstate)
916 {
917 PyInterpreterState *interp = tstate->interp;
918
919 HEAD_LOCK(runtime);
920 /* Remove all thread states, except tstate, from the linked list of
921 thread states. This will allow calling PyThreadState_Clear()
922 without holding the lock. */
923 PyThreadState *list = interp->tstate_head;
924 if (list == tstate) {
925 list = tstate->next;
926 }
927 if (tstate->prev) {
928 tstate->prev->next = tstate->next;
929 }
930 if (tstate->next) {
931 tstate->next->prev = tstate->prev;
932 }
933 tstate->prev = tstate->next = NULL;
934 interp->tstate_head = tstate;
935 HEAD_UNLOCK(runtime);
936
937 /* Clear and deallocate all stale thread states. Even if this
938 executes Python code, we should be safe since it executes
939 in the current thread, not one of the stale threads. */
940 PyThreadState *p, *next;
941 for (p = list; p; p = next) {
942 next = p->next;
943 PyThreadState_Clear(p);
944 PyMem_RawFree(p);
945 }
946 }
947
948
949 PyThreadState *
_PyThreadState_UncheckedGet(void)950 _PyThreadState_UncheckedGet(void)
951 {
952 return _PyThreadState_GET();
953 }
954
955
956 PyThreadState *
PyThreadState_Get(void)957 PyThreadState_Get(void)
958 {
959 PyThreadState *tstate = _PyThreadState_GET();
960 _Py_EnsureTstateNotNULL(tstate);
961 return tstate;
962 }
963
964
965 PyThreadState *
_PyThreadState_Swap(struct _gilstate_runtime_state * gilstate,PyThreadState * newts)966 _PyThreadState_Swap(struct _gilstate_runtime_state *gilstate, PyThreadState *newts)
967 {
968 PyThreadState *oldts = _PyRuntimeGILState_GetThreadState(gilstate);
969
970 _PyRuntimeGILState_SetThreadState(gilstate, newts);
971 /* It should not be possible for more than one thread state
972 to be used for a thread. Check this the best we can in debug
973 builds.
974 */
975 #if defined(Py_DEBUG)
976 if (newts) {
977 /* This can be called from PyEval_RestoreThread(). Similar
978 to it, we need to ensure errno doesn't change.
979 */
980 int err = errno;
981 PyThreadState *check = _PyGILState_GetThisThreadState(gilstate);
982 if (check && check->interp == newts->interp && check != newts)
983 Py_FatalError("Invalid thread state for this thread");
984 errno = err;
985 }
986 #endif
987 return oldts;
988 }
989
990 PyThreadState *
PyThreadState_Swap(PyThreadState * newts)991 PyThreadState_Swap(PyThreadState *newts)
992 {
993 return _PyThreadState_Swap(&_PyRuntime.gilstate, newts);
994 }
995
996 /* An extension mechanism to store arbitrary additional per-thread state.
997 PyThreadState_GetDict() returns a dictionary that can be used to hold such
998 state; the caller should pick a unique key and store its state there. If
999 PyThreadState_GetDict() returns NULL, an exception has *not* been raised
1000 and the caller should assume no per-thread state is available. */
1001
1002 PyObject *
_PyThreadState_GetDict(PyThreadState * tstate)1003 _PyThreadState_GetDict(PyThreadState *tstate)
1004 {
1005 assert(tstate != NULL);
1006 if (tstate->dict == NULL) {
1007 tstate->dict = PyDict_New();
1008 if (tstate->dict == NULL) {
1009 _PyErr_Clear(tstate);
1010 }
1011 }
1012 return tstate->dict;
1013 }
1014
1015
1016 PyObject *
PyThreadState_GetDict(void)1017 PyThreadState_GetDict(void)
1018 {
1019 PyThreadState *tstate = _PyThreadState_GET();
1020 if (tstate == NULL) {
1021 return NULL;
1022 }
1023 return _PyThreadState_GetDict(tstate);
1024 }
1025
1026
1027 PyInterpreterState *
PyThreadState_GetInterpreter(PyThreadState * tstate)1028 PyThreadState_GetInterpreter(PyThreadState *tstate)
1029 {
1030 assert(tstate != NULL);
1031 return tstate->interp;
1032 }
1033
1034
1035 PyFrameObject*
PyThreadState_GetFrame(PyThreadState * tstate)1036 PyThreadState_GetFrame(PyThreadState *tstate)
1037 {
1038 assert(tstate != NULL);
1039 PyFrameObject *frame = tstate->frame;
1040 Py_XINCREF(frame);
1041 return frame;
1042 }
1043
1044
1045 uint64_t
PyThreadState_GetID(PyThreadState * tstate)1046 PyThreadState_GetID(PyThreadState *tstate)
1047 {
1048 assert(tstate != NULL);
1049 return tstate->id;
1050 }
1051
1052
1053 /* Asynchronously raise an exception in a thread.
1054 Requested by Just van Rossum and Alex Martelli.
1055 To prevent naive misuse, you must write your own extension
1056 to call this, or use ctypes. Must be called with the GIL held.
1057 Returns the number of tstates modified (normally 1, but 0 if `id` didn't
1058 match any known thread id). Can be called with exc=NULL to clear an
1059 existing async exception. This raises no exceptions. */
1060
1061 int
PyThreadState_SetAsyncExc(unsigned long id,PyObject * exc)1062 PyThreadState_SetAsyncExc(unsigned long id, PyObject *exc)
1063 {
1064 _PyRuntimeState *runtime = &_PyRuntime;
1065 PyInterpreterState *interp = _PyRuntimeState_GetThreadState(runtime)->interp;
1066
1067 /* Although the GIL is held, a few C API functions can be called
1068 * without the GIL held, and in particular some that create and
1069 * destroy thread and interpreter states. Those can mutate the
1070 * list of thread states we're traversing, so to prevent that we lock
1071 * head_mutex for the duration.
1072 */
1073 HEAD_LOCK(runtime);
1074 for (PyThreadState *tstate = interp->tstate_head; tstate != NULL; tstate = tstate->next) {
1075 if (tstate->thread_id != id) {
1076 continue;
1077 }
1078
1079 /* Tricky: we need to decref the current value
1080 * (if any) in tstate->async_exc, but that can in turn
1081 * allow arbitrary Python code to run, including
1082 * perhaps calls to this function. To prevent
1083 * deadlock, we need to release head_mutex before
1084 * the decref.
1085 */
1086 PyObject *old_exc = tstate->async_exc;
1087 Py_XINCREF(exc);
1088 tstate->async_exc = exc;
1089 HEAD_UNLOCK(runtime);
1090
1091 Py_XDECREF(old_exc);
1092 _PyEval_SignalAsyncExc(tstate);
1093 return 1;
1094 }
1095 HEAD_UNLOCK(runtime);
1096 return 0;
1097 }
1098
1099
1100 /* Routines for advanced debuggers, requested by David Beazley.
1101 Don't use unless you know what you are doing! */
1102
1103 PyInterpreterState *
PyInterpreterState_Head(void)1104 PyInterpreterState_Head(void)
1105 {
1106 return _PyRuntime.interpreters.head;
1107 }
1108
1109 PyInterpreterState *
PyInterpreterState_Main(void)1110 PyInterpreterState_Main(void)
1111 {
1112 return _PyRuntime.interpreters.main;
1113 }
1114
1115 PyInterpreterState *
PyInterpreterState_Next(PyInterpreterState * interp)1116 PyInterpreterState_Next(PyInterpreterState *interp) {
1117 return interp->next;
1118 }
1119
1120 PyThreadState *
PyInterpreterState_ThreadHead(PyInterpreterState * interp)1121 PyInterpreterState_ThreadHead(PyInterpreterState *interp) {
1122 return interp->tstate_head;
1123 }
1124
1125 PyThreadState *
PyThreadState_Next(PyThreadState * tstate)1126 PyThreadState_Next(PyThreadState *tstate) {
1127 return tstate->next;
1128 }
1129
1130 /* The implementation of sys._current_frames(). This is intended to be
1131 called with the GIL held, as it will be when called via
1132 sys._current_frames(). It's possible it would work fine even without
1133 the GIL held, but haven't thought enough about that.
1134 */
1135 PyObject *
_PyThread_CurrentFrames(void)1136 _PyThread_CurrentFrames(void)
1137 {
1138 PyThreadState *tstate = _PyThreadState_GET();
1139 if (_PySys_Audit(tstate, "sys._current_frames", NULL) < 0) {
1140 return NULL;
1141 }
1142
1143 PyObject *result = PyDict_New();
1144 if (result == NULL) {
1145 return NULL;
1146 }
1147
1148 /* for i in all interpreters:
1149 * for t in all of i's thread states:
1150 * if t's frame isn't NULL, map t's id to its frame
1151 * Because these lists can mutate even when the GIL is held, we
1152 * need to grab head_mutex for the duration.
1153 */
1154 _PyRuntimeState *runtime = tstate->interp->runtime;
1155 HEAD_LOCK(runtime);
1156 PyInterpreterState *i;
1157 for (i = runtime->interpreters.head; i != NULL; i = i->next) {
1158 PyThreadState *t;
1159 for (t = i->tstate_head; t != NULL; t = t->next) {
1160 PyFrameObject *frame = t->frame;
1161 if (frame == NULL) {
1162 continue;
1163 }
1164 PyObject *id = PyLong_FromUnsignedLong(t->thread_id);
1165 if (id == NULL) {
1166 goto fail;
1167 }
1168 int stat = PyDict_SetItem(result, id, (PyObject *)frame);
1169 Py_DECREF(id);
1170 if (stat < 0) {
1171 goto fail;
1172 }
1173 }
1174 }
1175 goto done;
1176
1177 fail:
1178 Py_CLEAR(result);
1179
1180 done:
1181 HEAD_UNLOCK(runtime);
1182 return result;
1183 }
1184
1185 /* Python "auto thread state" API. */
1186
1187 /* Keep this as a static, as it is not reliable! It can only
1188 ever be compared to the state for the *current* thread.
1189 * If not equal, then it doesn't matter that the actual
1190 value may change immediately after comparison, as it can't
1191 possibly change to the current thread's state.
1192 * If equal, then the current thread holds the lock, so the value can't
1193 change until we yield the lock.
1194 */
1195 static int
PyThreadState_IsCurrent(PyThreadState * tstate)1196 PyThreadState_IsCurrent(PyThreadState *tstate)
1197 {
1198 /* Must be the tstate for this thread */
1199 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
1200 assert(_PyGILState_GetThisThreadState(gilstate) == tstate);
1201 return tstate == _PyRuntimeGILState_GetThreadState(gilstate);
1202 }
1203
1204 /* Internal initialization/finalization functions called by
1205 Py_Initialize/Py_FinalizeEx
1206 */
1207 PyStatus
_PyGILState_Init(PyThreadState * tstate)1208 _PyGILState_Init(PyThreadState *tstate)
1209 {
1210 if (!_Py_IsMainInterpreter(tstate)) {
1211 /* Currently, PyGILState is shared by all interpreters. The main
1212 * interpreter is responsible to initialize it. */
1213 return _PyStatus_OK();
1214 }
1215
1216 /* must init with valid states */
1217 assert(tstate != NULL);
1218 assert(tstate->interp != NULL);
1219
1220 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
1221
1222 if (PyThread_tss_create(&gilstate->autoTSSkey) != 0) {
1223 return _PyStatus_NO_MEMORY();
1224 }
1225 gilstate->autoInterpreterState = tstate->interp;
1226 assert(PyThread_tss_get(&gilstate->autoTSSkey) == NULL);
1227 assert(tstate->gilstate_counter == 0);
1228
1229 _PyGILState_NoteThreadState(gilstate, tstate);
1230 return _PyStatus_OK();
1231 }
1232
1233 PyInterpreterState *
_PyGILState_GetInterpreterStateUnsafe(void)1234 _PyGILState_GetInterpreterStateUnsafe(void)
1235 {
1236 return _PyRuntime.gilstate.autoInterpreterState;
1237 }
1238
1239 void
_PyGILState_Fini(PyThreadState * tstate)1240 _PyGILState_Fini(PyThreadState *tstate)
1241 {
1242 struct _gilstate_runtime_state *gilstate = &tstate->interp->runtime->gilstate;
1243 PyThread_tss_delete(&gilstate->autoTSSkey);
1244 gilstate->autoInterpreterState = NULL;
1245 }
1246
1247 /* Reset the TSS key - called by PyOS_AfterFork_Child().
1248 * This should not be necessary, but some - buggy - pthread implementations
1249 * don't reset TSS upon fork(), see issue #10517.
1250 */
1251 void
_PyGILState_Reinit(_PyRuntimeState * runtime)1252 _PyGILState_Reinit(_PyRuntimeState *runtime)
1253 {
1254 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
1255 PyThreadState *tstate = _PyGILState_GetThisThreadState(gilstate);
1256
1257 PyThread_tss_delete(&gilstate->autoTSSkey);
1258 if (PyThread_tss_create(&gilstate->autoTSSkey) != 0) {
1259 Py_FatalError("Could not allocate TSS entry");
1260 }
1261
1262 /* If the thread had an associated auto thread state, reassociate it with
1263 * the new key. */
1264 if (tstate &&
1265 PyThread_tss_set(&gilstate->autoTSSkey, (void *)tstate) != 0)
1266 {
1267 Py_FatalError("Couldn't create autoTSSkey mapping");
1268 }
1269 }
1270
1271 /* When a thread state is created for a thread by some mechanism other than
1272 PyGILState_Ensure, it's important that the GILState machinery knows about
1273 it so it doesn't try to create another thread state for the thread (this is
1274 a better fix for SF bug #1010677 than the first one attempted).
1275 */
1276 static void
_PyGILState_NoteThreadState(struct _gilstate_runtime_state * gilstate,PyThreadState * tstate)1277 _PyGILState_NoteThreadState(struct _gilstate_runtime_state *gilstate, PyThreadState* tstate)
1278 {
1279 /* If autoTSSkey isn't initialized, this must be the very first
1280 threadstate created in Py_Initialize(). Don't do anything for now
1281 (we'll be back here when _PyGILState_Init is called). */
1282 if (!gilstate->autoInterpreterState) {
1283 return;
1284 }
1285
1286 /* Stick the thread state for this thread in thread specific storage.
1287
1288 The only situation where you can legitimately have more than one
1289 thread state for an OS level thread is when there are multiple
1290 interpreters.
1291
1292 You shouldn't really be using the PyGILState_ APIs anyway (see issues
1293 #10915 and #15751).
1294
1295 The first thread state created for that given OS level thread will
1296 "win", which seems reasonable behaviour.
1297 */
1298 if (PyThread_tss_get(&gilstate->autoTSSkey) == NULL) {
1299 if ((PyThread_tss_set(&gilstate->autoTSSkey, (void *)tstate)) != 0) {
1300 Py_FatalError("Couldn't create autoTSSkey mapping");
1301 }
1302 }
1303
1304 /* PyGILState_Release must not try to delete this thread state. */
1305 tstate->gilstate_counter = 1;
1306 }
1307
1308 /* The public functions */
1309 static PyThreadState *
_PyGILState_GetThisThreadState(struct _gilstate_runtime_state * gilstate)1310 _PyGILState_GetThisThreadState(struct _gilstate_runtime_state *gilstate)
1311 {
1312 if (gilstate->autoInterpreterState == NULL)
1313 return NULL;
1314 return (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey);
1315 }
1316
1317 PyThreadState *
PyGILState_GetThisThreadState(void)1318 PyGILState_GetThisThreadState(void)
1319 {
1320 return _PyGILState_GetThisThreadState(&_PyRuntime.gilstate);
1321 }
1322
1323 int
PyGILState_Check(void)1324 PyGILState_Check(void)
1325 {
1326 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
1327 if (!gilstate->check_enabled) {
1328 return 1;
1329 }
1330
1331 if (!PyThread_tss_is_created(&gilstate->autoTSSkey)) {
1332 return 1;
1333 }
1334
1335 PyThreadState *tstate = _PyRuntimeGILState_GetThreadState(gilstate);
1336 if (tstate == NULL) {
1337 return 0;
1338 }
1339
1340 return (tstate == _PyGILState_GetThisThreadState(gilstate));
1341 }
1342
1343 PyGILState_STATE
PyGILState_Ensure(void)1344 PyGILState_Ensure(void)
1345 {
1346 _PyRuntimeState *runtime = &_PyRuntime;
1347 struct _gilstate_runtime_state *gilstate = &runtime->gilstate;
1348
1349 /* Note that we do not auto-init Python here - apart from
1350 potential races with 2 threads auto-initializing, pep-311
1351 spells out other issues. Embedders are expected to have
1352 called Py_Initialize(). */
1353
1354 /* Ensure that _PyEval_InitThreads() and _PyGILState_Init() have been
1355 called by Py_Initialize() */
1356 assert(_PyEval_ThreadsInitialized(runtime));
1357 assert(gilstate->autoInterpreterState);
1358
1359 PyThreadState *tcur = (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey);
1360 int current;
1361 if (tcur == NULL) {
1362 /* Create a new Python thread state for this thread */
1363 tcur = PyThreadState_New(gilstate->autoInterpreterState);
1364 if (tcur == NULL) {
1365 Py_FatalError("Couldn't create thread-state for new thread");
1366 }
1367
1368 /* This is our thread state! We'll need to delete it in the
1369 matching call to PyGILState_Release(). */
1370 tcur->gilstate_counter = 0;
1371 current = 0; /* new thread state is never current */
1372 }
1373 else {
1374 current = PyThreadState_IsCurrent(tcur);
1375 }
1376
1377 if (current == 0) {
1378 PyEval_RestoreThread(tcur);
1379 }
1380
1381 /* Update our counter in the thread-state - no need for locks:
1382 - tcur will remain valid as we hold the GIL.
1383 - the counter is safe as we are the only thread "allowed"
1384 to modify this value
1385 */
1386 ++tcur->gilstate_counter;
1387
1388 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED;
1389 }
1390
1391 void
PyGILState_Release(PyGILState_STATE oldstate)1392 PyGILState_Release(PyGILState_STATE oldstate)
1393 {
1394 _PyRuntimeState *runtime = &_PyRuntime;
1395 PyThreadState *tstate = PyThread_tss_get(&runtime->gilstate.autoTSSkey);
1396 if (tstate == NULL) {
1397 Py_FatalError("auto-releasing thread-state, "
1398 "but no thread-state for this thread");
1399 }
1400
1401 /* We must hold the GIL and have our thread state current */
1402 /* XXX - remove the check - the assert should be fine,
1403 but while this is very new (April 2003), the extra check
1404 by release-only users can't hurt.
1405 */
1406 if (!PyThreadState_IsCurrent(tstate)) {
1407 _Py_FatalErrorFormat(__func__,
1408 "thread state %p must be current when releasing",
1409 tstate);
1410 }
1411 assert(PyThreadState_IsCurrent(tstate));
1412 --tstate->gilstate_counter;
1413 assert(tstate->gilstate_counter >= 0); /* illegal counter value */
1414
1415 /* If we're going to destroy this thread-state, we must
1416 * clear it while the GIL is held, as destructors may run.
1417 */
1418 if (tstate->gilstate_counter == 0) {
1419 /* can't have been locked when we created it */
1420 assert(oldstate == PyGILState_UNLOCKED);
1421 PyThreadState_Clear(tstate);
1422 /* Delete the thread-state. Note this releases the GIL too!
1423 * It's vital that the GIL be held here, to avoid shutdown
1424 * races; see bugs 225673 and 1061968 (that nasty bug has a
1425 * habit of coming back).
1426 */
1427 assert(_PyRuntimeGILState_GetThreadState(&runtime->gilstate) == tstate);
1428 _PyThreadState_DeleteCurrent(tstate);
1429 }
1430 /* Release the lock if necessary */
1431 else if (oldstate == PyGILState_UNLOCKED)
1432 PyEval_SaveThread();
1433 }
1434
1435
1436 /**************************/
1437 /* cross-interpreter data */
1438 /**************************/
1439
1440 /* cross-interpreter data */
1441
1442 crossinterpdatafunc _PyCrossInterpreterData_Lookup(PyObject *);
1443
1444 /* This is a separate func from _PyCrossInterpreterData_Lookup in order
1445 to keep the registry code separate. */
1446 static crossinterpdatafunc
_lookup_getdata(PyObject * obj)1447 _lookup_getdata(PyObject *obj)
1448 {
1449 crossinterpdatafunc getdata = _PyCrossInterpreterData_Lookup(obj);
1450 if (getdata == NULL && PyErr_Occurred() == 0)
1451 PyErr_Format(PyExc_ValueError,
1452 "%S does not support cross-interpreter data", obj);
1453 return getdata;
1454 }
1455
1456 int
_PyObject_CheckCrossInterpreterData(PyObject * obj)1457 _PyObject_CheckCrossInterpreterData(PyObject *obj)
1458 {
1459 crossinterpdatafunc getdata = _lookup_getdata(obj);
1460 if (getdata == NULL) {
1461 return -1;
1462 }
1463 return 0;
1464 }
1465
1466 static int
_check_xidata(PyThreadState * tstate,_PyCrossInterpreterData * data)1467 _check_xidata(PyThreadState *tstate, _PyCrossInterpreterData *data)
1468 {
1469 // data->data can be anything, including NULL, so we don't check it.
1470
1471 // data->obj may be NULL, so we don't check it.
1472
1473 if (data->interp < 0) {
1474 _PyErr_SetString(tstate, PyExc_SystemError, "missing interp");
1475 return -1;
1476 }
1477
1478 if (data->new_object == NULL) {
1479 _PyErr_SetString(tstate, PyExc_SystemError, "missing new_object func");
1480 return -1;
1481 }
1482
1483 // data->free may be NULL, so we don't check it.
1484
1485 return 0;
1486 }
1487
1488 int
_PyObject_GetCrossInterpreterData(PyObject * obj,_PyCrossInterpreterData * data)1489 _PyObject_GetCrossInterpreterData(PyObject *obj, _PyCrossInterpreterData *data)
1490 {
1491 // PyThreadState_Get() aborts if tstate is NULL.
1492 PyThreadState *tstate = PyThreadState_Get();
1493 PyInterpreterState *interp = tstate->interp;
1494
1495 // Reset data before re-populating.
1496 *data = (_PyCrossInterpreterData){0};
1497 data->free = PyMem_RawFree; // Set a default that may be overridden.
1498
1499 // Call the "getdata" func for the object.
1500 Py_INCREF(obj);
1501 crossinterpdatafunc getdata = _lookup_getdata(obj);
1502 if (getdata == NULL) {
1503 Py_DECREF(obj);
1504 return -1;
1505 }
1506 int res = getdata(obj, data);
1507 Py_DECREF(obj);
1508 if (res != 0) {
1509 return -1;
1510 }
1511
1512 // Fill in the blanks and validate the result.
1513 data->interp = interp->id;
1514 if (_check_xidata(tstate, data) != 0) {
1515 _PyCrossInterpreterData_Release(data);
1516 return -1;
1517 }
1518
1519 return 0;
1520 }
1521
1522 static void
_release_xidata(void * arg)1523 _release_xidata(void *arg)
1524 {
1525 _PyCrossInterpreterData *data = (_PyCrossInterpreterData *)arg;
1526 if (data->free != NULL) {
1527 data->free(data->data);
1528 }
1529 Py_XDECREF(data->obj);
1530 }
1531
1532 static void
_call_in_interpreter(struct _gilstate_runtime_state * gilstate,PyInterpreterState * interp,void (* func)(void *),void * arg)1533 _call_in_interpreter(struct _gilstate_runtime_state *gilstate,
1534 PyInterpreterState *interp,
1535 void (*func)(void *), void *arg)
1536 {
1537 /* We would use Py_AddPendingCall() if it weren't specific to the
1538 * main interpreter (see bpo-33608). In the meantime we take a
1539 * naive approach.
1540 */
1541 PyThreadState *save_tstate = NULL;
1542 if (interp != _PyRuntimeGILState_GetThreadState(gilstate)->interp) {
1543 // XXX Using the "head" thread isn't strictly correct.
1544 PyThreadState *tstate = PyInterpreterState_ThreadHead(interp);
1545 // XXX Possible GILState issues?
1546 save_tstate = _PyThreadState_Swap(gilstate, tstate);
1547 }
1548
1549 func(arg);
1550
1551 // Switch back.
1552 if (save_tstate != NULL) {
1553 _PyThreadState_Swap(gilstate, save_tstate);
1554 }
1555 }
1556
1557 void
_PyCrossInterpreterData_Release(_PyCrossInterpreterData * data)1558 _PyCrossInterpreterData_Release(_PyCrossInterpreterData *data)
1559 {
1560 if (data->data == NULL && data->obj == NULL) {
1561 // Nothing to release!
1562 return;
1563 }
1564
1565 // Switch to the original interpreter.
1566 PyInterpreterState *interp = _PyInterpreterState_LookUpID(data->interp);
1567 if (interp == NULL) {
1568 // The interpreter was already destroyed.
1569 if (data->free != NULL) {
1570 // XXX Someone leaked some memory...
1571 }
1572 return;
1573 }
1574
1575 // "Release" the data and/or the object.
1576 struct _gilstate_runtime_state *gilstate = &_PyRuntime.gilstate;
1577 _call_in_interpreter(gilstate, interp, _release_xidata, data);
1578 }
1579
1580 PyObject *
_PyCrossInterpreterData_NewObject(_PyCrossInterpreterData * data)1581 _PyCrossInterpreterData_NewObject(_PyCrossInterpreterData *data)
1582 {
1583 return data->new_object(data);
1584 }
1585
1586 /* registry of {type -> crossinterpdatafunc} */
1587
1588 /* For now we use a global registry of shareable classes. An
1589 alternative would be to add a tp_* slot for a class's
1590 crossinterpdatafunc. It would be simpler and more efficient. */
1591
1592 static int
_register_xidata(struct _xidregistry * xidregistry,PyTypeObject * cls,crossinterpdatafunc getdata)1593 _register_xidata(struct _xidregistry *xidregistry, PyTypeObject *cls,
1594 crossinterpdatafunc getdata)
1595 {
1596 // Note that we effectively replace already registered classes
1597 // rather than failing.
1598 struct _xidregitem *newhead = PyMem_RawMalloc(sizeof(struct _xidregitem));
1599 if (newhead == NULL)
1600 return -1;
1601 newhead->cls = cls;
1602 newhead->getdata = getdata;
1603 newhead->next = xidregistry->head;
1604 xidregistry->head = newhead;
1605 return 0;
1606 }
1607
1608 static void _register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry);
1609
1610 int
_PyCrossInterpreterData_RegisterClass(PyTypeObject * cls,crossinterpdatafunc getdata)1611 _PyCrossInterpreterData_RegisterClass(PyTypeObject *cls,
1612 crossinterpdatafunc getdata)
1613 {
1614 if (!PyType_Check(cls)) {
1615 PyErr_Format(PyExc_ValueError, "only classes may be registered");
1616 return -1;
1617 }
1618 if (getdata == NULL) {
1619 PyErr_Format(PyExc_ValueError, "missing 'getdata' func");
1620 return -1;
1621 }
1622
1623 // Make sure the class isn't ever deallocated.
1624 Py_INCREF((PyObject *)cls);
1625
1626 struct _xidregistry *xidregistry = &_PyRuntime.xidregistry ;
1627 PyThread_acquire_lock(xidregistry->mutex, WAIT_LOCK);
1628 if (xidregistry->head == NULL) {
1629 _register_builtins_for_crossinterpreter_data(xidregistry);
1630 }
1631 int res = _register_xidata(xidregistry, cls, getdata);
1632 PyThread_release_lock(xidregistry->mutex);
1633 return res;
1634 }
1635
1636 /* Cross-interpreter objects are looked up by exact match on the class.
1637 We can reassess this policy when we move from a global registry to a
1638 tp_* slot. */
1639
1640 crossinterpdatafunc
_PyCrossInterpreterData_Lookup(PyObject * obj)1641 _PyCrossInterpreterData_Lookup(PyObject *obj)
1642 {
1643 struct _xidregistry *xidregistry = &_PyRuntime.xidregistry ;
1644 PyObject *cls = PyObject_Type(obj);
1645 crossinterpdatafunc getdata = NULL;
1646 PyThread_acquire_lock(xidregistry->mutex, WAIT_LOCK);
1647 struct _xidregitem *cur = xidregistry->head;
1648 if (cur == NULL) {
1649 _register_builtins_for_crossinterpreter_data(xidregistry);
1650 cur = xidregistry->head;
1651 }
1652 for(; cur != NULL; cur = cur->next) {
1653 if (cur->cls == (PyTypeObject *)cls) {
1654 getdata = cur->getdata;
1655 break;
1656 }
1657 }
1658 Py_DECREF(cls);
1659 PyThread_release_lock(xidregistry->mutex);
1660 return getdata;
1661 }
1662
1663 /* cross-interpreter data for builtin types */
1664
1665 struct _shared_bytes_data {
1666 char *bytes;
1667 Py_ssize_t len;
1668 };
1669
1670 static PyObject *
_new_bytes_object(_PyCrossInterpreterData * data)1671 _new_bytes_object(_PyCrossInterpreterData *data)
1672 {
1673 struct _shared_bytes_data *shared = (struct _shared_bytes_data *)(data->data);
1674 return PyBytes_FromStringAndSize(shared->bytes, shared->len);
1675 }
1676
1677 static int
_bytes_shared(PyObject * obj,_PyCrossInterpreterData * data)1678 _bytes_shared(PyObject *obj, _PyCrossInterpreterData *data)
1679 {
1680 struct _shared_bytes_data *shared = PyMem_NEW(struct _shared_bytes_data, 1);
1681 if (PyBytes_AsStringAndSize(obj, &shared->bytes, &shared->len) < 0) {
1682 return -1;
1683 }
1684 data->data = (void *)shared;
1685 Py_INCREF(obj);
1686 data->obj = obj; // Will be "released" (decref'ed) when data released.
1687 data->new_object = _new_bytes_object;
1688 data->free = PyMem_Free;
1689 return 0;
1690 }
1691
1692 struct _shared_str_data {
1693 int kind;
1694 const void *buffer;
1695 Py_ssize_t len;
1696 };
1697
1698 static PyObject *
_new_str_object(_PyCrossInterpreterData * data)1699 _new_str_object(_PyCrossInterpreterData *data)
1700 {
1701 struct _shared_str_data *shared = (struct _shared_str_data *)(data->data);
1702 return PyUnicode_FromKindAndData(shared->kind, shared->buffer, shared->len);
1703 }
1704
1705 static int
_str_shared(PyObject * obj,_PyCrossInterpreterData * data)1706 _str_shared(PyObject *obj, _PyCrossInterpreterData *data)
1707 {
1708 struct _shared_str_data *shared = PyMem_NEW(struct _shared_str_data, 1);
1709 shared->kind = PyUnicode_KIND(obj);
1710 shared->buffer = PyUnicode_DATA(obj);
1711 shared->len = PyUnicode_GET_LENGTH(obj);
1712 data->data = (void *)shared;
1713 Py_INCREF(obj);
1714 data->obj = obj; // Will be "released" (decref'ed) when data released.
1715 data->new_object = _new_str_object;
1716 data->free = PyMem_Free;
1717 return 0;
1718 }
1719
1720 static PyObject *
_new_long_object(_PyCrossInterpreterData * data)1721 _new_long_object(_PyCrossInterpreterData *data)
1722 {
1723 return PyLong_FromSsize_t((Py_ssize_t)(data->data));
1724 }
1725
1726 static int
_long_shared(PyObject * obj,_PyCrossInterpreterData * data)1727 _long_shared(PyObject *obj, _PyCrossInterpreterData *data)
1728 {
1729 /* Note that this means the size of shareable ints is bounded by
1730 * sys.maxsize. Hence on 32-bit architectures that is half the
1731 * size of maximum shareable ints on 64-bit.
1732 */
1733 Py_ssize_t value = PyLong_AsSsize_t(obj);
1734 if (value == -1 && PyErr_Occurred()) {
1735 if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
1736 PyErr_SetString(PyExc_OverflowError, "try sending as bytes");
1737 }
1738 return -1;
1739 }
1740 data->data = (void *)value;
1741 data->obj = NULL;
1742 data->new_object = _new_long_object;
1743 data->free = NULL;
1744 return 0;
1745 }
1746
1747 static PyObject *
_new_none_object(_PyCrossInterpreterData * data)1748 _new_none_object(_PyCrossInterpreterData *data)
1749 {
1750 // XXX Singleton refcounts are problematic across interpreters...
1751 Py_INCREF(Py_None);
1752 return Py_None;
1753 }
1754
1755 static int
_none_shared(PyObject * obj,_PyCrossInterpreterData * data)1756 _none_shared(PyObject *obj, _PyCrossInterpreterData *data)
1757 {
1758 data->data = NULL;
1759 // data->obj remains NULL
1760 data->new_object = _new_none_object;
1761 data->free = NULL; // There is nothing to free.
1762 return 0;
1763 }
1764
1765 static void
_register_builtins_for_crossinterpreter_data(struct _xidregistry * xidregistry)1766 _register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry)
1767 {
1768 // None
1769 if (_register_xidata(xidregistry, (PyTypeObject *)PyObject_Type(Py_None), _none_shared) != 0) {
1770 Py_FatalError("could not register None for cross-interpreter sharing");
1771 }
1772
1773 // int
1774 if (_register_xidata(xidregistry, &PyLong_Type, _long_shared) != 0) {
1775 Py_FatalError("could not register int for cross-interpreter sharing");
1776 }
1777
1778 // bytes
1779 if (_register_xidata(xidregistry, &PyBytes_Type, _bytes_shared) != 0) {
1780 Py_FatalError("could not register bytes for cross-interpreter sharing");
1781 }
1782
1783 // str
1784 if (_register_xidata(xidregistry, &PyUnicode_Type, _str_shared) != 0) {
1785 Py_FatalError("could not register str for cross-interpreter sharing");
1786 }
1787 }
1788
1789
1790 _PyFrameEvalFunction
_PyInterpreterState_GetEvalFrameFunc(PyInterpreterState * interp)1791 _PyInterpreterState_GetEvalFrameFunc(PyInterpreterState *interp)
1792 {
1793 return interp->eval_frame;
1794 }
1795
1796
1797 void
_PyInterpreterState_SetEvalFrameFunc(PyInterpreterState * interp,_PyFrameEvalFunction eval_frame)1798 _PyInterpreterState_SetEvalFrameFunc(PyInterpreterState *interp,
1799 _PyFrameEvalFunction eval_frame)
1800 {
1801 interp->eval_frame = eval_frame;
1802 }
1803
1804
1805 const PyConfig*
_PyInterpreterState_GetConfig(PyInterpreterState * interp)1806 _PyInterpreterState_GetConfig(PyInterpreterState *interp)
1807 {
1808 return &interp->config;
1809 }
1810
1811
1812 PyStatus
_PyInterpreterState_SetConfig(PyInterpreterState * interp,const PyConfig * config)1813 _PyInterpreterState_SetConfig(PyInterpreterState *interp,
1814 const PyConfig *config)
1815 {
1816 return _PyConfig_Copy(&interp->config, config);
1817 }
1818
1819
1820 const PyConfig*
_Py_GetConfig(void)1821 _Py_GetConfig(void)
1822 {
1823 assert(PyGILState_Check());
1824 PyThreadState *tstate = _PyThreadState_GET();
1825 return _PyInterpreterState_GetConfig(tstate->interp);
1826 }
1827
1828 #ifdef __cplusplus
1829 }
1830 #endif
1831