mirror of
https://github.com/python/cpython.git
synced 2025-11-02 03:01:58 +00:00
gh-81057: Move Ceval Trampoline Globals to _PyRuntimeState (gh-100083)
https://github.com/python/cpython/issues/81057
This commit is contained in:
parent
1cfa704f64
commit
bc8cdf8c3d
9 changed files with 125 additions and 84 deletions
100
Include/internal/pycore_ceval_state.h
Normal file
100
Include/internal/pycore_ceval_state.h
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
#ifndef Py_INTERNAL_CEVAL_STATE_H
|
||||
#define Py_INTERNAL_CEVAL_STATE_H
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef Py_BUILD_CORE
|
||||
# error "this header requires Py_BUILD_CORE define"
|
||||
#endif
|
||||
|
||||
|
||||
#include "pycore_atomic.h" /* _Py_atomic_address */
|
||||
#include "pycore_gil.h" // struct _gil_runtime_state
|
||||
|
||||
|
||||
typedef enum {
|
||||
PERF_STATUS_FAILED = -1, // Perf trampoline is in an invalid state
|
||||
PERF_STATUS_NO_INIT = 0, // Perf trampoline is not initialized
|
||||
PERF_STATUS_OK = 1, // Perf trampoline is ready to be executed
|
||||
} perf_status_t;
|
||||
|
||||
|
||||
#ifdef PY_HAVE_PERF_TRAMPOLINE
|
||||
struct code_arena_st;
|
||||
|
||||
struct trampoline_api_st {
|
||||
void* (*init_state)(void);
|
||||
void (*write_state)(void* state, const void *code_addr,
|
||||
unsigned int code_size, PyCodeObject* code);
|
||||
int (*free_state)(void* state);
|
||||
void *state;
|
||||
};
|
||||
#endif
|
||||
|
||||
struct _ceval_runtime_state {
|
||||
struct {
|
||||
#ifdef PY_HAVE_PERF_TRAMPOLINE
|
||||
perf_status_t status;
|
||||
Py_ssize_t extra_code_index;
|
||||
struct code_arena_st *code_arena;
|
||||
struct trampoline_api_st trampoline_api;
|
||||
FILE *map_file;
|
||||
#else
|
||||
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;
|
||||
struct _gil_runtime_state gil;
|
||||
};
|
||||
|
||||
#ifdef PY_HAVE_PERF_TRAMPOLINE
|
||||
# define _PyEval_RUNTIME_PERF_INIT \
|
||||
{ \
|
||||
.status = PERF_STATUS_NO_INIT, \
|
||||
.extra_code_index = -1, \
|
||||
}
|
||||
#else
|
||||
# define _PyEval_RUNTIME_PERF_INIT {0}
|
||||
#endif
|
||||
|
||||
|
||||
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;
|
||||
#define NPENDINGCALLS 32
|
||||
struct {
|
||||
int (*func)(void *);
|
||||
void *arg;
|
||||
} calls[NPENDINGCALLS];
|
||||
int first;
|
||||
int last;
|
||||
};
|
||||
|
||||
struct _ceval_state {
|
||||
int recursion_limit;
|
||||
/* 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;
|
||||
/* The GC is ready to be executed */
|
||||
_Py_atomic_int gc_scheduled;
|
||||
struct _pending_calls pending;
|
||||
};
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* !Py_INTERNAL_CEVAL_STATE_H */
|
||||
|
|
@ -12,6 +12,7 @@ extern "C" {
|
|||
|
||||
#include "pycore_atomic.h" // _Py_atomic_address
|
||||
#include "pycore_ast_state.h" // struct ast_state
|
||||
#include "pycore_ceval_state.h" // struct _ceval_state
|
||||
#include "pycore_code.h" // struct callable_cache
|
||||
#include "pycore_context.h" // struct _Py_context_state
|
||||
#include "pycore_dict_state.h" // struct _Py_dict_state
|
||||
|
|
@ -28,37 +29,6 @@ extern "C" {
|
|||
#include "pycore_warnings.h" // struct _warnings_runtime_state
|
||||
|
||||
|
||||
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;
|
||||
#define NPENDINGCALLS 32
|
||||
struct {
|
||||
int (*func)(void *);
|
||||
void *arg;
|
||||
} calls[NPENDINGCALLS];
|
||||
int first;
|
||||
int last;
|
||||
};
|
||||
|
||||
struct _ceval_state {
|
||||
int recursion_limit;
|
||||
/* 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;
|
||||
/* The GC is ready to be executed */
|
||||
_Py_atomic_int gc_scheduled;
|
||||
struct _pending_calls pending;
|
||||
};
|
||||
|
||||
|
||||
// atexit state
|
||||
typedef struct {
|
||||
PyObject *func;
|
||||
|
|
|
|||
|
|
@ -9,11 +9,11 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
#include "pycore_atomic.h" /* _Py_atomic_address */
|
||||
#include "pycore_ceval_state.h" // struct _ceval_runtime_state
|
||||
#include "pycore_dict_state.h" // struct _Py_dict_runtime_state
|
||||
#include "pycore_dtoa.h" // struct _dtoa_runtime_state
|
||||
#include "pycore_floatobject.h" // struct _Py_float_runtime_state
|
||||
#include "pycore_function.h" // struct _func_runtime_state
|
||||
#include "pycore_gil.h" // struct _gil_runtime_state
|
||||
#include "pycore_global_objects.h" // struct _Py_global_objects
|
||||
#include "pycore_import.h" // struct _import_runtime_state
|
||||
#include "pycore_interp.h" // PyInterpreterState
|
||||
|
|
@ -31,15 +31,6 @@ struct _getargs_runtime_state {
|
|||
|
||||
/* ceval state */
|
||||
|
||||
struct _ceval_runtime_state {
|
||||
/* 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;
|
||||
struct _gil_runtime_state gil;
|
||||
};
|
||||
|
||||
/* GIL state */
|
||||
|
||||
struct _gilstate_runtime_state {
|
||||
|
|
|
|||
|
|
@ -41,6 +41,9 @@ extern "C" {
|
|||
.header = 1, \
|
||||
}, \
|
||||
}, \
|
||||
.ceval = { \
|
||||
.perf = _PyEval_RUNTIME_PERF_INIT, \
|
||||
}, \
|
||||
.gilstate = { \
|
||||
.check_enabled = 1, \
|
||||
/* A TSS key must be initialized with Py_tss_NEEDS_INIT \
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue