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