-
-
Notifications
You must be signed in to change notification settings - Fork 31k
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 our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
gh-112075: Add try-incref functions from nogil branch for use in dict thread safety #114512
Conversation
9318df9
to
818fc5f
Compare
Include/internal/pycore_object.h
Outdated
|
||
/* Tries to incref the object op and ensures that *src still points to it. */ | ||
static inline int | ||
_Py_TryAcquireObject(PyObject **src, PyObject *op) |
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.
I don't love this name, but I don't know what it should be called.
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.
I don't really have a better name either :P
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.
Maybe just _Py_TryIncref()
? Also maybe rename src
to ptr
for consistency with the other functions here.
818fc5f
to
3e50cbe
Compare
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.
A few minor suggestions, but otherwise LGTM.
Include/internal/pycore_object.h
Outdated
|
||
/* Tries to incref the object op and ensures that *src still points to it. */ | ||
static inline int | ||
_Py_TryAcquireObject(PyObject **src, PyObject *op) |
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.
Maybe just _Py_TryIncref()
? Also maybe rename src
to ptr
for consistency with the other functions here.
3e50cbe
to
d5fe7a1
Compare
colesbury/nogil@b6b12a9a94e Co-Authored-By: Sam Gross <[email protected]>
d5fe7a1
to
87e9465
Compare
…n dict thread safety (python#114512) * Bring in a subset of biased reference counting: colesbury/nogil@b6b12a9a94e The NoGIL branch has functions for attempting to do an incref on an object which may or may not be in flight. This just brings those functions over so that they will be usable from in the dict implementation to get items w/o holding a lock. There's a handful of small simple modifications: Adding inline to the force inline functions to avoid a warning, and switching from _Py_ALWAYS_INLINE to Py_ALWAYS_INLINE as that's available Remove _Py_REF_LOCAL_SHIFT as it doesn't exist yet (and is currently 0 in the 3.12 nogil branch anyway) ob_ref_shared is currently Py_ssize_t and not uint32_t, so use that _PY_LIKELY doesn't exist, so drop it _Py_ThreadLocal becomes _Py_IsOwnedByCurrentThread Add '_PyInterpreterState_GET()' to _Py_IncRefTotal calls. Co-Authored-By: Sam Gross <[email protected]>
…n dict thread safety (python#114512) * Bring in a subset of biased reference counting: colesbury/nogil@b6b12a9a94e The NoGIL branch has functions for attempting to do an incref on an object which may or may not be in flight. This just brings those functions over so that they will be usable from in the dict implementation to get items w/o holding a lock. There's a handful of small simple modifications: Adding inline to the force inline functions to avoid a warning, and switching from _Py_ALWAYS_INLINE to Py_ALWAYS_INLINE as that's available Remove _Py_REF_LOCAL_SHIFT as it doesn't exist yet (and is currently 0 in the 3.12 nogil branch anyway) ob_ref_shared is currently Py_ssize_t and not uint32_t, so use that _PY_LIKELY doesn't exist, so drop it _Py_ThreadLocal becomes _Py_IsOwnedByCurrentThread Add '_PyInterpreterState_GET()' to _Py_IncRefTotal calls. Co-Authored-By: Sam Gross <[email protected]>
The NoGIL branch has functions for attempting to do an incref on an object which may or may not be in flight. This just brings those functions over so that they will be usable from in the dict implementation to get items w/o holding a lock.
There's a handful of small simple modifications:
inline
to the force inline functions to avoid a warning, and switching from_Py_ALWAYS_INLINE
toPy_ALWAYS_INLINE
as that's available_Py_REF_LOCAL_SHIFT
as it doesn't exist yet (and is currently 0 in the 3.12 nogil branch anyway)ob_ref_shared
is currentlyPy_ssize_t
and not uint32_t, so use that_PY_LIKELY
doesn't exist, so drop it_Py_ThreadLocal
becomes_Py_IsOwnedByCurrentThread
_Py_IncRefTotal
calls.dict
objects thread-safe in--disable-gil
builds #112075