2022-12-08 20:17:20 -04:00
|
|
|
#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
|
|
|
|
|
2023-12-07 15:33:40 -04:00
|
|
|
#include "pycore_lock.h" // PyMutex
|
2022-12-08 20:17:20 -04:00
|
|
|
#include "pycore_gil.h" // struct _gil_runtime_state
|
|
|
|
|
|
|
|
|
2023-09-19 18:01:34 -03:00
|
|
|
typedef int (*_Py_pending_call_func)(void *);
|
|
|
|
|
2023-06-13 18:02:19 -03:00
|
|
|
struct _pending_calls {
|
|
|
|
int busy;
|
2023-12-07 15:33:40 -04:00
|
|
|
PyMutex mutex;
|
2023-06-13 18:02:19 -03:00
|
|
|
/* Request for running pending calls. */
|
2023-10-04 12:09:48 -03:00
|
|
|
int32_t calls_to_do;
|
2023-06-13 18:02:19 -03:00
|
|
|
#define NPENDINGCALLS 32
|
|
|
|
struct _pending_call {
|
2023-09-19 18:01:34 -03:00
|
|
|
_Py_pending_call_func func;
|
2023-06-13 18:02:19 -03:00
|
|
|
void *arg;
|
2023-10-09 10:39:51 -03:00
|
|
|
int flags;
|
2023-06-13 18:02:19 -03:00
|
|
|
} calls[NPENDINGCALLS];
|
|
|
|
int first;
|
|
|
|
int last;
|
|
|
|
};
|
|
|
|
|
2022-12-08 20:17:20 -04:00
|
|
|
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;
|
2023-10-27 00:57:29 -03:00
|
|
|
Py_ssize_t persist_after_fork;
|
2022-12-08 20:17:20 -04:00
|
|
|
#else
|
|
|
|
int _not_used;
|
|
|
|
#endif
|
|
|
|
} perf;
|
2023-06-13 18:02:19 -03:00
|
|
|
/* Pending calls to be made only on the main thread. */
|
|
|
|
struct _pending_calls pending_mainthread;
|
2022-12-08 20:17:20 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
#ifdef PY_HAVE_PERF_TRAMPOLINE
|
|
|
|
# define _PyEval_RUNTIME_PERF_INIT \
|
|
|
|
{ \
|
|
|
|
.status = PERF_STATUS_NO_INIT, \
|
|
|
|
.extra_code_index = -1, \
|
2023-10-27 00:57:29 -03:00
|
|
|
.persist_after_fork = 0, \
|
2022-12-08 20:17:20 -04:00
|
|
|
}
|
|
|
|
#else
|
|
|
|
# define _PyEval_RUNTIME_PERF_INIT {0}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
struct _ceval_state {
|
|
|
|
/* This single variable consolidates all requests to break out of
|
2023-07-28 09:55:25 -03:00
|
|
|
* the fast path in the eval loop.
|
|
|
|
* It is by far the hottest field in this struct and
|
|
|
|
* should be placed at the beginning. */
|
2023-10-04 12:09:48 -03:00
|
|
|
uintptr_t eval_breaker;
|
|
|
|
/* Avoid false sharing */
|
|
|
|
int64_t padding[7];
|
2023-05-18 06:08:33 -03:00
|
|
|
int recursion_limit;
|
|
|
|
struct _gil_runtime_state *gil;
|
|
|
|
int own_gil;
|
2022-12-08 20:17:20 -04:00
|
|
|
struct _pending_calls pending;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif /* !Py_INTERNAL_CEVAL_STATE_H */
|