diff options
author | Tim Peters <tim.peters@gmail.com> | 2004-10-30 23:09:22 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2004-10-30 23:09:22 (GMT) |
commit | ead8b7ab3008bda9b6a50d6d9d02ed68dab3b0fd (patch) | |
tree | 88d586b297a7587ee6face7b687b8a0008a2c3c1 /Include | |
parent | d7bcf4deb174e5e5b6548eb64fe2b0735da5dc95 (diff) | |
download | cpython-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')
-rw-r--r-- | Include/weakrefobject.h | 20 |
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; }; |