17db96d56Sopenharmony_ci#ifndef Py_INTERNAL_INTERP_H 27db96d56Sopenharmony_ci#define Py_INTERNAL_INTERP_H 37db96d56Sopenharmony_ci#ifdef __cplusplus 47db96d56Sopenharmony_ciextern "C" { 57db96d56Sopenharmony_ci#endif 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci#ifndef Py_BUILD_CORE 87db96d56Sopenharmony_ci# error "this header requires Py_BUILD_CORE define" 97db96d56Sopenharmony_ci#endif 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci#include <stdbool.h> 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ci#include "pycore_atomic.h" // _Py_atomic_address 147db96d56Sopenharmony_ci#include "pycore_ast_state.h" // struct ast_state 157db96d56Sopenharmony_ci#include "pycore_code.h" // struct callable_cache 167db96d56Sopenharmony_ci#include "pycore_context.h" // struct _Py_context_state 177db96d56Sopenharmony_ci#include "pycore_dict.h" // struct _Py_dict_state 187db96d56Sopenharmony_ci#include "pycore_exceptions.h" // struct _Py_exc_state 197db96d56Sopenharmony_ci#include "pycore_floatobject.h" // struct _Py_float_state 207db96d56Sopenharmony_ci#include "pycore_genobject.h" // struct _Py_async_gen_state 217db96d56Sopenharmony_ci#include "pycore_gil.h" // struct _gil_runtime_state 227db96d56Sopenharmony_ci#include "pycore_gc.h" // struct _gc_runtime_state 237db96d56Sopenharmony_ci#include "pycore_list.h" // struct _Py_list_state 247db96d56Sopenharmony_ci#include "pycore_tuple.h" // struct _Py_tuple_state 257db96d56Sopenharmony_ci#include "pycore_typeobject.h" // struct type_cache 267db96d56Sopenharmony_ci#include "pycore_unicodeobject.h" // struct _Py_unicode_state 277db96d56Sopenharmony_ci#include "pycore_warnings.h" // struct _warnings_runtime_state 287db96d56Sopenharmony_ci 297db96d56Sopenharmony_cistruct _pending_calls { 307db96d56Sopenharmony_ci PyThread_type_lock lock; 317db96d56Sopenharmony_ci /* Request for running pending calls. */ 327db96d56Sopenharmony_ci _Py_atomic_int calls_to_do; 337db96d56Sopenharmony_ci /* Request for looking at the `async_exc` field of the current 347db96d56Sopenharmony_ci thread state. 357db96d56Sopenharmony_ci Guarded by the GIL. */ 367db96d56Sopenharmony_ci int async_exc; 377db96d56Sopenharmony_ci#define NPENDINGCALLS 32 387db96d56Sopenharmony_ci struct { 397db96d56Sopenharmony_ci int (*func)(void *); 407db96d56Sopenharmony_ci void *arg; 417db96d56Sopenharmony_ci } calls[NPENDINGCALLS]; 427db96d56Sopenharmony_ci int first; 437db96d56Sopenharmony_ci int last; 447db96d56Sopenharmony_ci}; 457db96d56Sopenharmony_ci 467db96d56Sopenharmony_cistruct _ceval_state { 477db96d56Sopenharmony_ci int recursion_limit; 487db96d56Sopenharmony_ci /* This single variable consolidates all requests to break out of 497db96d56Sopenharmony_ci the fast path in the eval loop. */ 507db96d56Sopenharmony_ci _Py_atomic_int eval_breaker; 517db96d56Sopenharmony_ci /* Request for dropping the GIL */ 527db96d56Sopenharmony_ci _Py_atomic_int gil_drop_request; 537db96d56Sopenharmony_ci struct _pending_calls pending; 547db96d56Sopenharmony_ci}; 557db96d56Sopenharmony_ci 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ci// atexit state 587db96d56Sopenharmony_citypedef struct { 597db96d56Sopenharmony_ci PyObject *func; 607db96d56Sopenharmony_ci PyObject *args; 617db96d56Sopenharmony_ci PyObject *kwargs; 627db96d56Sopenharmony_ci} atexit_callback; 637db96d56Sopenharmony_ci 647db96d56Sopenharmony_cistruct atexit_state { 657db96d56Sopenharmony_ci atexit_callback **callbacks; 667db96d56Sopenharmony_ci int ncallbacks; 677db96d56Sopenharmony_ci int callback_len; 687db96d56Sopenharmony_ci}; 697db96d56Sopenharmony_ci 707db96d56Sopenharmony_ci 717db96d56Sopenharmony_ci/* interpreter state */ 727db96d56Sopenharmony_ci 737db96d56Sopenharmony_ci/* PyInterpreterState holds the global state for one of the runtime's 747db96d56Sopenharmony_ci interpreters. Typically the initial (main) interpreter is the only one. 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ci The PyInterpreterState typedef is in Include/pystate.h. 777db96d56Sopenharmony_ci */ 787db96d56Sopenharmony_cistruct _is { 797db96d56Sopenharmony_ci 807db96d56Sopenharmony_ci PyInterpreterState *next; 817db96d56Sopenharmony_ci 827db96d56Sopenharmony_ci struct pythreads { 837db96d56Sopenharmony_ci uint64_t next_unique_id; 847db96d56Sopenharmony_ci /* The linked list of threads, newest first. */ 857db96d56Sopenharmony_ci PyThreadState *head; 867db96d56Sopenharmony_ci /* Used in Modules/_threadmodule.c. */ 877db96d56Sopenharmony_ci long count; 887db96d56Sopenharmony_ci /* Support for runtime thread stack size tuning. 897db96d56Sopenharmony_ci A value of 0 means using the platform's default stack size 907db96d56Sopenharmony_ci or the size specified by the THREAD_STACK_SIZE macro. */ 917db96d56Sopenharmony_ci /* Used in Python/thread.c. */ 927db96d56Sopenharmony_ci size_t stacksize; 937db96d56Sopenharmony_ci } threads; 947db96d56Sopenharmony_ci 957db96d56Sopenharmony_ci /* Reference to the _PyRuntime global variable. This field exists 967db96d56Sopenharmony_ci to not have to pass runtime in addition to tstate to a function. 977db96d56Sopenharmony_ci Get runtime from tstate: tstate->interp->runtime. */ 987db96d56Sopenharmony_ci struct pyruntimestate *runtime; 997db96d56Sopenharmony_ci 1007db96d56Sopenharmony_ci int64_t id; 1017db96d56Sopenharmony_ci int64_t id_refcount; 1027db96d56Sopenharmony_ci int requires_idref; 1037db96d56Sopenharmony_ci PyThread_type_lock id_mutex; 1047db96d56Sopenharmony_ci 1057db96d56Sopenharmony_ci /* Has been initialized to a safe state. 1067db96d56Sopenharmony_ci 1077db96d56Sopenharmony_ci In order to be effective, this must be set to 0 during or right 1087db96d56Sopenharmony_ci after allocation. */ 1097db96d56Sopenharmony_ci int _initialized; 1107db96d56Sopenharmony_ci int finalizing; 1117db96d56Sopenharmony_ci 1127db96d56Sopenharmony_ci /* Was this interpreter statically allocated? */ 1137db96d56Sopenharmony_ci bool _static; 1147db96d56Sopenharmony_ci 1157db96d56Sopenharmony_ci struct _ceval_state ceval; 1167db96d56Sopenharmony_ci struct _gc_runtime_state gc; 1177db96d56Sopenharmony_ci 1187db96d56Sopenharmony_ci // sys.modules dictionary 1197db96d56Sopenharmony_ci PyObject *modules; 1207db96d56Sopenharmony_ci PyObject *modules_by_index; 1217db96d56Sopenharmony_ci // Dictionary of the sys module 1227db96d56Sopenharmony_ci PyObject *sysdict; 1237db96d56Sopenharmony_ci // Dictionary of the builtins module 1247db96d56Sopenharmony_ci PyObject *builtins; 1257db96d56Sopenharmony_ci // importlib module 1267db96d56Sopenharmony_ci PyObject *importlib; 1277db96d56Sopenharmony_ci // override for config->use_frozen_modules (for tests) 1287db96d56Sopenharmony_ci // (-1: "off", 1: "on", 0: no override) 1297db96d56Sopenharmony_ci int override_frozen_modules; 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci PyObject *codec_search_path; 1327db96d56Sopenharmony_ci PyObject *codec_search_cache; 1337db96d56Sopenharmony_ci PyObject *codec_error_registry; 1347db96d56Sopenharmony_ci int codecs_initialized; 1357db96d56Sopenharmony_ci 1367db96d56Sopenharmony_ci PyConfig config; 1377db96d56Sopenharmony_ci#ifdef HAVE_DLOPEN 1387db96d56Sopenharmony_ci int dlopenflags; 1397db96d56Sopenharmony_ci#endif 1407db96d56Sopenharmony_ci 1417db96d56Sopenharmony_ci PyObject *dict; /* Stores per-interpreter state */ 1427db96d56Sopenharmony_ci 1437db96d56Sopenharmony_ci PyObject *builtins_copy; 1447db96d56Sopenharmony_ci PyObject *import_func; 1457db96d56Sopenharmony_ci // Initialized to _PyEval_EvalFrameDefault(). 1467db96d56Sopenharmony_ci _PyFrameEvalFunction eval_frame; 1477db96d56Sopenharmony_ci 1487db96d56Sopenharmony_ci Py_ssize_t co_extra_user_count; 1497db96d56Sopenharmony_ci freefunc co_extra_freefuncs[MAX_CO_EXTRA_USERS]; 1507db96d56Sopenharmony_ci 1517db96d56Sopenharmony_ci#ifdef HAVE_FORK 1527db96d56Sopenharmony_ci PyObject *before_forkers; 1537db96d56Sopenharmony_ci PyObject *after_forkers_parent; 1547db96d56Sopenharmony_ci PyObject *after_forkers_child; 1557db96d56Sopenharmony_ci#endif 1567db96d56Sopenharmony_ci 1577db96d56Sopenharmony_ci struct _warnings_runtime_state warnings; 1587db96d56Sopenharmony_ci struct atexit_state atexit; 1597db96d56Sopenharmony_ci 1607db96d56Sopenharmony_ci PyObject *audit_hooks; 1617db96d56Sopenharmony_ci 1627db96d56Sopenharmony_ci struct _Py_unicode_state unicode; 1637db96d56Sopenharmony_ci struct _Py_float_state float_state; 1647db96d56Sopenharmony_ci /* Using a cache is very effective since typically only a single slice is 1657db96d56Sopenharmony_ci created and then deleted again. */ 1667db96d56Sopenharmony_ci PySliceObject *slice_cache; 1677db96d56Sopenharmony_ci 1687db96d56Sopenharmony_ci struct _Py_tuple_state tuple; 1697db96d56Sopenharmony_ci struct _Py_list_state list; 1707db96d56Sopenharmony_ci struct _Py_dict_state dict_state; 1717db96d56Sopenharmony_ci struct _Py_async_gen_state async_gen; 1727db96d56Sopenharmony_ci struct _Py_context_state context; 1737db96d56Sopenharmony_ci struct _Py_exc_state exc_state; 1747db96d56Sopenharmony_ci 1757db96d56Sopenharmony_ci struct ast_state ast; 1767db96d56Sopenharmony_ci struct type_cache type_cache; 1777db96d56Sopenharmony_ci struct callable_cache callable_cache; 1787db96d56Sopenharmony_ci 1797db96d56Sopenharmony_ci int int_max_str_digits; 1807db96d56Sopenharmony_ci 1817db96d56Sopenharmony_ci /* The following fields are here to avoid allocation during init. 1827db96d56Sopenharmony_ci The data is exposed through PyInterpreterState pointer fields. 1837db96d56Sopenharmony_ci These fields should not be accessed directly outside of init. 1847db96d56Sopenharmony_ci 1857db96d56Sopenharmony_ci All other PyInterpreterState pointer fields are populated when 1867db96d56Sopenharmony_ci needed and default to NULL. 1877db96d56Sopenharmony_ci 1887db96d56Sopenharmony_ci For now there are some exceptions to that rule, which require 1897db96d56Sopenharmony_ci allocation during init. These will be addressed on a case-by-case 1907db96d56Sopenharmony_ci basis. Also see _PyRuntimeState regarding the various mutex fields. 1917db96d56Sopenharmony_ci */ 1927db96d56Sopenharmony_ci 1937db96d56Sopenharmony_ci /* the initial PyInterpreterState.threads.head */ 1947db96d56Sopenharmony_ci PyThreadState _initial_thread; 1957db96d56Sopenharmony_ci}; 1967db96d56Sopenharmony_ci 1977db96d56Sopenharmony_ci 1987db96d56Sopenharmony_ci/* other API */ 1997db96d56Sopenharmony_ci 2007db96d56Sopenharmony_ciextern void _PyInterpreterState_ClearModules(PyInterpreterState *interp); 2017db96d56Sopenharmony_ciextern void _PyInterpreterState_Clear(PyThreadState *tstate); 2027db96d56Sopenharmony_ci 2037db96d56Sopenharmony_ci 2047db96d56Sopenharmony_ci/* cross-interpreter data registry */ 2057db96d56Sopenharmony_ci 2067db96d56Sopenharmony_ci/* For now we use a global registry of shareable classes. An 2077db96d56Sopenharmony_ci alternative would be to add a tp_* slot for a class's 2087db96d56Sopenharmony_ci crossinterpdatafunc. It would be simpler and more efficient. */ 2097db96d56Sopenharmony_ci 2107db96d56Sopenharmony_cistruct _xidregitem; 2117db96d56Sopenharmony_ci 2127db96d56Sopenharmony_cistruct _xidregitem { 2137db96d56Sopenharmony_ci PyTypeObject *cls; 2147db96d56Sopenharmony_ci crossinterpdatafunc getdata; 2157db96d56Sopenharmony_ci struct _xidregitem *next; 2167db96d56Sopenharmony_ci}; 2177db96d56Sopenharmony_ci 2187db96d56Sopenharmony_ciPyAPI_FUNC(PyInterpreterState*) _PyInterpreterState_LookUpID(int64_t); 2197db96d56Sopenharmony_ci 2207db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyInterpreterState_IDInitref(PyInterpreterState *); 2217db96d56Sopenharmony_ciPyAPI_FUNC(int) _PyInterpreterState_IDIncref(PyInterpreterState *); 2227db96d56Sopenharmony_ciPyAPI_FUNC(void) _PyInterpreterState_IDDecref(PyInterpreterState *); 2237db96d56Sopenharmony_ci 2247db96d56Sopenharmony_ci#ifdef __cplusplus 2257db96d56Sopenharmony_ci} 2267db96d56Sopenharmony_ci#endif 2277db96d56Sopenharmony_ci#endif /* !Py_INTERNAL_INTERP_H */ 228