diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2010-03-03 00:43:44 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2010-03-03 00:43:44 (GMT) |
commit | c951d56f9a10ea9e6f9b851f26f73147edbb706b (patch) | |
tree | 6fd3400aac240f22a48c2cbacdaa66719e8472bf /Modules/threadmodule.c | |
parent | 9e220be19d5f1ba1729f8713aa9162b552c4b0c8 (diff) | |
download | cpython-c951d56f9a10ea9e6f9b851f26f73147edbb706b.zip cpython-c951d56f9a10ea9e6f9b851f26f73147edbb706b.tar.gz cpython-c951d56f9a10ea9e6f9b851f26f73147edbb706b.tar.bz2 |
Issue #3299: fix thread.allocate_lock() error handler, replace PyObject_Del()
by Py_DECREF() to fix a crash in pydebug mode.
Diffstat (limited to 'Modules/threadmodule.c')
-rw-r--r-- | Modules/threadmodule.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/Modules/threadmodule.c b/Modules/threadmodule.c index 1981ff6..b65360e 100644 --- a/Modules/threadmodule.c +++ b/Modules/threadmodule.c @@ -27,14 +27,15 @@ typedef struct { 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); - - PyThread_free_lock(self->lock_lock); + if (self->lock_lock != NULL) { + /* Unlock the lock so it's safe to free it */ + PyThread_acquire_lock(self->lock_lock, 0); + PyThread_release_lock(self->lock_lock); + + PyThread_free_lock(self->lock_lock); + } PyObject_Del(self); } @@ -165,9 +166,9 @@ newlockobject(void) self->lock_lock = PyThread_allocate_lock(); self->in_weakreflist = NULL; if (self->lock_lock == NULL) { - PyObject_Del(self); - self = NULL; + Py_DECREF(self); PyErr_SetString(ThreadError, "can't allocate lock"); + return NULL; } return self; } |