Skip to content

[3.14] gh-159136: Avoid stop-the-world when setting function name attributes (gh-159269) - #159726

Draft
nascheme wants to merge 1 commit into
python:3.14from
nascheme:backport-010bebb-3.14
Draft

nascheme wants to merge 1 commit into
python:3.14from
nascheme:backport-010bebb-3.14

Conversation

@nascheme

@nascheme nascheme commented Oct 19, 2026 •

Copy link
Copy Markdown
Member

Setting name, qualname, doc or module on a function stopped the world in the free-threaded build since gh-154826 and gh-154851, making functools.wraps() orders of magnitude slower with multiple threads.

Use the per-object critical section and _PyObject_XSetRefDelayed() instead, as gen_set_name() already does. Use acquire loads in the readers and hold strong references across error reporting, tracing, and eval-frame recording that may execute Python or detach the thread. The code, defaults, kwdefaults and closure setters still stop the world to clear func_version.

Document synchronization requirements for direct field access and the lifetime of borrowed function attributes.
(cherry picked from commit 010bebb)

…me attributes (pythongh-159269)

Setting __name__, __qualname__, __doc__ or __module__ on a function
stopped the world in the free-threaded build since pythongh-154826 and
pythongh-154851, making functools.wraps() orders of magnitude slower with
multiple threads.

Use the per-object critical section and _PyObject_XSetRefDelayed()
instead, as gen_set_name() already does.  Use acquire loads in the
readers and hold strong references across error reporting, tracing, and
eval-frame recording that may execute Python or detach the thread.  The
__code__, __defaults__, __kwdefaults__ and __closure__ setters still
stop the world to clear func_version.

Document synchronization requirements for direct field access and the
lifetime of borrowed function attributes.
(cherry picked from commit 010bebb)

Co-authored-by: Neil Schemenauer <nas-github@arctrix.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant