mirror of
https://github.com/python/cpython.git
synced 2025-08-03 00:23:06 +00:00
bpo-33608: Factor out a private, per-interpreter _Py_AddPendingCall(). (gh-12360)
This is effectively an un-revert of #11617 and #12024 (reverted in #12159). Portions of those were merged in other PRs (with lower risk) and this represents the remainder. Note that I found 3 different bugs in the original PRs and have fixed them here.
This commit is contained in:
parent
44235041f3
commit
f13c5c8b94
11 changed files with 151 additions and 108 deletions
|
@ -11,7 +11,11 @@ extern "C" {
|
|||
#include "pycore_atomic.h"
|
||||
#include "pythread.h"
|
||||
|
||||
PyAPI_FUNC(void) _Py_FinishPendingCalls(void);
|
||||
struct _is; // See PyInterpreterState in cpython/pystate.h.
|
||||
|
||||
PyAPI_FUNC(int) _Py_AddPendingCall(struct _is*, unsigned long, int (*)(void *), void *);
|
||||
PyAPI_FUNC(int) _Py_MakePendingCalls(struct _is*);
|
||||
PyAPI_FUNC(void) _Py_FinishPendingCalls(struct _is*);
|
||||
|
||||
struct _pending_calls {
|
||||
int finishing;
|
||||
|
@ -24,6 +28,7 @@ struct _pending_calls {
|
|||
int async_exc;
|
||||
#define NPENDINGCALLS 32
|
||||
struct {
|
||||
unsigned long thread_id;
|
||||
int (*func)(void *);
|
||||
void *arg;
|
||||
} calls[NPENDINGCALLS];
|
||||
|
@ -31,6 +36,13 @@ struct _pending_calls {
|
|||
int last;
|
||||
};
|
||||
|
||||
struct _ceval_interpreter_state {
|
||||
/* This single variable consolidates all requests to break out of
|
||||
the fast path in the eval loop. */
|
||||
_Py_atomic_int eval_breaker;
|
||||
struct _pending_calls pending;
|
||||
};
|
||||
|
||||
#include "pycore_gil.h"
|
||||
|
||||
struct _ceval_runtime_state {
|
||||
|
@ -41,12 +53,8 @@ struct _ceval_runtime_state {
|
|||
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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue