diff options
author | Sam Gross <colesbury@gmail.com> | 2025-03-26 16:08:20 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-26 16:08:20 (GMT) |
commit | 3d4ac1a2c2b610f35a9e164878d67185e4a3546f (patch) | |
tree | 3f5c5a1347accef950ebfce5d7204864daaf0b41 /Python/generated_cases.c.h | |
parent | 1b8bb1ed0c4243796af531a35de982bc4f028215 (diff) | |
download | cpython-3d4ac1a2c2b610f35a9e164878d67185e4a3546f.zip cpython-3d4ac1a2c2b610f35a9e164878d67185e4a3546f.tar.gz cpython-3d4ac1a2c2b610f35a9e164878d67185e4a3546f.tar.bz2 |
gh-123358: Use `_PyStackRef` in `LOAD_DEREF` (gh-130064)
Concurrent accesses from multiple threads to the same `cell` object did not
scale well in the free-threaded build. Use `_PyStackRef` and optimistically
avoid locking to improve scaling.
With the locks around cell reads gone, some of the free threading tests were
prone to starvation: the readers were able to run in a tight loop and the
writer threads weren't scheduled frequently enough to make timely progress.
Adjust the tests to avoid this.
Co-authored-by: Donghee Na <donghee.na@python.org>
Diffstat (limited to 'Python/generated_cases.c.h')
-rw-r--r-- | Python/generated_cases.c.h | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 493d99d..f6a538e 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -8822,14 +8822,18 @@ INSTRUCTION_STATS(LOAD_DEREF); _PyStackRef value; PyCellObject *cell = (PyCellObject *)PyStackRef_AsPyObjectBorrow(GETLOCAL(oparg)); - PyObject *value_o = PyCell_GetRef(cell); - if (value_o == NULL) { + _PyFrame_SetStackPointer(frame, stack_pointer); + value = _PyCell_GetStackRef(cell); + stack_pointer = _PyFrame_GetStackPointer(frame); + if (PyStackRef_IsNull(value)) { + stack_pointer[0] = value; + stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); _PyFrame_SetStackPointer(frame, stack_pointer); _PyEval_FormatExcUnbound(tstate, _PyFrame_GetCode(frame), oparg); stack_pointer = _PyFrame_GetStackPointer(frame); JUMP_TO_LABEL(error); } - value = PyStackRef_FromPyObjectSteal(value_o); stack_pointer[0] = value; stack_pointer += 1; assert(WITHIN_STACK_BOUNDS()); |