Uh oh!
There was an error while loading. Please reload this page.
gh-145254: Add thread safety annotation - #145255
Conversation
- Implement annotation for different thread safety levels - Annotate PyMutex_* APIs
hugovk
commented
Feb 27, 2026
python/python-docs-theme#297 is merged and released in https://github.com/python/python-docs-theme/releases/tag/2026.2 Fix the lint with And as a bonus, the docs will rebuild with the new theme. |
Uh oh!
There was an error while loading. Please reload this page.
| refexplicit="True", | ||
| ) | ||
| prefix = sphinx_gettext("Thread safety:") + " " | ||
| classes = [f"threadsafety-{level}"] |
There was a problem hiding this comment.
The CSS requires, as it should, the "threadsafety" class as well as "threadsafety-FOO".
| classes= [f"threadsafety-{level}"] | |
| classes= ["threadsafety", f"threadsafety-{level}"] |
encukou
left a comment
There was a problem hiding this comment.
Adding some comments.
FWIW, I don't want to step on your toes, but I'd be happy to take over this PR & let you review, in case you'd prefer that.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
- Change levels to include atomic and safe on distinct objects. - Add a section explaining the levels in the thread safety page - Cross reference levels section from annotation
lysnikolaou
commented
Mar 6, 2026
I've addressed all feedback. Additionally, after some more discussions on this, I've settled on having five different thread safety levels. I've also opened python/python-docs-theme#299 for the changes required there. |
lysnikolaou
commented
Mar 10, 2026
Uh oh!
There was an error while loading. Please reload this page.
| global state in an unsynchronized way and must only be called from a single | ||
| thread throughout the program's lifetime. | ||
| Example: a function that modifies process-wide state such as signal handlers |
There was a problem hiding this comment.
Another good example for this is APIs that return borrowed references
There was a problem hiding this comment.
Not all of them :)
It would be nice to use specific functions as examples, like with PyList_GetItemRef and PyMutex_IsLocked below.
| # Name of the function. | ||
| name: str | ||
| # Thread safety level. | ||
| # One of: 'incompatible', 'compatible', 'safe'. |
There was a problem hiding this comment.
maybe use literal instead of str
encukou
left a comment
There was a problem hiding this comment.
This looks good, thank you!
Let's merge to unblock the other changes; details can always be adjusted afterwards.
| global state in an unsynchronized way and must only be called from a single | ||
| thread throughout the program's lifetime. | ||
| Example: a function that modifies process-wide state such as signal handlers |
There was a problem hiding this comment.
Not all of them :)
It would be nice to use specific functions as examples, like with PyList_GetItemRef and PyMutex_IsLocked below.
Thanks @lysnikolaou for the PR, and @kumaraditya303 for merging it 🌮🎉.. I'm working now to backport this PR to: 3.14. |
(cherry picked from commit 0dce4c6) Co-authored-by: Lysandros Nikolaou <lisandrosnik@gmail.com>
GH-145862 is a backport of this pull request to the 3.14 branch. |
📚 Documentation preview 📚: https://cpython-previews--145255.org.readthedocs.build/en/145255/c-api/synchronization.html#c.PyMutex_Lock