summaryrefslogtreecommitdiffstats
path: root/Doc/lib/libweakref.tex
diff options
context:
space:
mode:
authorFred Drake <fdrake@acm.org>2001-10-26 17:40:22 (GMT)
committerFred Drake <fdrake@acm.org>2001-10-26 17:40:22 (GMT)
commit7408da54e2b8ca3afef70fef12bf7c9ce804c969 (patch)
tree04137cd945a82428f247a6f0971e67aa55d69c32 /Doc/lib/libweakref.tex
parentc44e9eca66712580aa19045a88c086f2ac9427bd (diff)
downloadcpython-7408da54e2b8ca3afef70fef12bf7c9ce804c969.zip
cpython-7408da54e2b8ca3afef70fef12bf7c9ce804c969.tar.gz
cpython-7408da54e2b8ca3afef70fef12bf7c9ce804c969.tar.bz2
Many, many small fixes and improvements, most suggested by Detlef Lannert.
Diffstat (limited to 'Doc/lib/libweakref.tex')
-rw-r--r--Doc/lib/libweakref.tex44
1 files changed, 27 insertions, 17 deletions
diff --git a/Doc/lib/libweakref.tex b/Doc/lib/libweakref.tex
index 73caf94..7f851cd 100644
--- a/Doc/lib/libweakref.tex
+++ b/Doc/lib/libweakref.tex
@@ -14,6 +14,9 @@
The \module{weakref} module allows the Python programmer to create
\dfn{weak references} to objects.
+In the discussion which follows, the term \dfn{referent} means the
+object which is referred to by a weak reference.
+
XXX --- need to say more here!
Not all objects can be weakly referenced; those objects which do
@@ -24,12 +27,13 @@ be made to support weak references; see section \ref{weakref-extension},
\begin{funcdesc}{ref}{object\optional{, callback}}
- Return a weak reference to \var{object}. If \var{callback} is
+ Return a weak reference to \var{object}. The original object can be
+ retrieved by calling the reference object if the referent is still
+ alive; if the referent is no longer alive, calling the reference
+ object will cause \code{None} to be returned. If \var{callback} is
provided, it will be called when the object is about to be
finalized; the weak reference object will be passed as the only
parameter to the callback; the referent will no longer be available.
- The original object can be retrieved by calling the reference
- object, if the referent is still alive.
It is allowable for many weak references to be constructed for the
same object. Callbacks registered for each weak reference will be
@@ -48,10 +52,11 @@ be made to support weak references; see section \ref{weakref-extension},
\exception{TypeError}.
Weak references support tests for equality, but not ordering. If
- the \var{object} is still alive, two references are equal if the
- objects are equal (regardless of the \var{callback}). If
- \var{object} has been deleted, they are equal only if the references
- being compared are the same reference object.
+ the referents are still alive, two references have the same
+ equalality relationship as their referents (regardless of the
+ \var{callback}). If either referent has been deleted, the
+ references are equal only if the reference objects are the same
+ object.
\end{funcdesc}
\begin{funcdesc}{proxy}{object\optional{, callback}}
@@ -89,7 +94,7 @@ be made to support weak references; see section \ref{weakref-extension},
\begin{classdesc}{WeakValueDictionary}{\optional{dict}}
Mapping class that references values weakly. Entries in the
dictionary will be discarded when no strong reference to the value
- exists anymore.
+ exists any more.
\end{classdesc}
\begin{datadesc}{ReferenceType}
@@ -158,7 +163,8 @@ application code that needs to use a reference object should follow
this pattern:
\begin{verbatim}
-o = ref()
+# r is a weak reference object
+o = r()
if o is None:
# referent has been garbage collected
print "Object has been allocated; can't frobnicate."
@@ -169,7 +175,7 @@ else:
Using a separate test for ``liveness'' creates race conditions in
threaded applications; another thread can cause a weak reference to
-become invalidated before the \method{get()} method is called; the
+become invalidated before the weak reference is called; the
idiom shown above is safe in threaded applications as well as
single-threaded applications.
@@ -189,10 +195,12 @@ import weakref
_id2obj_dict = weakref.WeakValueDictionary()
def remember(obj):
- _id2obj_dict[id(obj)] = obj
+ oid = id(obj)
+ _id2obj_dict[oid] = obj
+ return oid
-def id2obj(id):
- return _id2obj_dict(id)
+def id2obj(oid):
+ return _id2obj_dict[oid]
\end{verbatim}
@@ -205,7 +213,7 @@ overhead on those objects which do not benefit by weak referencing
(such as numbers).
For an object to be weakly referencable, the extension must include a
-\ctype{PyObject *} field in the instance structure for the use of the
+\ctype{PyObject*} field in the instance structure for the use of the
weak reference mechanism; it must be initialized to \NULL{} by the
object's constructor. It must also set the \member{tp_weaklistoffset}
field of the corresponding type object to the offset of the field.
@@ -236,17 +244,19 @@ PyTypeObject PyInstance_Type = {
The only further addition is that the destructor needs to call the
weak reference manager to clear any weak references. This should be
-done before any other parts of the destruction have occurred:
+done before any other parts of the destruction have occurred, but is
+only required if the weak reference list is non-\NULL:
\begin{verbatim}
static void
instance_dealloc(PyInstanceObject *inst)
{
- /* Allocate tempories if needed, but do not begin
+ /* Allocate temporaries if needed, but do not begin
destruction just yet.
*/
- PyObject_ClearWeakRefs((PyObject *) inst);
+ if (inst->in_weakreflist != NULL)
+ PyObject_ClearWeakRefs((PyObject *) inst);
/* Proceed with object destruction normally. */
}