| #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 | |
| #include "pycore_interp_structs.h" // PyInterpreterState | |
| /* interpreter state */ | |
| #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 | |
| #define _PyInterpreterState_WHENCE_STDLIB 5 | |
| #define _PyInterpreterState_WHENCE_MAX 5 | |
| /* other API */ | |
| extern void _PyInterpreterState_Clear(PyThreadState *tstate); | |
| static inline PyThreadState* | |
| _PyInterpreterState_GetFinalizing(PyInterpreterState *interp) { | |
| return (PyThreadState*)_Py_atomic_load_ptr_relaxed(&interp->_finalizing); | |
| } | |
| static inline unsigned long | |
| _PyInterpreterState_GetFinalizingID(PyInterpreterState *interp) { | |
| return _Py_atomic_load_ulong_relaxed(&interp->_finalizing_id); | |
| } | |
| static inline void | |
| _PyInterpreterState_SetFinalizing(PyInterpreterState *interp, PyThreadState *tstate) { | |
| _Py_atomic_store_ptr_relaxed(&interp->_finalizing, tstate); | |
| 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); | |
| } | |
| } | |
| // Exports for the _testinternalcapi module. | |
| PyAPI_FUNC(int64_t) _PyInterpreterState_ObjectToID(PyObject *); | |
| PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_LookUpID(int64_t); | |
| PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_LookUpIDObject(PyObject *); | |
| PyAPI_FUNC(void) _PyInterpreterState_IDIncref(PyInterpreterState *); | |
| PyAPI_FUNC(void) _PyInterpreterState_IDDecref(PyInterpreterState *); | |
| PyAPI_FUNC(int) _PyInterpreterState_IsReady(PyInterpreterState *interp); | |
| PyAPI_FUNC(long) _PyInterpreterState_GetWhence(PyInterpreterState *interp); | |
| extern void _PyInterpreterState_SetWhence( | |
| PyInterpreterState *interp, | |
| long whence); | |
| /* | |
| 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); | |
| PyAPI_FUNC(PyStatus) _PyInterpreterState_New( | |
| PyThreadState *tstate, | |
| PyInterpreterState **pinterp); | |
| extern const PyConfig* _PyInterpreterState_GetConfig( | |
| PyInterpreterState *interp); | |
| #ifdef __cplusplus | |
| } | |
| #endif | |
| #endif /* !Py_INTERNAL_INTERP_H */ |