From 4e63d54b36093f35533bc0871bfa6ad3111bd048 Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Thu, 20 Aug 2009 09:39:38 +0000 Subject: [PATCH] Add weakref support to the thread.lock type. --- Doc/library/weakref.rst | 3 +++ Misc/NEWS | 2 ++ Modules/threadmodule.c | 9 +++++++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Doc/library/weakref.rst b/Doc/library/weakref.rst index 5dcb03029fb..a1a3314ffba 100644 --- a/Doc/library/weakref.rst +++ b/Doc/library/weakref.rst @@ -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:: diff --git a/Misc/NEWS b/Misc/NEWS index 8977e19abdb..7bb0d5ee1a3 100644 --- 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. diff --git a/Modules/threadmodule.c b/Modules/threadmodule.c index e7638bbb6de..ad84a1e0c54 100644 --- a/Modules/threadmodule.c +++ b/Modules/threadmodule.c @@ -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;