| 
									
										
										
										
											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
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-14 14:26:24 +02:00
										 |  |  | #include "pycore_runtime.h"   /* PyRuntimeState */
 | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-20 13:38:58 +01:00
										 |  |  | /* Check if the current thread is the main thread.
 | 
					
						
							|  |  |  |    Use _Py_IsMainInterpreter() to check if it's the main interpreter. */ | 
					
						
							|  |  |  | static inline int | 
					
						
							|  |  |  | _Py_IsMainThread(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     unsigned long thread = PyThread_get_thread_ident(); | 
					
						
							|  |  |  |     return (thread == _PyRuntime.main_thread); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline int | 
					
						
							|  |  |  | _Py_IsMainInterpreter(PyThreadState* tstate) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /* Use directly _PyRuntime rather than tstate->interp->runtime, since
 | 
					
						
							|  |  |  |        this function is used in performance critical code path (ceval) */ | 
					
						
							|  |  |  |     return (tstate->interp == _PyRuntime.interpreters.main); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Only handle signals on the main thread of the main interpreter. */ | 
					
						
							|  |  |  | static inline int | 
					
						
							| 
									
										
										
										
											2020-04-08 23:35:05 +02:00
										 |  |  | _Py_ThreadCanHandleSignals(PyInterpreterState *interp) | 
					
						
							| 
									
										
										
										
											2020-03-20 13:38:58 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2020-04-08 23:35:05 +02:00
										 |  |  |     return (_Py_IsMainThread() && interp == _PyRuntime.interpreters.main); | 
					
						
							| 
									
										
										
										
											2020-03-20 13:38:58 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2019-11-20 17:34:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-20 14:50:35 +01:00
										 |  |  | /* Only execute pending calls on the main thread. */ | 
					
						
							|  |  |  | static inline int | 
					
						
							|  |  |  | _Py_ThreadCanHandlePendingCalls(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return _Py_IsMainThread(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-01 01:51:40 +01:00
										 |  |  | /* Variable and macro for in-line access to current thread
 | 
					
						
							|  |  |  |    and interpreter state */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-05 19:56:48 +02:00
										 |  |  | static inline PyThreadState* | 
					
						
							|  |  |  | _PyRuntimeState_GetThreadState(_PyRuntimeState *runtime) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-03-07 00:24:23 +01:00
										 |  |  |     return (PyThreadState*)_Py_atomic_load_relaxed(&runtime->gilstate.tstate_current); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-05-10 23:39:09 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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(). */ | 
					
						
							| 
									
										
										
										
											2020-05-05 19:56:48 +02:00
										 |  |  | static inline PyThreadState* | 
					
						
							|  |  |  | _PyThreadState_GET(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-04-08 23:35:05 +02:00
										 |  |  |     return _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()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-03 20:16:39 +02:00
										 |  |  | PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalError_TstateNULL(const char *func); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void | 
					
						
							|  |  |  | _Py_EnsureFuncTstateNotNULL(const char *func, PyThreadState *tstate) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (tstate == NULL) { | 
					
						
							|  |  |  |         _Py_FatalError_TstateNULL(func); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Call Py_FatalError() if tstate is NULL
 | 
					
						
							|  |  |  | #define _Py_EnsureTstateNotNULL(tstate) \
 | 
					
						
							|  |  |  |     _Py_EnsureFuncTstateNotNULL(__func__, tstate) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-01 01:51:40 +01:00
										 |  |  | /* 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(). */ | 
					
						
							| 
									
										
										
										
											2020-04-14 15:14:01 +02:00
										 |  |  | static inline PyInterpreterState* _PyInterpreterState_GET(void) { | 
					
						
							| 
									
										
										
										
											2020-04-08 23:35:05 +02:00
										 |  |  |     PyThreadState *tstate = _PyThreadState_GET(); | 
					
						
							| 
									
										
										
										
											2020-06-03 20:16:39 +02:00
										 |  |  | #ifdef Py_DEBUG
 | 
					
						
							|  |  |  |     _Py_EnsureTstateNotNULL(tstate); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-04-08 23:35:05 +02:00
										 |  |  |     return tstate->interp; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-11-01 01:51:40 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | /* Other */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-04 03:15:09 +02:00
										 |  |  | PyAPI_FUNC(void) _PyThreadState_Init( | 
					
						
							|  |  |  |     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); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyAPI_FUNC(void) _PyGILState_Reinit(_PyRuntimeState *runtime); | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-22 18:52:27 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | PyAPI_FUNC(int) _PyState_AddModule( | 
					
						
							|  |  |  |     PyThreadState *tstate, | 
					
						
							|  |  |  |     PyObject* module, | 
					
						
							|  |  |  |     struct PyModuleDef* def); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-03 17:49:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | PyAPI_FUNC(int) _PyOS_InterruptOccurred(PyThreadState *tstate); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 23:51:28 -06:00
										 |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif /* !Py_INTERNAL_PYSTATE_H */
 |