Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork33.7k
gh-116738: Make _abc module thread-safe#117488
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Conversation
colesbury left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Overall looks good. A few comments below.
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
swtaarrs commentedApr 11, 2024
Don't merge this yet - I'm still going to make a small improvement to the refcounting of |
swtaarrs commentedApr 11, 2024
Ok, this should be good to go once the builds finish. |
A collection of small changes aimed at making the `_abc` module safe touse in a free-threaded build.
This is a collection of small changes aimed at making the
_abcmodule safe to use in a free-threaded build:Only read and write
_abcmodule_state.abc_invalidation_counterand_abc_data._abc_negative_cache_versionwith atomic operations (except in situations when the object should only be visible to a single thread, like initialization, teardown, or GC traverse).Change the two members above from
unsigned long longtouint64_t. This was partially to avoid having to add more_Py_atomic_*_ullongvariants, but also becauseunsigned long longis guaranteed to be at least 64 bits and I can't imagine we'd ever want more than 64. Might as well make it explicit.Change
_in_weak_set()and_add_to_weak_set()to both take an_abc_data *andPyObject **, to allow them to use critical sections when reading or writing the pointers to sets of weak references. None of thePyObject *s that hold a set will change once they're first initialized, so we don't need to use locking when operating on the sets, only when reading or initializing the pointers.For the most part, no locks are held around multiple operations on related data structures (
_abc__abc_subclasscheck_impl()being a good example). User code that does things like performing ABC subclass checks while concurrently registering subclasses will always be subject to surprising results no matter what we do internally, so the module only ensures that its data structures are kept internally consistent.Two functions modify a type's
tp_flagsmember:_abc__abc_init()(should only be called with new types not visible to other threads) and_abc__abc_register_impl()(called with existing types). I added a helper totypeobject.cto support the_abc_registercase, and it was just a few more lines to also support the_abc_initcase as well. This felt a bit heavy-handed so I'm open to suggestions.Issue:Audit all built-in modules for thread safety #116738