| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | #ifndef Py_INTERNAL_PYSTATE_H
 | 
					
						
							|  |  |  | #define Py_INTERNAL_PYSTATE_H
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "pystate.h"
 | 
					
						
							|  |  |  | #include "pyatomic.h"
 | 
					
						
							|  |  |  | #include "pythread.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "internal/mem.h"
 | 
					
						
							|  |  |  | #include "internal/ceval.h"
 | 
					
						
							|  |  |  | #include "internal/warnings.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* 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; | 
					
						
							| 
									
										
										
										
											2017-10-06 19:41:34 +09:00
										 |  |  |     Py_tss_t autoTSSkey; | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* 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-12-01 18:27:09 +01:00
										 |  |  | typedef struct { | 
					
						
							|  |  |  |     /* Full path to the Python program */ | 
					
						
							|  |  |  |     wchar_t *program_full_path; | 
					
						
							|  |  |  |     wchar_t *prefix; | 
					
						
							|  |  |  | #ifdef MS_WINDOWS
 | 
					
						
							|  |  |  |     wchar_t *dll_path; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     wchar_t *exec_prefix; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     /* Set by Py_SetPath(), or computed by _PyPathConfig_Init() */ | 
					
						
							|  |  |  |     wchar_t *module_search_path; | 
					
						
							|  |  |  | } _PyPathConfig; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-02 21:36:00 +02:00
										 |  |  | #define _PyPathConfig_INIT {.module_search_path = NULL}
 | 
					
						
							| 
									
										
										
										
											2017-12-01 20:50:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 18:27:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define NEXITFUNCS 32
 | 
					
						
							|  |  |  |     void (*exitfuncs[NEXITFUNCS])(void); | 
					
						
							|  |  |  |     int nexitfuncs; | 
					
						
							|  |  |  |     void (*pyexitfunc)(void); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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-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 *); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Other */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-15 18:11:45 -08:00
										 |  |  | PyAPI_FUNC(_PyInitError) _PyInterpreterState_Enable(_PyRuntimeState *); | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif /* !Py_INTERNAL_PYSTATE_H */
 |