diff options
author | Gregory P. Smith <greg@mad-scientist.com> | 2009-08-20 09:39:38 (GMT) |
---|---|---|
committer | Gregory P. Smith <greg@mad-scientist.com> | 2009-08-20 09:39:38 (GMT) |
commit | 4e63d54b36093f35533bc0871bfa6ad3111bd048 (patch) | |
tree | 30b5e5a6177864dc9c78439737431f7e48b6b2e5 /Modules | |
parent | 77db0165eb2a39a7986e7e5b08da420cc1388ac8 (diff) | |
download | cpython-4e63d54b36093f35533bc0871bfa6ad3111bd048.zip cpython-4e63d54b36093f35533bc0871bfa6ad3111bd048.tar.gz cpython-4e63d54b36093f35533bc0871bfa6ad3111bd048.tar.bz2 |
Add weakref support to the thread.lock type.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/threadmodule.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/Modules/threadmodule.c b/Modules/threadmodule.c index e7638bb..ad84a1e 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; |