]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Merged revisions 74524 via svnmerge from
authorBenjamin Peterson <benjamin@python.org>
Sat, 10 Oct 2009 01:16:07 +0000 (01:16 +0000)
committerBenjamin Peterson <benjamin@python.org>
Sat, 10 Oct 2009 01:16:07 +0000 (01:16 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r74524 | gregory.p.smith | 2009-08-20 04:39:38 -0500 (Thu, 20 Aug 2009) | 2 lines

  Add weakref support to the thread.lock type.
........

Doc/library/weakref.rst
Modules/_threadmodule.c

index 9aaa58a4bfb4f9e0ce01a16a821ccb395a01a459..dcc5bf3a6b3a91dffdd76b7d7072ca0178cd4c05 100644 (file)
@@ -61,6 +61,9 @@ instances, functions written in Python (but not in C), instance methods, sets,
 frozensets, file objects, :term:`generator`\s, type objects, sockets, arrays,
 deques, and regular expression pattern objects.
 
+.. versionchanged:: 3.2
+   Added support for thread.lock and threading.Lock.
+
 Several built-in types such as :class:`list` and :class:`dict` do not directly
 support weak references but can add support through subclassing::
 
index 744e94da25326f2de6f04ce6525c5b9838505223..8dc2d005dc20a0da1a15bf3fea32232d202b997c 100644 (file)
@@ -3,6 +3,7 @@
 /* Interface to Sjoerd's portable C thread library */
 
 #include "Python.h"
+#include "structmember.h" /* offsetof */
 
 #ifndef WITH_THREAD
 #error "Error!  The rest of Python is not compiled with thread support."
@@ -20,12 +21,15 @@ static PyObject *ThreadError;
 typedef struct {
        PyObject_HEAD
        PyThread_type_lock lock_lock;
+       PyObject *in_weakreflist;
 } lockobject;
 
 static void
 lock_dealloc(lockobject *self)
 {
        assert(self->lock_lock);
+       if (self->in_weakreflist != NULL)
+               PyObject_ClearWeakRefs((PyObject *) self);
        /* Unlock the lock so it's safe to free it */
        PyThread_acquire_lock(self->lock_lock, 0);
        PyThread_release_lock(self->lock_lock);
@@ -145,7 +149,7 @@ static PyTypeObject Locktype = {
        0,                              /*tp_traverse*/
        0,                              /*tp_clear*/
        0,                              /*tp_richcompare*/
-       0,                              /*tp_weaklistoffset*/
+       offsetof(lockobject, in_weakreflist), /*tp_weaklistoffset*/
        0,                              /*tp_iter*/
        0,                              /*tp_iternext*/
        lock_methods,                   /*tp_methods*/
@@ -159,6 +163,7 @@ newlockobject(void)
        if (self == NULL)
                return NULL;
        self->lock_lock = PyThread_allocate_lock();
+       self->in_weakreflist = NULL;
        if (self->lock_lock == NULL) {
                PyObject_Del(self);
                self = NULL;