| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | #ifndef Py_INTERNAL_PYSTATE_H
 | 
					
						
							|  |  |  | #define Py_INTERNAL_PYSTATE_H
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 23:02:26 +02:00
										 |  |  | #ifndef Py_BUILD_CORE
 | 
					
						
							|  |  |  | #  error "this header requires Py_BUILD_CORE define"
 | 
					
						
							| 
									
										
										
										
											2018-11-01 01:51:40 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-02 23:51:20 +02:00
										 |  |  | #include "pycore_gil.h"       /* struct _gil_runtime_state  */
 | 
					
						
							|  |  |  | #include "pycore_pymem.h"     /* struct _gc_runtime_state */
 | 
					
						
							|  |  |  | #include "pycore_warnings.h"  /* struct _warnings_runtime_state */
 | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-10 23:39:09 +02:00
										 |  |  | /* ceval state */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-03 18:14:24 +02:00
										 |  |  | struct _pending_calls { | 
					
						
							| 
									
										
										
										
											2019-05-10 23:39:09 +02:00
										 |  |  |     int finishing; | 
					
						
							|  |  |  |     PyThread_type_lock lock; | 
					
						
							|  |  |  |     /* Request for running pending calls. */ | 
					
						
							|  |  |  |     _Py_atomic_int calls_to_do; | 
					
						
							|  |  |  |     /* Request for looking at the `async_exc` field of the current
 | 
					
						
							|  |  |  |        thread state. | 
					
						
							|  |  |  |        Guarded by the GIL. */ | 
					
						
							|  |  |  |     int async_exc; | 
					
						
							|  |  |  | #define NPENDINGCALLS 32
 | 
					
						
							|  |  |  |     struct { | 
					
						
							|  |  |  |         int (*func)(void *); | 
					
						
							|  |  |  |         void *arg; | 
					
						
							|  |  |  |     } calls[NPENDINGCALLS]; | 
					
						
							|  |  |  |     int first; | 
					
						
							|  |  |  |     int last; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _ceval_runtime_state { | 
					
						
							|  |  |  |     int recursion_limit; | 
					
						
							|  |  |  |     /* Records whether tracing is on for any thread.  Counts the number
 | 
					
						
							|  |  |  |        of threads for which tstate->c_tracefunc is non-NULL, so if the | 
					
						
							|  |  |  |        value is 0, we know we don't have to check this thread's | 
					
						
							|  |  |  |        c_tracefunc.  This speeds up the if statement in | 
					
						
							|  |  |  |        PyEval_EvalFrameEx() after fast_next_opcode. */ | 
					
						
							|  |  |  |     int tracing_possible; | 
					
						
							|  |  |  |     /* This single variable consolidates all requests to break out of
 | 
					
						
							|  |  |  |        the fast path in the eval loop. */ | 
					
						
							|  |  |  |     _Py_atomic_int eval_breaker; | 
					
						
							|  |  |  |     /* Request for dropping the GIL */ | 
					
						
							|  |  |  |     _Py_atomic_int gil_drop_request; | 
					
						
							| 
									
										
										
										
											2019-06-03 18:14:24 +02:00
										 |  |  |     struct _pending_calls pending; | 
					
						
							| 
									
										
										
										
											2019-05-10 23:39:09 +02:00
										 |  |  |     /* Request for checking signals. */ | 
					
						
							|  |  |  |     _Py_atomic_int signals_pending; | 
					
						
							|  |  |  |     struct _gil_runtime_state gil; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 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; | 
					
						
							| 
									
										
										
										
											2019-05-02 14:56:30 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* fs_codec.encoding is initialized to NULL.
 | 
					
						
							|  |  |  |        Later, it is set to a non-NULL string by _PyUnicode_InitEncodings(). */ | 
					
						
							|  |  |  |     struct { | 
					
						
							|  |  |  |         char *encoding;   /* Filesystem encoding (encoded to UTF-8) */ | 
					
						
							|  |  |  |         char *errors;     /* Filesystem errors (encoded to UTF-8) */ | 
					
						
							|  |  |  |         _Py_error_handler error_handler; | 
					
						
							|  |  |  |     } fs_codec; | 
					
						
							| 
									
										
										
										
											2019-02-23 11:35:52 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-27 16:39:22 +02:00
										 |  |  |     PyConfig config; | 
					
						
							| 
									
										
										
										
											2019-02-23 11:35:52 -07:00
										 |  |  | #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; | 
					
						
							| 
									
										
										
										
											2019-05-10 13:29:55 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     struct _warnings_runtime_state warnings; | 
					
						
							| 
									
										
										
										
											2019-05-23 08:45:22 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     PyObject *audit_hooks; | 
					
						
							| 
									
										
										
										
											2019-02-23 11:35:52 -07:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											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-05-23 08:45:22 -07:00
										 |  |  | /* runtime audit hook state */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct _Py_AuditHookEntry { | 
					
						
							|  |  |  |     struct _Py_AuditHookEntry *next; | 
					
						
							|  |  |  |     Py_AuditHookFunction hookCFunction; | 
					
						
							|  |  |  |     void *userData; | 
					
						
							|  |  |  | } _Py_AuditHookEntry; | 
					
						
							| 
									
										
										
										
											2018-01-29 18:23:44 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 { | 
					
						
							| 
									
										
										
										
											2019-09-17 23:59:51 +02:00
										 |  |  |     /* Is running Py_PreInitialize()? */ | 
					
						
							|  |  |  |     int preinitializing; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Is Python preinitialized? Set to 1 by Py_PreInitialize() */ | 
					
						
							|  |  |  |     int preinitialized; | 
					
						
							| 
									
										
										
										
											2019-03-20 02:20:13 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* Is Python core initialized? Set to 1 by _Py_InitializeCore() */ | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  |     int core_initialized; | 
					
						
							| 
									
										
										
										
											2019-03-20 02:20:13 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* Is Python fully initialized? Set to 1 by Py_Initialize() */ | 
					
						
							|  |  |  |     int initialized; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-17 23:59:51 +02:00
										 |  |  |     /* Set by Py_FinalizeEx(). Only reset to NULL if Py_Initialize()
 | 
					
						
							|  |  |  |        is called again. */ | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  |     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 _ceval_runtime_state ceval; | 
					
						
							|  |  |  |     struct _gilstate_runtime_state gilstate; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-27 16:39:22 +02:00
										 |  |  |     PyPreConfig preconfig; | 
					
						
							| 
									
										
										
										
											2019-05-23 08:45:22 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Py_OpenCodeHookFunction open_code_hook; | 
					
						
							|  |  |  |     void *open_code_userdata; | 
					
						
							|  |  |  |     _Py_AuditHookEntry *audit_hook_head; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  |     // XXX Consolidate globals found via the check-c-globals script.
 | 
					
						
							|  |  |  | } _PyRuntimeState; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-20 02:20:13 +01:00
										 |  |  | #define _PyRuntimeState_INIT \
 | 
					
						
							| 
									
										
										
										
											2019-09-17 23:59:51 +02:00
										 |  |  |     {.preinitialized = 0, .core_initialized = 0, .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; | 
					
						
							| 
									
										
										
										
											2019-05-27 16:39:22 +02:00
										 |  |  | PyAPI_FUNC(PyStatus) _PyRuntimeState_Init(_PyRuntimeState *runtime); | 
					
						
							| 
									
										
										
										
											2019-04-24 17:14:33 +02:00
										 |  |  | PyAPI_FUNC(void) _PyRuntimeState_Fini(_PyRuntimeState *runtime); | 
					
						
							|  |  |  | PyAPI_FUNC(void) _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime); | 
					
						
							| 
									
										
										
										
											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. */ | 
					
						
							| 
									
										
										
										
											2019-05-27 16:39:22 +02:00
										 |  |  | PyAPI_FUNC(PyStatus) _PyRuntime_Initialize(void); | 
					
						
							| 
									
										
										
										
											2017-11-15 15:48:08 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-19 14:53:58 +01:00
										 |  |  | PyAPI_FUNC(void) _PyRuntime_Finalize(void); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-10 23:39:09 +02:00
										 |  |  | #define _Py_CURRENTLY_FINALIZING(runtime, tstate) \
 | 
					
						
							|  |  |  |     (runtime->finalizing == tstate) | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-01 01:51:40 +01:00
										 |  |  | /* Variable and macro for in-line access to current thread
 | 
					
						
							|  |  |  |    and interpreter state */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-10 23:39:09 +02:00
										 |  |  | #define _PyRuntimeState_GetThreadState(runtime) \
 | 
					
						
							|  |  |  |     ((PyThreadState*)_Py_atomic_load_relaxed(&(runtime)->gilstate.tstate_current)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-01 01:51:40 +01:00
										 |  |  | /* 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(). */ | 
					
						
							| 
									
										
										
										
											2019-05-10 23:39:09 +02:00
										 |  |  | #define _PyThreadState_GET() _PyRuntimeState_GetThreadState(&_PyRuntime)
 | 
					
						
							| 
									
										
										
										
											2018-11-01 01:51:40 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* 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 */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-04 03:15:09 +02:00
										 |  |  | PyAPI_FUNC(void) _PyThreadState_Init( | 
					
						
							|  |  |  |     _PyRuntimeState *runtime, | 
					
						
							|  |  |  |     PyThreadState *tstate); | 
					
						
							|  |  |  | PyAPI_FUNC(void) _PyThreadState_DeleteExcept( | 
					
						
							|  |  |  |     _PyRuntimeState *runtime, | 
					
						
							|  |  |  |     PyThreadState *tstate); | 
					
						
							| 
									
										
										
										
											2019-05-10 23:39:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | PyAPI_FUNC(PyThreadState *) _PyThreadState_Swap( | 
					
						
							|  |  |  |     struct _gilstate_runtime_state *gilstate, | 
					
						
							|  |  |  |     PyThreadState *newts); | 
					
						
							| 
									
										
										
										
											2019-04-24 16:47:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-27 16:39:22 +02:00
										 |  |  | PyAPI_FUNC(PyStatus) _PyInterpreterState_Enable(_PyRuntimeState *runtime); | 
					
						
							| 
									
										
										
										
											2019-04-24 17:14:33 +02:00
										 |  |  | PyAPI_FUNC(void) _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-20 00:05:23 +02:00
										 |  |  | /* Used by _PyImport_Cleanup() */ | 
					
						
							| 
									
										
										
										
											2019-06-19 02:54:39 +02:00
										 |  |  | extern void _PyInterpreterState_ClearModules(PyInterpreterState *interp); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-24 17:14:33 +02:00
										 |  |  | PyAPI_FUNC(void) _PyGILState_Reinit(_PyRuntimeState *runtime); | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif /* !Py_INTERNAL_PYSTATE_H */
 |