| #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 */ |