diff options
author | Sam Gross <colesbury@gmail.com> | 2024-09-24 20:08:18 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-24 20:08:18 (GMT) |
commit | f4997bb3ac961d6aaf07ce650cd074e28ce6ccd0 (patch) | |
tree | 6c82b0fadd282e74c8f81de4a3966666fd210196 /Python/sysmodule.c | |
parent | d3c76dff444046504754a437dceebc9a9c87ef18 (diff) | |
download | cpython-f4997bb3ac961d6aaf07ce650cd074e28ce6ccd0.zip cpython-f4997bb3ac961d6aaf07ce650cd074e28ce6ccd0.tar.gz cpython-f4997bb3ac961d6aaf07ce650cd074e28ce6ccd0.tar.bz2 |
gh-123923: Defer refcounting for `f_funcobj` in `_PyInterpreterFrame` (#124026)
Use a `_PyStackRef` and defer the reference to `f_funcobj` when
possible. This avoids some reference count contention in the common case
of executing the same code object from multiple threads concurrently in
the free-threaded build.
Diffstat (limited to 'Python/sysmodule.c')
-rw-r--r-- | Python/sysmodule.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 887a916..ac343a8 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2384,10 +2384,11 @@ sys__getframemodulename_impl(PyObject *module, int depth) while (f && (_PyFrame_IsIncomplete(f) || depth-- > 0)) { f = f->previous; } - if (f == NULL || f->f_funcobj == NULL) { + if (f == NULL || PyStackRef_IsNull(f->f_funcobj)) { Py_RETURN_NONE; } - PyObject *r = PyFunction_GetModule(f->f_funcobj); + PyObject *func = PyStackRef_AsPyObjectBorrow(f->f_funcobj); + PyObject *r = PyFunction_GetModule(func); if (!r) { PyErr_Clear(); r = Py_None; |