]> granicus.if.org Git - python/commitdiff
Add weakref support to the thread.lock type.
authorGregory P. Smith <greg@mad-scientist.com>
Thu, 20 Aug 2009 09:39:38 +0000 (09:39 +0000)
committerGregory P. Smith <greg@mad-scientist.com>
Thu, 20 Aug 2009 09:39:38 +0000 (09:39 +0000)
Doc/library/weakref.rst
Misc/NEWS
Modules/threadmodule.c

index 5dcb03029fb4fb25d5b379512505cb4bcdb06c57..a1a3314ffba5d84f749cf3e92def93cdc53b7066 100644 (file)
@@ -65,6 +65,9 @@ and regular expression pattern objects.
 .. versionchanged:: 2.4
    Added support for files, sockets, arrays, and patterns.
 
+.. versionchanged:: 2.7
+   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 8977e19abdb6f38da406df88415a9830a4b35d12..7bb0d5ee1a3a486a8d00473b3aa843c39c52e18e 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -359,6 +359,8 @@ Core and Builtins
 Library
 -------
 
+- The thread.lock type now supports weak references.
+
 - Issue #1356969: Add missing info methods in Tix.HList.
 
 - Issue #1522587: New constants and methods for the Tix.Grid widget.
index e7638bbb6defecce373de2eb78a063b26b88b676..ad84a1e0c549398ff3fd2d5e2bb98cd323f4d01f 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);
@@ -140,12 +144,12 @@ static PyTypeObject Locktype = {
        0,                              /* tp_getattro */
        0,                              /* tp_setattro */
        0,                              /* tp_as_buffer */
-       0,                              /* tp_flags */
+       Py_TPFLAGS_HAVE_WEAKREFS,       /* tp_flags */
        0,                              /* tp_doc */
        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;