| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | #ifndef Py_INTERNAL_INTERP_H
 | 
					
						
							|  |  |  | #define Py_INTERNAL_INTERP_H
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef Py_BUILD_CORE
 | 
					
						
							|  |  |  | #  error "this header requires Py_BUILD_CORE define"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-21 20:05:59 +02:00
										 |  |  | #include <stdbool.h>              // bool
 | 
					
						
							| 
									
										
										
										
											2022-01-12 16:28:46 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-17 23:11:03 +01:00
										 |  |  | #include "pycore_ast_state.h"     // struct ast_state
 | 
					
						
							| 
									
										
										
										
											2023-04-05 18:42:02 -06:00
										 |  |  | #include "pycore_atexit.h"        // struct atexit_state
 | 
					
						
							| 
									
										
										
										
											2022-12-08 17:17:20 -07:00
										 |  |  | #include "pycore_ceval_state.h"   // struct _ceval_state
 | 
					
						
							| 
									
										
										
										
											2022-03-07 11:45:00 -08:00
										 |  |  | #include "pycore_code.h"          // struct callable_cache
 | 
					
						
							| 
									
										
										
										
											2024-05-02 15:25:36 -07:00
										 |  |  | #include "pycore_codecs.h"        // struct codecs_state
 | 
					
						
							| 
									
										
										
										
											2021-12-09 12:59:26 -07:00
										 |  |  | #include "pycore_context.h"       // struct _Py_context_state
 | 
					
						
							| 
									
										
										
										
											2023-10-30 16:53:10 -06:00
										 |  |  | #include "pycore_crossinterp.h"   // struct _xidregistry
 | 
					
						
							| 
									
										
										
										
											2022-11-16 10:37:29 -07:00
										 |  |  | #include "pycore_dict_state.h"    // struct _Py_dict_state
 | 
					
						
							| 
									
										
										
										
											2023-02-28 13:14:40 -07:00
										 |  |  | #include "pycore_dtoa.h"          // struct _dtoa_state
 | 
					
						
							| 
									
										
										
										
											2021-12-09 12:59:26 -07:00
										 |  |  | #include "pycore_exceptions.h"    // struct _Py_exc_state
 | 
					
						
							|  |  |  | #include "pycore_floatobject.h"   // struct _Py_float_state
 | 
					
						
							| 
									
										
										
										
											2022-11-22 04:06:44 -08:00
										 |  |  | #include "pycore_function.h"      // FUNC_MAX_WATCHERS
 | 
					
						
							| 
									
										
										
										
											2022-04-06 13:58:07 +02:00
										 |  |  | #include "pycore_gc.h"            // struct _gc_runtime_state
 | 
					
						
							| 
									
										
										
										
											2023-08-21 20:05:59 +02:00
										 |  |  | #include "pycore_genobject.h"     // struct _Py_async_gen_state
 | 
					
						
							|  |  |  | #include "pycore_global_objects.h"// struct _Py_interp_cached_objects
 | 
					
						
							| 
									
										
										
										
											2023-02-15 15:32:31 -07:00
										 |  |  | #include "pycore_import.h"        // struct _import_state
 | 
					
						
							| 
									
										
										
										
											2023-07-22 23:35:27 +02:00
										 |  |  | #include "pycore_instruments.h"   // _PY_MONITORING_EVENTS
 | 
					
						
							| 
									
										
										
										
											2021-12-09 12:59:26 -07:00
										 |  |  | #include "pycore_list.h"          // struct _Py_list_state
 | 
					
						
							| 
									
										
										
										
											2024-01-04 17:21:40 -05:00
										 |  |  | #include "pycore_mimalloc.h"      // struct _mimalloc_interp_state
 | 
					
						
							| 
									
										
										
										
											2023-08-21 20:05:59 +02:00
										 |  |  | #include "pycore_object_state.h"  // struct _py_object_state
 | 
					
						
							|  |  |  | #include "pycore_obmalloc.h"      // struct _obmalloc_state
 | 
					
						
							| 
									
										
										
										
											2024-02-16 15:25:19 -05:00
										 |  |  | #include "pycore_qsbr.h"          // struct _qsbr_state
 | 
					
						
							| 
									
										
										
										
											2023-12-07 14:11:45 -05:00
										 |  |  | #include "pycore_tstate.h"        // _PyThreadStateImpl
 | 
					
						
							| 
									
										
										
										
											2021-12-09 12:59:26 -07:00
										 |  |  | #include "pycore_tuple.h"         // struct _Py_tuple_state
 | 
					
						
							| 
									
										
										
										
											2023-08-21 20:05:59 +02:00
										 |  |  | #include "pycore_typeobject.h"    // struct types_state
 | 
					
						
							| 
									
										
										
										
											2021-12-09 12:59:26 -07:00
										 |  |  | #include "pycore_unicodeobject.h" // struct _Py_unicode_state
 | 
					
						
							| 
									
										
										
										
											2020-11-02 22:03:28 +01:00
										 |  |  | #include "pycore_warnings.h"      // struct _warnings_runtime_state
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-15 09:45:11 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-19 14:27:46 -06:00
										 |  |  | struct _Py_long_state { | 
					
						
							|  |  |  |     int max_str_digits; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-23 13:08:23 -05:00
										 |  |  | // Support for stop-the-world events. This exists in both the PyRuntime struct
 | 
					
						
							|  |  |  | // for global pauses and in each PyInterpreterState for per-interpreter pauses.
 | 
					
						
							|  |  |  | struct _stoptheworld_state { | 
					
						
							|  |  |  |     PyMutex mutex;       // Serializes stop-the-world attempts.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // NOTE: The below fields are protected by HEAD_LOCK(runtime), not by the
 | 
					
						
							|  |  |  |     // above mutex.
 | 
					
						
							|  |  |  |     bool requested;      // Set when a pause is requested.
 | 
					
						
							|  |  |  |     bool world_stopped;  // Set when the world is stopped.
 | 
					
						
							|  |  |  |     bool is_global;      // Set when contained in PyRuntime struct.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     PyEvent stop_event;  // Set when thread_countdown reaches zero.
 | 
					
						
							|  |  |  |     Py_ssize_t thread_countdown;  // Number of threads that must pause.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     PyThreadState *requester; // Thread that requested the pause (may be NULL).
 | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2023-10-04 16:35:27 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 07:58:38 -07:00
										 |  |  | #ifdef Py_GIL_DISABLED
 | 
					
						
							|  |  |  | // This should be prime but otherwise the choice is arbitrary. A larger value
 | 
					
						
							|  |  |  | // increases concurrency at the expense of memory.
 | 
					
						
							|  |  |  | #  define NUM_WEAKREF_LIST_LOCKS 127
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-04 16:35:27 -06:00
										 |  |  | /* cross-interpreter data registry */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 06:10:51 -05:00
										 |  |  | /* Tracks some rare events per-interpreter, used by the optimizer to turn on/off
 | 
					
						
							|  |  |  |    specific optimizations. */ | 
					
						
							|  |  |  | typedef struct _rare_events { | 
					
						
							|  |  |  |     /* Setting an object's class, obj.__class__ = ... */ | 
					
						
							|  |  |  |     uint8_t set_class; | 
					
						
							|  |  |  |     /* Setting the bases of a class, cls.__bases__ = ... */ | 
					
						
							|  |  |  |     uint8_t set_bases; | 
					
						
							|  |  |  |     /* Setting the PEP 523 frame eval function, _PyInterpreterState_SetFrameEvalFunc() */ | 
					
						
							|  |  |  |     uint8_t set_eval_frame_func; | 
					
						
							|  |  |  |     /* Modifying the builtins,  __builtins__.__dict__[var] = ... */ | 
					
						
							|  |  |  |     uint8_t builtin_dict; | 
					
						
							|  |  |  |     /* Modifying a function, e.g. func.__defaults__ = ..., etc. */ | 
					
						
							|  |  |  |     uint8_t func_modification; | 
					
						
							|  |  |  | } _rare_events; | 
					
						
							| 
									
										
										
										
											2023-10-04 16:35:27 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | /* interpreter state */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-12 16:28:46 -07:00
										 |  |  | /* PyInterpreterState holds the global state for one of the runtime's
 | 
					
						
							|  |  |  |    interpreters.  Typically the initial (main) interpreter is the only one. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-09 06:58:30 -07:00
										 |  |  |    The PyInterpreterState typedef is in Include/pytypedefs.h. | 
					
						
							| 
									
										
										
										
											2022-01-12 16:28:46 -07:00
										 |  |  |    */ | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | struct _is { | 
					
						
							| 
									
										
										
										
											2023-06-08 11:41:24 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-06 00:05:52 +08:00
										 |  |  |     /* This struct contains the eval_breaker,
 | 
					
						
							| 
									
										
										
										
											2023-07-28 13:55:25 +01:00
										 |  |  |      * which is by far the hottest field in this struct | 
					
						
							|  |  |  |      * and should be placed at the beginning. */ | 
					
						
							|  |  |  |     struct _ceval_state ceval; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-08 16:59:38 +01:00
										 |  |  |     PyInterpreterState *next; | 
					
						
							| 
									
										
										
										
											2023-06-08 11:41:24 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-27 16:26:53 +01:00
										 |  |  |     int64_t id; | 
					
						
							|  |  |  |     int64_t id_refcount; | 
					
						
							|  |  |  |     int requires_idref; | 
					
						
							|  |  |  |     PyThread_type_lock id_mutex; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-10 18:37:01 -06:00
										 |  |  | #define _PyInterpreterState_WHENCE_NOTSET -1
 | 
					
						
							|  |  |  | #define _PyInterpreterState_WHENCE_UNKNOWN 0
 | 
					
						
							|  |  |  | #define _PyInterpreterState_WHENCE_RUNTIME 1
 | 
					
						
							|  |  |  | #define _PyInterpreterState_WHENCE_LEGACY_CAPI 2
 | 
					
						
							|  |  |  | #define _PyInterpreterState_WHENCE_CAPI 3
 | 
					
						
							|  |  |  | #define _PyInterpreterState_WHENCE_XI 4
 | 
					
						
							| 
									
										
										
										
											2024-04-11 17:23:25 -06:00
										 |  |  | #define _PyInterpreterState_WHENCE_STDLIB 5
 | 
					
						
							|  |  |  | #define _PyInterpreterState_WHENCE_MAX 5
 | 
					
						
							| 
									
										
										
										
											2024-04-10 18:37:01 -06:00
										 |  |  |     long _whence; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-27 16:26:53 +01:00
										 |  |  |     /* Has been initialized to a safe state.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        In order to be effective, this must be set to 0 during or right | 
					
						
							|  |  |  |        after allocation. */ | 
					
						
							|  |  |  |     int _initialized; | 
					
						
							| 
									
										
										
										
											2024-04-10 18:37:01 -06:00
										 |  |  |     /* Has been fully initialized via pylifecycle.c. */ | 
					
						
							|  |  |  |     int _ready; | 
					
						
							| 
									
										
										
										
											2023-06-27 16:26:53 +01:00
										 |  |  |     int finalizing; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-04 16:09:48 +01:00
										 |  |  |     uintptr_t last_restart_version; | 
					
						
							| 
									
										
										
										
											2021-12-07 14:03:47 -07:00
										 |  |  |     struct pythreads { | 
					
						
							|  |  |  |         uint64_t next_unique_id; | 
					
						
							| 
									
										
										
										
											2022-01-12 16:28:46 -07:00
										 |  |  |         /* The linked list of threads, newest first. */ | 
					
						
							| 
									
										
										
										
											2022-03-03 23:08:07 +01:00
										 |  |  |         PyThreadState *head; | 
					
						
							| 
									
										
										
										
											2023-10-02 14:12:12 -06:00
										 |  |  |         /* The thread currently executing in the __main__ module, if any. */ | 
					
						
							|  |  |  |         PyThreadState *main; | 
					
						
							| 
									
										
										
										
											2021-12-07 14:03:47 -07:00
										 |  |  |         /* Used in Modules/_threadmodule.c. */ | 
					
						
							| 
									
										
										
										
											2024-02-12 09:44:00 -08:00
										 |  |  |         Py_ssize_t count; | 
					
						
							| 
									
										
										
										
											2021-12-07 14:03:47 -07:00
										 |  |  |         /* Support for runtime thread stack size tuning.
 | 
					
						
							|  |  |  |            A value of 0 means using the platform's default stack size | 
					
						
							|  |  |  |            or the size specified by the THREAD_STACK_SIZE macro. */ | 
					
						
							|  |  |  |         /* Used in Python/thread.c. */ | 
					
						
							|  |  |  |         size_t stacksize; | 
					
						
							|  |  |  |     } threads; | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* Reference to the _PyRuntime global variable. This field exists
 | 
					
						
							|  |  |  |        to not have to pass runtime in addition to tstate to a function. | 
					
						
							|  |  |  |        Get runtime from tstate: tstate->interp->runtime. */ | 
					
						
							|  |  |  |     struct pyruntimestate *runtime; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-08 16:59:38 +01:00
										 |  |  |     /* Set by Py_EndInterpreter().
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-08 16:59:38 +01:00
										 |  |  |        Use _PyInterpreterState_GetFinalizing() | 
					
						
							|  |  |  |        and _PyInterpreterState_SetFinalizing() | 
					
						
							|  |  |  |        to access it, don't access it directly. */ | 
					
						
							| 
									
										
										
										
											2023-10-10 23:17:08 +09:00
										 |  |  |     PyThreadState* _finalizing; | 
					
						
							| 
									
										
										
										
											2023-09-27 13:41:06 -06:00
										 |  |  |     /* The ID of the OS thread in which we are finalizing. */ | 
					
						
							|  |  |  |     unsigned long _finalizing_id; | 
					
						
							| 
									
										
										
										
											2023-06-08 16:59:38 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     struct _gc_runtime_state gc; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-27 16:26:53 +01:00
										 |  |  |     /* The following fields are here to avoid allocation during init.
 | 
					
						
							|  |  |  |        The data is exposed through PyInterpreterState pointer fields. | 
					
						
							|  |  |  |        These fields should not be accessed directly outside of init. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        All other PyInterpreterState pointer fields are populated when | 
					
						
							|  |  |  |        needed and default to NULL. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        For now there are some exceptions to that rule, which require | 
					
						
							|  |  |  |        allocation during init.  These will be addressed on a case-by-case | 
					
						
							|  |  |  |        basis.  Also see _PyRuntimeState regarding the various mutex fields. | 
					
						
							|  |  |  |        */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-12 15:14:13 +01:00
										 |  |  |     // Dictionary of the sys module
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  |     PyObject *sysdict; | 
					
						
							| 
									
										
										
										
											2023-06-27 17:09:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-12 15:14:13 +01:00
										 |  |  |     // Dictionary of the builtins module
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  |     PyObject *builtins; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-27 17:09:15 +01:00
										 |  |  |     struct _import_state imports; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* The per-interpreter GIL, which might not be used. */ | 
					
						
							|  |  |  |     struct _gil_runtime_state _gil; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-27 16:26:53 +01:00
										 |  |  |      /* ---------- IMPORTANT ---------------------------
 | 
					
						
							|  |  |  |      The fields above this line are declared as early as | 
					
						
							|  |  |  |      possible to facilitate out-of-process observability | 
					
						
							|  |  |  |      tools. */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-02 15:25:36 -07:00
										 |  |  |     struct codecs_state codecs; | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     PyConfig config; | 
					
						
							| 
									
										
										
										
											2022-10-26 11:16:30 -06:00
										 |  |  |     unsigned long feature_flags; | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     PyObject *dict;  /* Stores per-interpreter state */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-14 14:01:35 -06:00
										 |  |  |     PyObject *sysdict_copy; | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  |     PyObject *builtins_copy; | 
					
						
							| 
									
										
										
										
											2020-11-12 15:14:13 +01:00
										 |  |  |     // Initialized to _PyEval_EvalFrameDefault().
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  |     _PyFrameEvalFunction eval_frame; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-22 04:06:44 -08:00
										 |  |  |     PyFunction_WatchCallback func_watchers[FUNC_MAX_WATCHERS]; | 
					
						
							|  |  |  |     // One bit is set for each non-NULL entry in func_watchers
 | 
					
						
							|  |  |  |     uint8_t active_func_watchers; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  |     Py_ssize_t co_extra_user_count; | 
					
						
							|  |  |  |     freefunc co_extra_freefuncs[MAX_CO_EXTRA_USERS]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-01 17:36:40 -06:00
										 |  |  |     /* cross-interpreter data and utils */ | 
					
						
							|  |  |  |     struct _xi_state xi; | 
					
						
							| 
									
										
										
										
											2023-10-04 16:35:27 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | #ifdef HAVE_FORK
 | 
					
						
							|  |  |  |     PyObject *before_forkers; | 
					
						
							|  |  |  |     PyObject *after_forkers_parent; | 
					
						
							|  |  |  |     PyObject *after_forkers_child; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-12-14 23:07:54 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  |     struct _warnings_runtime_state warnings; | 
					
						
							| 
									
										
										
										
											2020-12-15 14:34:19 +01:00
										 |  |  |     struct atexit_state atexit; | 
					
						
							| 
									
										
										
										
											2024-01-23 13:08:23 -05:00
										 |  |  |     struct _stoptheworld_state stoptheworld; | 
					
						
							| 
									
										
										
										
											2024-02-16 15:25:19 -05:00
										 |  |  |     struct _qsbr_shared qsbr; | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-04 17:21:40 -05:00
										 |  |  | #if defined(Py_GIL_DISABLED)
 | 
					
						
							|  |  |  |     struct _mimalloc_interp_state mimalloc; | 
					
						
							| 
									
										
										
										
											2024-02-09 17:08:32 -05:00
										 |  |  |     struct _brc_state brc;  // biased reference counting state
 | 
					
						
							| 
									
										
										
										
											2024-04-08 07:58:38 -07:00
										 |  |  |     PyMutex weakref_locks[NUM_WEAKREF_LIST_LOCKS]; | 
					
						
							| 
									
										
										
										
											2024-01-04 17:21:40 -05:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-26 19:38:14 -08:00
										 |  |  |     // Per-interpreter state for the obmalloc allocator.  For the main
 | 
					
						
							|  |  |  |     // interpreter and for all interpreters that don't have their
 | 
					
						
							|  |  |  |     // own obmalloc state, this points to the static structure in
 | 
					
						
							|  |  |  |     // obmalloc.c obmalloc_state_main.  For other interpreters, it is
 | 
					
						
							|  |  |  |     // heap allocated by _PyMem_init_obmalloc() and freed when the
 | 
					
						
							|  |  |  |     // interpreter structure is freed.  In the case of a heap allocated
 | 
					
						
							|  |  |  |     // obmalloc state, it is not safe to hold on to or use memory after
 | 
					
						
							|  |  |  |     // the interpreter is freed. The obmalloc state corresponding to
 | 
					
						
							|  |  |  |     // that allocated memory is gone.  See free_obmalloc_arenas() for
 | 
					
						
							|  |  |  |     // more comments.
 | 
					
						
							|  |  |  |     struct _obmalloc_state *obmalloc; | 
					
						
							| 
									
										
										
										
											2023-06-27 16:26:53 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  |     PyObject *audit_hooks; | 
					
						
							| 
									
										
										
										
											2022-10-21 07:41:51 -06:00
										 |  |  |     PyType_WatchCallback type_watchers[TYPE_MAX_WATCHERS]; | 
					
						
							| 
									
										
										
										
											2022-12-02 09:28:27 -08:00
										 |  |  |     PyCode_WatchCallback code_watchers[CODE_MAX_WATCHERS]; | 
					
						
							|  |  |  |     // One bit is set for each non-NULL entry in code_watchers
 | 
					
						
							|  |  |  |     uint8_t active_code_watchers; | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-21 11:46:09 -06:00
										 |  |  |     struct _py_object_state object_state; | 
					
						
							| 
									
										
										
										
											2020-06-23 11:33:18 +02:00
										 |  |  |     struct _Py_unicode_state unicode; | 
					
						
							| 
									
										
										
										
											2022-10-19 14:27:46 -06:00
										 |  |  |     struct _Py_long_state long_state; | 
					
						
							| 
									
										
										
										
											2023-02-28 13:14:40 -07:00
										 |  |  |     struct _dtoa_state dtoa; | 
					
						
							| 
									
										
										
										
											2023-03-08 15:56:36 -07:00
										 |  |  |     struct _py_func_state func_state; | 
					
						
							| 
									
										
										
										
											2020-06-23 11:33:18 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     struct _Py_dict_state dict_state; | 
					
						
							| 
									
										
										
										
											2020-06-23 22:55:46 +02:00
										 |  |  |     struct _Py_exc_state exc_state; | 
					
						
							| 
									
										
										
										
											2024-02-20 13:04:37 -05:00
										 |  |  |     struct _Py_mem_interp_free_queue mem_free_queue; | 
					
						
							| 
									
										
										
										
											2020-11-02 22:03:28 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     struct ast_state ast; | 
					
						
							| 
									
										
										
										
											2022-07-26 17:26:43 -06:00
										 |  |  |     struct types_state types; | 
					
						
							| 
									
										
										
										
											2022-03-07 11:45:00 -08:00
										 |  |  |     struct callable_cache callable_cache; | 
					
						
							| 
									
										
										
										
											2023-06-02 11:46:18 +01:00
										 |  |  |     _PyOptimizerObject *optimizer; | 
					
						
							| 
									
										
										
										
											2023-10-23 14:49:09 +01:00
										 |  |  |     _PyExecutorObject *executor_list_head; | 
					
						
							| 
									
										
										
										
											2024-02-20 09:39:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 06:10:51 -05:00
										 |  |  |     _rare_events rare_events; | 
					
						
							| 
									
										
										
										
											2024-02-02 12:14:34 +00:00
										 |  |  |     PyDict_WatchCallback builtins_dict_watcher; | 
					
						
							| 
									
										
										
										
											2022-01-12 16:28:46 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-05 08:03:53 +01:00
										 |  |  |     _Py_GlobalMonitors monitors; | 
					
						
							| 
									
										
										
										
											2023-04-12 12:04:55 +01:00
										 |  |  |     bool sys_profile_initialized; | 
					
						
							|  |  |  |     bool sys_trace_initialized; | 
					
						
							|  |  |  |     Py_ssize_t sys_profiling_threads; /* Count of threads with c_profilefunc set */ | 
					
						
							|  |  |  |     Py_ssize_t sys_tracing_threads; /* Count of threads with c_tracefunc set */ | 
					
						
							| 
									
										
										
										
											2023-07-22 23:35:27 +02:00
										 |  |  |     PyObject *monitoring_callables[PY_MONITORING_TOOL_IDS][_PY_MONITORING_EVENTS]; | 
					
						
							| 
									
										
										
										
											2023-04-12 12:04:55 +01:00
										 |  |  |     PyObject *monitoring_tool_names[PY_MONITORING_TOOL_IDS]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-11 14:24:18 -07:00
										 |  |  |     struct _Py_interp_cached_objects cached_objects; | 
					
						
							|  |  |  |     struct _Py_interp_static_objects static_objects; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-07 14:11:45 -05:00
										 |  |  |     /* the initial PyInterpreterState.threads.head */ | 
					
						
							|  |  |  |     _PyThreadStateImpl _initial_thread; | 
					
						
							| 
									
										
										
										
											2023-10-13 11:25:37 +02:00
										 |  |  |     Py_ssize_t _interactive_src_count; | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-12 16:28:46 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* other API */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-30 22:51:02 +01:00
										 |  |  | extern void _PyInterpreterState_Clear(PyThreadState *tstate); | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-15 13:59:26 -06:00
										 |  |  | static inline PyThreadState* | 
					
						
							|  |  |  | _PyInterpreterState_GetFinalizing(PyInterpreterState *interp) { | 
					
						
							| 
									
										
										
										
											2023-10-10 23:17:08 +09:00
										 |  |  |     return (PyThreadState*)_Py_atomic_load_ptr_relaxed(&interp->_finalizing); | 
					
						
							| 
									
										
										
										
											2023-05-15 13:59:26 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-27 13:41:06 -06:00
										 |  |  | static inline unsigned long | 
					
						
							|  |  |  | _PyInterpreterState_GetFinalizingID(PyInterpreterState *interp) { | 
					
						
							|  |  |  |     return _Py_atomic_load_ulong_relaxed(&interp->_finalizing_id); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-15 13:59:26 -06:00
										 |  |  | static inline void | 
					
						
							|  |  |  | _PyInterpreterState_SetFinalizing(PyInterpreterState *interp, PyThreadState *tstate) { | 
					
						
							| 
									
										
										
										
											2023-10-10 23:17:08 +09:00
										 |  |  |     _Py_atomic_store_ptr_relaxed(&interp->_finalizing, tstate); | 
					
						
							| 
									
										
										
										
											2023-09-27 13:41:06 -06:00
										 |  |  |     if (tstate == NULL) { | 
					
						
							|  |  |  |         _Py_atomic_store_ulong_relaxed(&interp->_finalizing_id, 0); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |         // XXX Re-enable this assert once gh-109860 is fixed.
 | 
					
						
							|  |  |  |         //assert(tstate->thread_id == PyThread_get_thread_ident());
 | 
					
						
							|  |  |  |         _Py_atomic_store_ulong_relaxed(&interp->_finalizing_id, | 
					
						
							|  |  |  |                                        tstate->thread_id); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-05-15 13:59:26 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 09:56:12 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 11:15:02 -06:00
										 |  |  | // Exports for the _testinternalcapi module.
 | 
					
						
							|  |  |  | PyAPI_FUNC(int64_t) _PyInterpreterState_ObjectToID(PyObject *); | 
					
						
							| 
									
										
										
										
											2023-10-09 07:39:51 -06:00
										 |  |  | PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_LookUpID(int64_t); | 
					
						
							| 
									
										
										
										
											2024-03-21 09:56:12 -06:00
										 |  |  | PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_LookUpIDObject(PyObject *); | 
					
						
							| 
									
										
										
										
											2023-12-12 08:24:31 -07:00
										 |  |  | PyAPI_FUNC(int) _PyInterpreterState_IDInitref(PyInterpreterState *); | 
					
						
							|  |  |  | PyAPI_FUNC(int) _PyInterpreterState_IDIncref(PyInterpreterState *); | 
					
						
							|  |  |  | PyAPI_FUNC(void) _PyInterpreterState_IDDecref(PyInterpreterState *); | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-11 17:23:25 -06:00
										 |  |  | PyAPI_FUNC(int) _PyInterpreterState_IsReady(PyInterpreterState *interp); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-10 18:37:01 -06:00
										 |  |  | PyAPI_FUNC(long) _PyInterpreterState_GetWhence(PyInterpreterState *interp); | 
					
						
							|  |  |  | extern void _PyInterpreterState_SetWhence( | 
					
						
							|  |  |  |     PyInterpreterState *interp, | 
					
						
							|  |  |  |     long whence); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-02 03:39:38 +02:00
										 |  |  | extern const PyConfig* _PyInterpreterState_GetConfig(PyInterpreterState *interp); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:28:35 +02:00
										 |  |  | // Get a copy of the current interpreter configuration.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Return 0 on success. Raise an exception and return -1 on error.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // The caller must initialize 'config', using PyConfig_InitPythonConfig()
 | 
					
						
							|  |  |  | // for example.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Python must be preinitialized to call this method.
 | 
					
						
							|  |  |  | // The caller must hold the GIL.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Once done with the configuration, PyConfig_Clear() must be called to clear
 | 
					
						
							|  |  |  | // it.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Export for '_testinternalcapi' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 03:39:38 +02:00
										 |  |  | PyAPI_FUNC(int) _PyInterpreterState_GetConfigCopy( | 
					
						
							|  |  |  |     struct PyConfig *config); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:28:35 +02:00
										 |  |  | // Set the configuration of the current interpreter.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // This function should be called during or just after the Python
 | 
					
						
							|  |  |  | // initialization.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Update the sys module with the new configuration. If the sys module was
 | 
					
						
							|  |  |  | // modified directly after the Python initialization, these changes are lost.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Some configuration like faulthandler or warnoptions can be updated in the
 | 
					
						
							|  |  |  | // configuration, but don't reconfigure Python (don't enable/disable
 | 
					
						
							|  |  |  | // faulthandler and don't reconfigure warnings filters).
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Return 0 on success. Raise an exception and return -1 on error.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // The configuration should come from _PyInterpreterState_GetConfigCopy().
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Export for '_testinternalcapi' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 03:39:38 +02:00
										 |  |  | PyAPI_FUNC(int) _PyInterpreterState_SetConfig( | 
					
						
							|  |  |  |     const struct PyConfig *config); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-04 18:55:45 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  | Runtime Feature Flags | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Each flag indicate whether or not a specific runtime feature | 
					
						
							|  |  |  | is available in a given context.  For example, forking the process | 
					
						
							|  |  |  | might not be allowed in the current interpreter (i.e. os.fork() would fail). | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Set if the interpreter share obmalloc runtime state
 | 
					
						
							|  |  |  |    with the main interpreter. */ | 
					
						
							|  |  |  | #define Py_RTFLAGS_USE_MAIN_OBMALLOC (1UL << 5)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Set if import should check a module for subinterpreter support. */ | 
					
						
							|  |  |  | #define Py_RTFLAGS_MULTI_INTERP_EXTENSIONS (1UL << 8)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Set if threads are allowed. */ | 
					
						
							|  |  |  | #define Py_RTFLAGS_THREADS (1UL << 10)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Set if daemon threads are allowed. */ | 
					
						
							|  |  |  | #define Py_RTFLAGS_DAEMON_THREADS (1UL << 11)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Set if os.fork() is allowed. */ | 
					
						
							|  |  |  | #define Py_RTFLAGS_FORK (1UL << 15)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Set if os.exec*() is allowed. */ | 
					
						
							|  |  |  | #define Py_RTFLAGS_EXEC (1UL << 16)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern int _PyInterpreterState_HasFeature(PyInterpreterState *interp, | 
					
						
							|  |  |  |                                           unsigned long feature); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-01 12:43:30 +02:00
										 |  |  | PyAPI_FUNC(PyStatus) _PyInterpreterState_New( | 
					
						
							|  |  |  |     PyThreadState *tstate, | 
					
						
							|  |  |  |     PyInterpreterState **pinterp); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-04 18:55:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-25 06:10:51 -05:00
										 |  |  | #define RARE_EVENT_INTERP_INC(interp, name) \
 | 
					
						
							|  |  |  |     do { \ | 
					
						
							|  |  |  |         /* saturating add */ \ | 
					
						
							|  |  |  |         if (interp->rare_events.name < UINT8_MAX) interp->rare_events.name++; \ | 
					
						
							|  |  |  |         RARE_EVENT_STAT_INC(name); \ | 
					
						
							|  |  |  |     } while (0); \ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define RARE_EVENT_INC(name) \
 | 
					
						
							|  |  |  |     do { \ | 
					
						
							|  |  |  |         PyInterpreterState *interp = PyInterpreterState_Get(); \ | 
					
						
							|  |  |  |         RARE_EVENT_INTERP_INC(interp, name); \ | 
					
						
							|  |  |  |     } while (0); \ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 12:47:17 +02:00
										 |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif /* !Py_INTERNAL_INTERP_H */
 |