summaryrefslogtreecommitdiffstats
path: root/Include/weakrefobject.h
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2004-10-30 23:09:22 (GMT)
committerTim Peters <tim.peters@gmail.com>2004-10-30 23:09:22 (GMT)
commitead8b7ab3008bda9b6a50d6d9d02ed68dab3b0fd (patch)
tree88d586b297a7587ee6face7b687b8a0008a2c3c1 /Include/weakrefobject.h
parentd7bcf4deb174e5e5b6548eb64fe2b0735da5dc95 (diff)
downloadcpython-ead8b7ab3008bda9b6a50d6d9d02ed68dab3b0fd.zip
cpython-ead8b7ab3008bda9b6a50d6d9d02ed68dab3b0fd.tar.gz
cpython-ead8b7ab3008bda9b6a50d6d9d02ed68dab3b0fd.tar.bz2
SF 1055820: weakref callback vs gc vs threads
In cyclic gc, clear weakrefs to unreachable objects before allowing any Python code (weakref callbacks or __del__ methods) to run. This is a critical bugfix, affecting all versions of Python since weakrefs were introduced. I'll backport to 2.3.
Diffstat (limited to 'Include/weakrefobject.h')
-rw-r--r--Include/weakrefobject.h20
1 files changed, 20 insertions, 0 deletions
diff --git a/Include/weakrefobject.h b/Include/weakrefobject.h
index 3503892..daf490f 100644
--- a/Include/weakrefobject.h
+++ b/Include/weakrefobject.h
@@ -9,11 +9,31 @@ extern "C" {
typedef struct _PyWeakReference PyWeakReference;
+/* PyWeakReference is the base struct for the Python ReferenceType, ProxyType,
+ * and CallableProxyType.
+ */
struct _PyWeakReference {
PyObject_HEAD
+
+ /* The object to which this is a weak reference, or Py_None if none.
+ * Note that this is a stealth reference: wr_object's refcount is
+ * not incremented to reflect this pointer.
+ */
PyObject *wr_object;
+
+ /* A callable to invoke when wr_object dies, or NULL if none. */
PyObject *wr_callback;
+
+ /* A cache for wr_object's hash code. As usual for hashes, this is -1
+ * if the hash code isn't known yet.
+ */
long hash;
+
+ /* If wr_object is weakly referenced, wr_object has a doubly-linked NULL-
+ * terminated list of weak references to it. These are the list pointers.
+ * If wr_object goes away, wr_object is set to Py_None, and these pointers
+ * have no meaning then.
+ */
PyWeakReference *wr_prev;
PyWeakReference *wr_next;
};