| #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_lock.h" |
| #include "pycore_gil.h" |
|
|
|
|
| typedef int (*_Py_pending_call_func)(void *); |
|
|
| struct _pending_call { |
| _Py_pending_call_func func; |
| void *arg; |
| int flags; |
| }; |
|
|
| #define PENDINGCALLSARRAYSIZE 300 |
|
|
| #define MAXPENDINGCALLS PENDINGCALLSARRAYSIZE |
| |
| |
| #if MAXPENDINGCALLS > 100 |
| # define MAXPENDINGCALLSLOOP 100 |
| #else |
| # define MAXPENDINGCALLSLOOP MAXPENDINGCALLS |
| #endif |
|
|
| |
| |
| #define MAXPENDINGCALLS_MAIN 32 |
| |
| |
| |
| |
| #define MAXPENDINGCALLSLOOP_MAIN 0 |
|
|
| struct _pending_calls { |
| PyThreadState *handling_thread; |
| PyMutex mutex; |
| |
| int32_t npending; |
| |
| |
| |
| int32_t max; |
| |
| |
| |
| |
| int32_t maxloop; |
| struct _pending_call calls[PENDINGCALLSARRAYSIZE]; |
| int first; |
| int next; |
| }; |
|
|
|
|
| typedef enum { |
| PERF_STATUS_FAILED = -1, |
| PERF_STATUS_NO_INIT = 0, |
| PERF_STATUS_OK = 1, |
| } 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; |
| Py_ssize_t code_padding; |
| }; |
| #endif |
|
|
|
|
| struct _ceval_runtime_state { |
| struct { |
| #ifdef PY_HAVE_PERF_TRAMPOLINE |
| perf_status_t status; |
| int perf_trampoline_type; |
| Py_ssize_t extra_code_index; |
| struct code_arena_st *code_arena; |
| struct trampoline_api_st trampoline_api; |
| FILE *map_file; |
| Py_ssize_t persist_after_fork; |
| #else |
| int _not_used; |
| #endif |
| } perf; |
| |
| |
| |
| |
| |
| struct _pending_calls pending_mainthread; |
| PyMutex sys_trace_profile_mutex; |
| }; |
|
|
|
|
| #ifdef PY_HAVE_PERF_TRAMPOLINE |
| # define _PyEval_RUNTIME_PERF_INIT \ |
| { \ |
| .status = PERF_STATUS_NO_INIT, \ |
| .extra_code_index = -1, \ |
| .persist_after_fork = 0, \ |
| } |
| #else |
| # define _PyEval_RUNTIME_PERF_INIT {0} |
| #endif |
|
|
|
|
| struct _ceval_state { |
| |
| |
| |
| uintptr_t instrumentation_version; |
| int recursion_limit; |
| struct _gil_runtime_state *gil; |
| int own_gil; |
| struct _pending_calls pending; |
| }; |
|
|
|
|
| #ifdef __cplusplus |
| } |
| #endif |
| #endif |
|
|