summaryrefslogtreecommitdiffstats
path: root/Include
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2023-10-04 15:09:48 (GMT)
committerGitHub <noreply@github.com>2023-10-04 15:09:48 (GMT)
commitbf4bc36069ef1ed4be4be2ae70404f78bff056d9 (patch)
tree1921d692061fdc40d967f1f7b6defa6bb7a01bc4 /Include
parent7c149a76b2bf4c66bb7c8650ffb71acce12f5ea2 (diff)
downloadcpython-bf4bc36069ef1ed4be4be2ae70404f78bff056d9.zip
cpython-bf4bc36069ef1ed4be4be2ae70404f78bff056d9.tar.gz
cpython-bf4bc36069ef1ed4be4be2ae70404f78bff056d9.tar.bz2
GH-109369: Merge all eval-breaker flags and monitoring version into one word. (GH-109846)
Diffstat (limited to 'Include')
-rw-r--r--Include/cpython/code.h2
-rw-r--r--Include/internal/pycore_ceval.h33
-rw-r--r--Include/internal/pycore_ceval_state.h19
-rw-r--r--Include/internal/pycore_interp.h3
4 files changed, 39 insertions, 18 deletions
diff --git a/Include/cpython/code.h b/Include/cpython/code.h
index 45b09a1..cf715c5 100644
--- a/Include/cpython/code.h
+++ b/Include/cpython/code.h
@@ -167,7 +167,7 @@ typedef struct {
PyObject *co_weakreflist; /* to support weakrefs to code objects */ \
_PyExecutorArray *co_executors; /* executors from optimizer */ \
_PyCoCached *_co_cached; /* cached co_* attributes */ \
- uint64_t _co_instrumentation_version; /* current instrumentation version */ \
+ uintptr_t _co_instrumentation_version; /* current instrumentation version */ \
_PyCoMonitoringData *_co_monitoring; /* Monitoring data */ \
int _co_firsttraceable; /* index of first traceable instruction */ \
/* Scratch space for extra data relating to the code object. \
diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h
index 23d0fa3..48fee69 100644
--- a/Include/internal/pycore_ceval.h
+++ b/Include/internal/pycore_ceval.h
@@ -193,6 +193,39 @@ int _PyEval_UnpackIterable(PyThreadState *tstate, PyObject *v, int argcnt, int a
void _PyEval_FrameClearAndPop(PyThreadState *tstate, _PyInterpreterFrame *frame);
+#define _PY_GIL_DROP_REQUEST_BIT 0
+#define _PY_SIGNALS_PENDING_BIT 1
+#define _PY_CALLS_TO_DO_BIT 2
+#define _PY_ASYNC_EXCEPTION_BIT 3
+#define _PY_GC_SCHEDULED_BIT 4
+
+/* Reserve a few bits for future use */
+#define _PY_EVAL_EVENTS_BITS 8
+#define _PY_EVAL_EVENTS_MASK ((1 << _PY_EVAL_EVENTS_BITS)-1)
+
+static inline void
+_Py_set_eval_breaker_bit(PyInterpreterState *interp, uint32_t bit, uint32_t set)
+{
+ assert(set == 0 || set == 1);
+ uintptr_t to_set = set << bit;
+ uintptr_t mask = ((uintptr_t)1) << bit;
+ uintptr_t old = _Py_atomic_load_uintptr(&interp->ceval.eval_breaker);
+ if ((old & mask) == to_set) {
+ return;
+ }
+ uintptr_t new;
+ do {
+ new = (old & ~mask) | to_set;
+ } while (!_Py_atomic_compare_exchange_uintptr(&interp->ceval.eval_breaker, &old, new));
+}
+
+static inline bool
+_Py_eval_breaker_bit_is_set(PyInterpreterState *interp, int32_t bit)
+{
+ return _Py_atomic_load_uintptr_relaxed(&interp->ceval.eval_breaker) & (((uintptr_t)1) << bit);
+}
+
+
#ifdef __cplusplus
}
#endif
diff --git a/Include/internal/pycore_ceval_state.h b/Include/internal/pycore_ceval_state.h
index d0af5b5..47971fb 100644
--- a/Include/internal/pycore_ceval_state.h
+++ b/Include/internal/pycore_ceval_state.h
@@ -17,11 +17,7 @@ struct _pending_calls {
int busy;
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;
+ int32_t calls_to_do;
#define NPENDINGCALLS 32
struct _pending_call {
_Py_pending_call_func func;
@@ -62,11 +58,6 @@ struct _ceval_runtime_state {
int _not_used;
#endif
} perf;
- /* Request for checking signals. It is shared by all interpreters (see
- bpo-40513). Any thread of any interpreter can receive a signal, but only
- the main thread of the main interpreter can handle signals: see
- _Py_ThreadCanHandleSignals(). */
- _Py_atomic_int signals_pending;
/* Pending calls to be made only on the main thread. */
struct _pending_calls pending_mainthread;
};
@@ -87,14 +78,12 @@ struct _ceval_state {
* the fast path in the eval loop.
* It is by far the hottest field in this struct and
* should be placed at the beginning. */
- _Py_atomic_int eval_breaker;
- /* Request for dropping the GIL */
- _Py_atomic_int gil_drop_request;
+ uintptr_t eval_breaker;
+ /* Avoid false sharing */
+ int64_t padding[7];
int recursion_limit;
struct _gil_runtime_state *gil;
int own_gil;
- /* The GC is ready to be executed */
- _Py_atomic_int gc_scheduled;
struct _pending_calls pending;
};
diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h
index ebf0228..21d1ee3 100644
--- a/Include/internal/pycore_interp.h
+++ b/Include/internal/pycore_interp.h
@@ -67,8 +67,7 @@ struct _is {
int _initialized;
int finalizing;
- uint64_t monitoring_version;
- uint64_t last_restart_version;
+ uintptr_t last_restart_version;
struct pythreads {
uint64_t next_unique_id;
/* The linked list of threads, newest first. */