mirror of
https://github.com/python/cpython.git
synced 2025-07-24 03:35:53 +00:00
bpo-36710: Add 'ceval' local variable to ceval.c (GH-12934)
Add "struct _ceval_runtime_state *ceval = &_PyRuntime.ceval;" local variables to function to better highlight the dependency on the global variable _PyRuntime and to point directly to _PyRuntime.ceval field rather than on the larger _PyRuntime. Changes: * Add _PyRuntimeState_GetThreadState(runtime) macro. * Add _PyEval_AddPendingCall(ceval, ...) and _PyThreadState_Swap(gilstate, ...) functions. * _PyThreadState_GET() macro now calls _PyRuntimeState_GetThreadState() using &_PyRuntime. * Add 'ceval' parameter to COMPUTE_EVAL_BREAKER(), SIGNAL_PENDING_SIGNALS(), _PyEval_SignalAsyncExc(), _PyEval_SignalReceived() and _PyEval_FiniThreads() macros and functions. * Add 'tstate' parameter to call_function(), do_call_core() and do_raise(). * Add 'runtime' parameter to _Py_CURRENTLY_FINALIZING(), _Py_FinishPendingCalls() and _PyThreadState_DeleteExcept() macros and functions. * Declare 'runtime', 'tstate', 'ceval' and 'eval_breaker' variables as constant.
This commit is contained in:
parent
f22cc69b01
commit
09532feeec
8 changed files with 370 additions and 320 deletions
|
@ -12,12 +12,51 @@ extern "C" {
|
|||
#include "pystate.h"
|
||||
#include "pythread.h"
|
||||
|
||||
#include "pycore_ceval.h"
|
||||
#include "pycore_gil.h" /* _gil_runtime_state */
|
||||
#include "pycore_pathconfig.h"
|
||||
#include "pycore_pymem.h"
|
||||
#include "pycore_warnings.h"
|
||||
|
||||
|
||||
/* ceval state */
|
||||
|
||||
struct _pending_calls {
|
||||
int finishing;
|
||||
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;
|
||||
#define NPENDINGCALLS 32
|
||||
struct {
|
||||
int (*func)(void *);
|
||||
void *arg;
|
||||
} calls[NPENDINGCALLS];
|
||||
int first;
|
||||
int last;
|
||||
};
|
||||
|
||||
struct _ceval_runtime_state {
|
||||
int recursion_limit;
|
||||
/* Records whether tracing is on for any thread. Counts the number
|
||||
of threads for which tstate->c_tracefunc is non-NULL, so if the
|
||||
value is 0, we know we don't have to check this thread's
|
||||
c_tracefunc. This speeds up the if statement in
|
||||
PyEval_EvalFrameEx() after fast_next_opcode. */
|
||||
int tracing_possible;
|
||||
/* This single variable consolidates all requests to break out of
|
||||
the fast path in the eval loop. */
|
||||
_Py_atomic_int eval_breaker;
|
||||
/* Request for dropping the GIL */
|
||||
_Py_atomic_int gil_drop_request;
|
||||
struct _pending_calls pending;
|
||||
/* Request for checking signals. */
|
||||
_Py_atomic_int signals_pending;
|
||||
struct _gil_runtime_state gil;
|
||||
};
|
||||
|
||||
/* interpreter state */
|
||||
|
||||
typedef PyObject* (*_PyFrameEvalFunction)(struct _frame *, int);
|
||||
|
@ -203,13 +242,16 @@ PyAPI_FUNC(_PyInitError) _PyRuntime_Initialize(void);
|
|||
|
||||
PyAPI_FUNC(void) _PyRuntime_Finalize(void);
|
||||
|
||||
#define _Py_CURRENTLY_FINALIZING(tstate) \
|
||||
(_PyRuntime.finalizing == tstate)
|
||||
#define _Py_CURRENTLY_FINALIZING(runtime, tstate) \
|
||||
(runtime->finalizing == tstate)
|
||||
|
||||
|
||||
/* Variable and macro for in-line access to current thread
|
||||
and interpreter state */
|
||||
|
||||
#define _PyRuntimeState_GetThreadState(runtime) \
|
||||
((PyThreadState*)_Py_atomic_load_relaxed(&(runtime)->gilstate.tstate_current))
|
||||
|
||||
/* Get the current Python thread state.
|
||||
|
||||
Efficient macro reading directly the 'gilstate.tstate_current' atomic
|
||||
|
@ -219,8 +261,7 @@ PyAPI_FUNC(void) _PyRuntime_Finalize(void);
|
|||
The caller must hold the GIL.
|
||||
|
||||
See also PyThreadState_Get() and PyThreadState_GET(). */
|
||||
#define _PyThreadState_GET() \
|
||||
((PyThreadState*)_Py_atomic_load_relaxed(&_PyRuntime.gilstate.tstate_current))
|
||||
#define _PyThreadState_GET() _PyRuntimeState_GetThreadState(&_PyRuntime)
|
||||
|
||||
/* Redefine PyThreadState_GET() as an alias to _PyThreadState_GET() */
|
||||
#undef PyThreadState_GET
|
||||
|
@ -242,7 +283,13 @@ PyAPI_FUNC(void) _PyRuntime_Finalize(void);
|
|||
PyAPI_FUNC(void) _PyThreadState_Init(
|
||||
_PyRuntimeState *runtime,
|
||||
PyThreadState *tstate);
|
||||
PyAPI_FUNC(void) _PyThreadState_DeleteExcept(PyThreadState *tstate);
|
||||
PyAPI_FUNC(void) _PyThreadState_DeleteExcept(
|
||||
_PyRuntimeState *runtime,
|
||||
PyThreadState *tstate);
|
||||
|
||||
PyAPI_FUNC(PyThreadState *) _PyThreadState_Swap(
|
||||
struct _gilstate_runtime_state *gilstate,
|
||||
PyThreadState *newts);
|
||||
|
||||
PyAPI_FUNC(_PyInitError) _PyInterpreterState_Enable(_PyRuntimeState *runtime);
|
||||
PyAPI_FUNC(void) _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue