3#ifndef __NUITKA_THREADING_H__
4#define __NUITKA_THREADING_H__
6#if PYTHON_VERSION < 0x300
8PyAPI_DATA(
volatile int) _Py_Ticker;
10extern volatile int _Py_Ticker;
11#define _Py_CheckInterval 20
14#ifdef NUITKA_USE_PYCORE_THREAD_STATE
16#if PYTHON_VERSION < 0x380
19#define HAS_WORK_TO_DO(ceval, ceval2) (ceval2->pending.calls_to_do._value)
20#elif PYTHON_VERSION < 0x3d0
21#define HAS_WORK_TO_DO(ceval, ceval2) (ceval->signals_pending._value || ceval2->pending.calls_to_do._value)
23#define HAS_WORK_TO_DO(ceval, ceval2) _Py_eval_breaker_bit_is_set(tstate, _PY_SIGNALS_PENDING_BIT | _PY_CALLS_TO_DO_BIT)
26#ifndef Py_GIL_DISABLED
27NUITKA_MAY_BE_UNUSED
static inline bool CONSIDER_THREADING(PyThreadState *tstate) {
28#if PYTHON_VERSION < 0x390
29 _PyRuntimeState *
const runtime = &_PyRuntime;
30#elif PYTHON_VERSION < 0x3d0
31 _PyRuntimeState *
const runtime = tstate->interp->runtime;
34#if PYTHON_VERSION < 0x3d0
36 struct _ceval_runtime_state *ceval = &runtime->ceval;
37#if PYTHON_VERSION >= 0x390
38 struct _ceval_state *ceval2 = &tstate->interp->ceval;
40 struct _ceval_runtime_state *ceval2 = ceval;
44 if (HAS_WORK_TO_DO(ceval, ceval2)) {
45 int res = Py_MakePendingCalls();
47 if (unlikely(res < 0 && HAS_ERROR_OCCURRED(tstate))) {
52#if PYTHON_VERSION >= 0x3d0
54 if (_Py_eval_breaker_bit_is_set(tstate, _PY_GIL_DROP_REQUEST_BIT)) {
57 if (ceval2->gil_drop_request._value) {
61 PyEval_AcquireThread(tstate);
64 if (unlikely(tstate->async_exc != NULL)) {
65 PyObject *async_exc = tstate->async_exc;
66 tstate->async_exc = NULL;
68 SET_CURRENT_EXCEPTION_TYPE0(tstate, async_exc);
76NUITKA_MAY_BE_UNUSED
static inline bool CONSIDER_THREADING(PyThreadState *tstate) {
77 if (unlikely(tstate->async_exc != NULL)) {
78 PyObject *async_exc = tstate->async_exc;
79 tstate->async_exc = NULL;
81 SET_CURRENT_EXCEPTION_TYPE0(tstate, async_exc);
93NUITKA_MAY_BE_UNUSED
static inline bool CONSIDER_THREADING(PyThreadState *tstate) {
95 if (--_Py_Ticker < 0) {
96 _Py_Ticker = _Py_CheckInterval;
98 int res = Py_MakePendingCalls();
100 if (unlikely(res < 0 && HAS_ERROR_OCCURRED(tstate))) {
104 if (PyEval_ThreadsInitialized()) {
109 PyEval_AcquireThread(tstate);
112 if (unlikely(tstate->async_exc != NULL)) {
113 PyObject *async_exc = tstate->async_exc;
114 tstate->async_exc = NULL;
116 SET_CURRENT_EXCEPTION_TYPE0(tstate, async_exc);