mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
GH-133231: Changes to executor management to support proposed sys._jit
module (GH-133287)
* Track the current executor, not the previous one, on the thread-state. * Batch executors for deallocation to avoid having to constantly incref executors; this is an ad-hoc form of deferred reference counting.
This commit is contained in:
parent
1d9406e426
commit
ac7d5ba96e
13 changed files with 176 additions and 54 deletions
34
Python/generated_cases.c.h
generated
34
Python/generated_cases.c.h
generated
|
@ -5557,7 +5557,7 @@
|
|||
assert(executor->vm_data.index == INSTR_OFFSET() - 1);
|
||||
assert(executor->vm_data.code == code);
|
||||
assert(executor->vm_data.valid);
|
||||
assert(tstate->previous_executor == NULL);
|
||||
assert(tstate->current_executor == NULL);
|
||||
if (_Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) {
|
||||
opcode = executor->vm_data.opcode;
|
||||
oparg = (oparg & ~255) | executor->vm_data.oparg;
|
||||
|
@ -5567,8 +5567,6 @@
|
|||
}
|
||||
DISPATCH_GOTO();
|
||||
}
|
||||
tstate->previous_executor = Py_None;
|
||||
Py_INCREF(executor);
|
||||
GOTO_TIER_TWO(executor);
|
||||
#else
|
||||
Py_FatalError("ENTER_EXECUTOR is not supported in this build");
|
||||
|
@ -7652,6 +7650,22 @@
|
|||
tstate->current_frame = frame->previous;
|
||||
assert(!_PyErr_Occurred(tstate));
|
||||
PyObject *result = PyStackRef_AsPyObjectSteal(retval);
|
||||
#if !Py_TAIL_CALL_INTERP
|
||||
assert(frame == &entry.frame);
|
||||
#endif
|
||||
#ifdef _Py_TIER2
|
||||
_PyStackRef executor = frame->localsplus[0];
|
||||
assert(tstate->current_executor == NULL);
|
||||
if (!PyStackRef_IsNull(executor)) {
|
||||
tstate->current_executor = PyStackRef_AsPyObjectBorrow(executor);
|
||||
stack_pointer += -1;
|
||||
assert(WITHIN_STACK_BOUNDS());
|
||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
PyStackRef_CLOSE(executor);
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
stack_pointer += 1;
|
||||
}
|
||||
#endif
|
||||
LLTRACE_RESUME_FRAME();
|
||||
return result;
|
||||
}
|
||||
|
@ -7786,8 +7800,7 @@
|
|||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||
this_instr[1].counter = initial_jump_backoff_counter();
|
||||
stack_pointer = _PyFrame_GetStackPointer(frame);
|
||||
assert(tstate->previous_executor == NULL);
|
||||
tstate->previous_executor = Py_None;
|
||||
assert(tstate->current_executor == NULL);
|
||||
GOTO_TIER_TWO(executor);
|
||||
}
|
||||
}
|
||||
|
@ -12424,6 +12437,17 @@ JUMP_TO_LABEL(error);
|
|||
frame->return_offset = 0;
|
||||
if (frame->owner == FRAME_OWNED_BY_INTERPRETER) {
|
||||
tstate->current_frame = frame->previous;
|
||||
#if !Py_TAIL_CALL_INTERP
|
||||
assert(frame == &entry.frame);
|
||||
#endif
|
||||
#ifdef _Py_TIER2
|
||||
_PyStackRef executor = frame->localsplus[0];
|
||||
assert(tstate->current_executor == NULL);
|
||||
if (!PyStackRef_IsNull(executor)) {
|
||||
tstate->current_executor = PyStackRef_AsPyObjectBorrow(executor);
|
||||
PyStackRef_CLOSE(executor);
|
||||
}
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
next_instr = frame->instr_ptr;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue