GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | |||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | |||||||||||||||
GeezerVison is showing github.com — GH-140061: Use _PyObject_IsUniquelyReferenced to check if object is uniquely referenced by sergey-miryanov · Pull Request #140062 · python/cpython Conversation
|
|
I think it should skip news, but not sure about backporting. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
|
|
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
When the reference is owned by the eval loop, we need to use PyUnstable_Object_IsUniqueReferencedTemporary instead. I think there are a few cases of that here.
cc @colesbury
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
assert(), especially when the code paths can be called by extensions.Py_REFCNT(result) > 1 that need to be changed, such as in itertooslmodule.c
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
|
@ZeroIntensity @colesbury Thanks for review! I have fixed your suggestions, but it fails in TSAN(free-threading). Can you take a look? |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
It seems that me and Kumar broke that earlier (see #140138), sorry! You can ignore it for now and we'll rebase this once we get it fixed on main. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
@ZeroIntensity Thanks! |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
Is this PR ready for a review? |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
@vstinner Yes, it is ready to review. If @colesbury don't have any comments, of course. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
Ok, I click on [Ready for review] button in this case :-) |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
Ough, I forgot that I turned it to draft :( |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
Remaining code using $ git grep 'Py_REFCNT.*\(==\|<\|<=\|>\|>=\) *1' Doc/c-api/object.rst: :c:expr:`Py_REFCNT(op) == 1`. Doc/c-api/object.rst: is only used by this thread. :c:expr:`Py_REFCNT(op) == 1` is **not** Doc/whatsnew/3.14.rst: a replacement for ``Py_REFCNT(op) == 1`` on :term:`free threaded Include/internal/pycore_object.h: return Py_REFCNT(ob) == 1; Modules/_ctypes/_ctypes.c: assert (Py_REFCNT(obj) == 1); Modules/_functoolsmodule.c: assert(Py_REFCNT(args) == 1); Modules/_io/bytesio.c: * Py_REFCNT(buf) == 1, exports == 0. Modules/_io/bytesio.c: * Py_REFCNT(buf) > 1. exports == 0, Modules/_io/bytesio.c: * exports > 0. Py_REFCNT(buf) == 1, any modifications are forbidden. Modules/_testcapi/object.c: assert(Py_REFCNT(obj) == 1); Modules/_testcapi/object.c: assert(Py_REFCNT(obj) == 1); Modules/_testcapi/object.c: assert(Py_REFCNT(obj) == 1); \ Modules/_testcapimodule.c: assert(Py_REFCNT(obj) == 1); Modules/itertoolsmodule.c: assert (npools==0 || Py_REFCNT(result) == 1); Modules/itertoolsmodule.c: assert(r == 0 || Py_REFCNT(result) == 1); Modules/itertoolsmodule.c: assert(r == 0 || Py_REFCNT(result) == 1); Modules/itertoolsmodule.c: assert(r == 0 || Py_REFCNT(result) == 1); Objects/listobject.c: assert(Py_REFCNT(self) == 1 || PyMutex_IsLocked(&_PyObject_CAST(self)->ob_mutex)); Objects/longobject.c: assert(Py_REFCNT(z) == 1); Objects/longobject.c: assert(_PyLong_IsZero(z) || Py_REFCNT(z) == 1); Objects/longobject.c: assert(Py_REFCNT(z) == 1); Objects/longobject.c: assert(Py_REFCNT(obj) == 1); Objects/longobject.c: assert(Py_REFCNT(obj) == 1); Objects/object.c: CHECK(Py_REFCNT(op) >= 1); Objects/object.c: _PyObject_ASSERT(name, Py_REFCNT(name) >= 1); Objects/setobject.c: assert(Py_REFCNT(so) == 1); Objects/typeobject.c: CHECK(Py_REFCNT(type) >= 1); Objects/unicodeobject.c: assert(Py_REFCNT(unicode) == 1); Objects/unicodeobject.c: assert(Py_REFCNT(unicode) == 1); Python/ceval.c: assert(Py_REFCNT(locals) > 1); Python/gc_free_threading.c: _PyObject_ASSERT(op, Py_REFCNT(op) > 1); There are documentation and assertions. Assertions should continue to use |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
LGTM
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
As I understand @colesbury - yes. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
Co-authored-by: Victor Stinner <[email protected]>
|
Thanks @sergey-miryanov! |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
|
Thanks @sergey-miryanov for the PR, and @colesbury for merging it 🌮🎉.. I'm working now to backport this PR to: 3.14. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
…bjects are uniquely referenced (pythongh-140062) The previous `Py_REFCNT(x) == 1` checks can have data races in the free threaded build. `_PyObject_IsUniquelyReferenced(x)` is a more conservative check that is safe in the free threaded build and is identical to `Py_REFCNT(x) == 1` in the default GIL-enabled build. (cherry picked from commit 32c2649) Co-authored-by: Sergey Miryanov <[email protected]>
|
GH-140157 is a backport of this pull request to the 3.14 branch. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
…objects are uniquely referenced (gh-140062) (gh-140157) The previous `Py_REFCNT(x) == 1` checks can have data races in the free threaded build. `_PyObject_IsUniquelyReferenced(x)` is a more conservative check that is safe in the free threaded build and is identical to `Py_REFCNT(x) == 1` in the default GIL-enabled build. (cherry picked from commit 32c2649) Co-authored-by: Sergey Miryanov <[email protected]>
|
Thanks everyone for review! |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
…bjects are uniquely referenced (pythongh-140062) The previous `Py_REFCNT(x) == 1` checks can have data races in the free threaded build. `_PyObject_IsUniquelyReferenced(x)` is a more conservative check that is safe in the free threaded build and is identical to `Py_REFCNT(x) == 1` in the default GIL-enabled build.
There was an error while loading. Please reload this page.
Successfully merging this pull request may close these issues.
There was an error while loading. Please reload this page.