| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | #ifndef Py_INTERNAL_PYSTATE_H
 | 
					
						
							|  |  |  | #define Py_INTERNAL_PYSTATE_H
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-09 13:03:37 +01:00
										 |  |  | #if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN)
 | 
					
						
							|  |  |  | #  error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN define"
 | 
					
						
							| 
									
										
										
										
											2018-11-01 01:51:40 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | #include "pystate.h"
 | 
					
						
							|  |  |  | #include "pythread.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-01 00:52:28 +01:00
										 |  |  | #include "pycore_ceval.h"
 | 
					
						
							| 
									
										
										
										
											2018-11-01 03:15:58 +01:00
										 |  |  | #include "pycore_pathconfig.h"
 | 
					
						
							| 
									
										
										
										
											2018-11-12 16:53:38 +01:00
										 |  |  | #include "pycore_pymem.h"
 | 
					
						
							| 
									
										
										
										
											2018-11-01 00:52:28 +01:00
										 |  |  | #include "pycore_warnings.h"
 | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 11:35:52 -07:00
										 |  |  | /* interpreter state */ | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 11:35:52 -07:00
										 |  |  | typedef PyObject* (*_PyFrameEvalFunction)(struct _frame *, int); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // The PyInterpreterState typedef is in Include/pystate.h.
 | 
					
						
							|  |  |  | struct _is { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct _is *next; | 
					
						
							|  |  |  |     struct _ts *tstate_head; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int64_t id; | 
					
						
							|  |  |  |     int64_t id_refcount; | 
					
						
							| 
									
										
										
										
											2019-03-15 16:35:46 -06:00
										 |  |  |     int requires_idref; | 
					
						
							| 
									
										
										
										
											2019-02-23 11:35:52 -07:00
										 |  |  |     PyThread_type_lock id_mutex; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-08 22:47:07 -07:00
										 |  |  |     int finalizing; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 11:35:52 -07:00
										 |  |  |     PyObject *modules; | 
					
						
							|  |  |  |     PyObject *modules_by_index; | 
					
						
							|  |  |  |     PyObject *sysdict; | 
					
						
							|  |  |  |     PyObject *builtins; | 
					
						
							|  |  |  |     PyObject *importlib; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Used in Python/sysmodule.c. */ | 
					
						
							|  |  |  |     int check_interval; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Used in Modules/_threadmodule.c. */ | 
					
						
							|  |  |  |     long num_threads; | 
					
						
							|  |  |  |     /* 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 pythread_stacksize; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     PyObject *codec_search_path; | 
					
						
							|  |  |  |     PyObject *codec_search_cache; | 
					
						
							|  |  |  |     PyObject *codec_error_registry; | 
					
						
							|  |  |  |     int codecs_initialized; | 
					
						
							|  |  |  |     int fscodec_initialized; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     _PyCoreConfig core_config; | 
					
						
							|  |  |  |     _PyMainInterpreterConfig config; | 
					
						
							|  |  |  | #ifdef HAVE_DLOPEN
 | 
					
						
							|  |  |  |     int dlopenflags; | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-15 17:47:43 -06:00
										 |  |  |     PyObject *dict;  /* Stores per-interpreter state */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 11:35:52 -07:00
										 |  |  |     PyObject *builtins_copy; | 
					
						
							|  |  |  |     PyObject *import_func; | 
					
						
							|  |  |  |     /* Initialized to PyEval_EvalFrameDefault(). */ | 
					
						
							|  |  |  |     _PyFrameEvalFunction eval_frame; | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 11:35:52 -07:00
										 |  |  |     Py_ssize_t co_extra_user_count; | 
					
						
							|  |  |  |     freefunc co_extra_freefuncs[MAX_CO_EXTRA_USERS]; | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 11:35:52 -07:00
										 |  |  | #ifdef HAVE_FORK
 | 
					
						
							|  |  |  |     PyObject *before_forkers; | 
					
						
							|  |  |  |     PyObject *after_forkers_parent; | 
					
						
							|  |  |  |     PyObject *after_forkers_child; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     /* AtExit module */ | 
					
						
							|  |  |  |     void (*pyexitfunc)(PyObject *); | 
					
						
							|  |  |  |     PyObject *pyexitmodule; | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 11:35:52 -07:00
										 |  |  |     uint64_t tstate_next_unique_id; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2018-01-29 18:23:44 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 11:35:52 -07:00
										 |  |  | PyAPI_FUNC(struct _is*) _PyInterpreterState_LookUpID(PY_INT64_T); | 
					
						
							| 
									
										
										
										
											2018-01-29 18:23:44 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 11:35:52 -07:00
										 |  |  | PyAPI_FUNC(int) _PyInterpreterState_IDInitref(struct _is *); | 
					
						
							|  |  |  | PyAPI_FUNC(void) _PyInterpreterState_IDIncref(struct _is *); | 
					
						
							|  |  |  | PyAPI_FUNC(void) _PyInterpreterState_IDDecref(struct _is *); | 
					
						
							| 
									
										
										
										
											2018-02-16 18:53:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-29 18:23:44 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* cross-interpreter data registry */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* For now we use a global registry of shareable classes.  An
 | 
					
						
							|  |  |  |    alternative would be to add a tp_* slot for a class's | 
					
						
							|  |  |  |    crossinterpdatafunc. It would be simpler and more efficient. */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _xidregitem; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _xidregitem { | 
					
						
							|  |  |  |     PyTypeObject *cls; | 
					
						
							|  |  |  |     crossinterpdatafunc getdata; | 
					
						
							|  |  |  |     struct _xidregitem *next; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-23 11:35:52 -07:00
										 |  |  | /* GIL state */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _gilstate_runtime_state { | 
					
						
							|  |  |  |     int check_enabled; | 
					
						
							|  |  |  |     /* Assuming the current thread holds the GIL, this is the
 | 
					
						
							|  |  |  |        PyThreadState for the current thread. */ | 
					
						
							|  |  |  |     _Py_atomic_address tstate_current; | 
					
						
							|  |  |  |     PyThreadFrameGetter getframe; | 
					
						
							|  |  |  |     /* The single PyInterpreterState used by this process'
 | 
					
						
							|  |  |  |        GILState implementation | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |     /* TODO: Given interp_main, it may be possible to kill this ref */ | 
					
						
							|  |  |  |     PyInterpreterState *autoInterpreterState; | 
					
						
							|  |  |  |     Py_tss_t autoTSSkey; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* hook for PyEval_GetFrame(), requested for Psyco */ | 
					
						
							|  |  |  | #define _PyThreadState_GetFrame _PyRuntime.gilstate.getframe
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Issue #26558: Flag to disable PyGILState_Check().
 | 
					
						
							|  |  |  |    If set to non-zero, PyGILState_Check() always return 1. */ | 
					
						
							|  |  |  | #define _PyGILState_check_enabled _PyRuntime.gilstate.check_enabled
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | /* Full Python runtime state */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct pyruntimestate { | 
					
						
							|  |  |  |     int initialized; | 
					
						
							|  |  |  |     int core_initialized; | 
					
						
							|  |  |  |     PyThreadState *finalizing; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct pyinterpreters { | 
					
						
							|  |  |  |         PyThread_type_lock mutex; | 
					
						
							|  |  |  |         PyInterpreterState *head; | 
					
						
							|  |  |  |         PyInterpreterState *main; | 
					
						
							|  |  |  |         /* _next_interp_id is an auto-numbered sequence of small
 | 
					
						
							|  |  |  |            integers.  It gets initialized in _PyInterpreterState_Init(), | 
					
						
							|  |  |  |            which is called in Py_Initialize(), and used in | 
					
						
							|  |  |  |            PyInterpreterState_New().  A negative interpreter ID | 
					
						
							|  |  |  |            indicates an error occurred.  The main interpreter will | 
					
						
							|  |  |  |            always have an ID of 0.  Overflow results in a RuntimeError. | 
					
						
							|  |  |  |            If that becomes a problem later then we can adjust, e.g. by | 
					
						
							|  |  |  |            using a Python int. */ | 
					
						
							|  |  |  |         int64_t next_id; | 
					
						
							|  |  |  |     } interpreters; | 
					
						
							| 
									
										
										
										
											2018-01-29 18:23:44 -07:00
										 |  |  |     // XXX Remove this field once we have a tp_* slot.
 | 
					
						
							|  |  |  |     struct _xidregistry { | 
					
						
							|  |  |  |         PyThread_type_lock mutex; | 
					
						
							|  |  |  |         struct _xidregitem *head; | 
					
						
							|  |  |  |     } xidregistry; | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-08 22:47:07 -07:00
										 |  |  |     unsigned long main_thread; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | #define NEXITFUNCS 32
 | 
					
						
							|  |  |  |     void (*exitfuncs[NEXITFUNCS])(void); | 
					
						
							|  |  |  |     int nexitfuncs; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct _gc_runtime_state gc; | 
					
						
							|  |  |  |     struct _warnings_runtime_state warnings; | 
					
						
							|  |  |  |     struct _ceval_runtime_state ceval; | 
					
						
							|  |  |  |     struct _gilstate_runtime_state gilstate; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // XXX Consolidate globals found via the check-c-globals script.
 | 
					
						
							|  |  |  | } _PyRuntimeState; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-15 15:48:08 -08:00
										 |  |  | #define _PyRuntimeState_INIT {.initialized = 0, .core_initialized = 0}
 | 
					
						
							| 
									
										
										
										
											2017-12-05 15:12:41 +01:00
										 |  |  | /* Note: _PyRuntimeState_INIT sets other fields to 0/NULL */ | 
					
						
							| 
									
										
										
										
											2017-11-15 15:48:08 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | PyAPI_DATA(_PyRuntimeState) _PyRuntime; | 
					
						
							| 
									
										
										
										
											2017-11-15 15:48:08 -08:00
										 |  |  | PyAPI_FUNC(_PyInitError) _PyRuntimeState_Init(_PyRuntimeState *); | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | PyAPI_FUNC(void) _PyRuntimeState_Fini(_PyRuntimeState *); | 
					
						
							| 
									
										
										
										
											2019-03-08 23:44:33 -07:00
										 |  |  | PyAPI_FUNC(void) _PyRuntimeState_ReInitThreads(void); | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-15 15:48:08 -08:00
										 |  |  | /* Initialize _PyRuntimeState.
 | 
					
						
							|  |  |  |    Return NULL on success, or return an error message on failure. */ | 
					
						
							|  |  |  | PyAPI_FUNC(_PyInitError) _PyRuntime_Initialize(void); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | #define _Py_CURRENTLY_FINALIZING(tstate) \
 | 
					
						
							|  |  |  |     (_PyRuntime.finalizing == tstate) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-01 01:51:40 +01:00
										 |  |  | /* Variable and macro for in-line access to current thread
 | 
					
						
							|  |  |  |    and interpreter state */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Get the current Python thread state.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Efficient macro reading directly the 'gilstate.tstate_current' atomic | 
					
						
							|  |  |  |    variable. The macro is unsafe: it does not check for error and it can | 
					
						
							|  |  |  |    return NULL. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The caller must hold the GIL. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    See also PyThreadState_Get() and PyThreadState_GET(). */ | 
					
						
							|  |  |  | #define _PyThreadState_GET() \
 | 
					
						
							|  |  |  |     ((PyThreadState*)_Py_atomic_load_relaxed(&_PyRuntime.gilstate.tstate_current)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Redefine PyThreadState_GET() as an alias to _PyThreadState_GET() */ | 
					
						
							|  |  |  | #undef PyThreadState_GET
 | 
					
						
							|  |  |  | #define PyThreadState_GET() _PyThreadState_GET()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Get the current interpreter state.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The macro is unsafe: it does not check for error and it can return NULL. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The caller must hold the GIL. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    See also _PyInterpreterState_Get() | 
					
						
							|  |  |  |    and _PyGILState_GetInterpreterStateUnsafe(). */ | 
					
						
							|  |  |  | #define _PyInterpreterState_GET_UNSAFE() (_PyThreadState_GET()->interp)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | /* Other */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-15 18:11:45 -08:00
										 |  |  | PyAPI_FUNC(_PyInitError) _PyInterpreterState_Enable(_PyRuntimeState *); | 
					
						
							| 
									
										
										
										
											2018-09-14 14:17:20 -07:00
										 |  |  | PyAPI_FUNC(void) _PyInterpreterState_DeleteExceptMain(void); | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif /* !Py_INTERNAL_PYSTATE_H */
 |