summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-12-19 15:17:15 (GMT)
committerGitHub <noreply@github.com>2024-12-19 15:17:15 (GMT)
commit7b811d0562a0bf7433165785f1549ac199610f8b (patch)
tree75314e9af7386a3e43f724a2ef9c9203699bcbbe /Objects
parentb9b3e4a076caddf7876d1d4d762a117a26faffcf (diff)
downloadcpython-7b811d0562a0bf7433165785f1549ac199610f8b.zip
cpython-7b811d0562a0bf7433165785f1549ac199610f8b.tar.gz
cpython-7b811d0562a0bf7433165785f1549ac199610f8b.tar.bz2
gh-128008: Add `PyWeakref_IsDead()` (GH-128009)
The `PyWeakref_IsDead()` function tests if a weak reference is dead without any side effects. Although you can also detect if a weak reference is dead using `PyWeakref_GetRef()`, that function returns a strong reference that must be `Py_DECREF()`'d, which can introduce side effects if the last reference is concurrently dropped (at least in the free threading build).
Diffstat (limited to 'Objects')
-rw-r--r--Objects/weakrefobject.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c
index 9e3da1c..0ee64ed 100644
--- a/Objects/weakrefobject.c
+++ b/Objects/weakrefobject.c
@@ -932,6 +932,19 @@ PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
return (PyObject *)get_or_create_weakref(type, ob, callback);
}
+int
+PyWeakref_IsDead(PyObject *ref)
+{
+ if (ref == NULL) {
+ PyErr_BadInternalCall();
+ return -1;
+ }
+ if (!PyWeakref_Check(ref)) {
+ PyErr_Format(PyExc_TypeError, "expected a weakref, got %T", ref);
+ return -1;
+ }
+ return _PyWeakref_IS_DEAD(ref);
+}
int
PyWeakref_GetRef(PyObject *ref, PyObject **pobj)