https://github.com/python/cpython/commit/d0f0308a373298a8906ee5a7546275e1b2e906ea
commit: d0f0308a373298a8906ee5a7546275e1b2e906ea
branch: main
author: Sam Gross <[email protected]>
committer: corona10 <[email protected]>
date: 2024-01-06T12:12:26+09:00
summary:
gh-113750: Fix object resurrection in free-threaded builds (gh-113751)
gh-113750: Fix object resurrection on free-threaded builds
This avoids the undesired re-initializing of fields like `ob_gc_bits`,
`ob_mutex`, and `ob_tid` when an object is resurrected due to its
finalizer being called.
This change has no effect on the default (with GIL) build.
files:
M Include/cpython/object.h
M Modules/_testcapi/gc.c
M Objects/object.c
diff --git a/Include/cpython/object.h b/Include/cpython/object.h
index d6482f4bc689a1..c93931634fee05 100644
--- a/Include/cpython/object.h
+++ b/Include/cpython/object.h
@@ -4,6 +4,7 @@
PyAPI_FUNC(void) _Py_NewReference(PyObject *op);
PyAPI_FUNC(void) _Py_NewReferenceNoTotal(PyObject *op);
+PyAPI_FUNC(void) _Py_ResurrectReference(PyObject *op);
#ifdef Py_REF_DEBUG
/* These are useful as debugging aids when chasing down refleaks. */
diff --git a/Modules/_testcapi/gc.c b/Modules/_testcapi/gc.c
index 829200ad12cd3c..f4feaaafbdc6cc 100644
--- a/Modules/_testcapi/gc.c
+++ b/Modules/_testcapi/gc.c
@@ -126,9 +126,7 @@ slot_tp_del(PyObject *self)
* never happened.
*/
{
- Py_ssize_t refcnt = Py_REFCNT(self);
- _Py_NewReferenceNoTotal(self);
- Py_SET_REFCNT(self, refcnt);
+ _Py_ResurrectReference(self);
}
assert(!PyType_IS_GC(Py_TYPE(self)) || PyObject_GC_IsTracked(self));
}
diff --git a/Objects/object.c b/Objects/object.c
index d970a26756173b..587c5528c01345 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -509,9 +509,7 @@ PyObject_CallFinalizerFromDealloc(PyObject *self)
/* tp_finalize resurrected it! Make it look like the original Py_DECREF
* never happened. */
- Py_ssize_t refcnt = Py_REFCNT(self);
- _Py_NewReferenceNoTotal(self);
- Py_SET_REFCNT(self, refcnt);
+ _Py_ResurrectReference(self);
_PyObject_ASSERT(self,
(!_PyType_IS_GC(Py_TYPE(self))
@@ -2389,6 +2387,17 @@ _Py_NewReferenceNoTotal(PyObject *op)
new_reference(op);
}
+void
+_Py_ResurrectReference(PyObject *op)
+{
+ if (_PyRuntime.tracemalloc.config.tracing) {
+ _PyTraceMalloc_NewReference(op);
+ }
+#ifdef Py_TRACE_REFS
+ _Py_AddToAllObjects(op);
+#endif
+}
+
#ifdef Py_TRACE_REFS
void
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]