diff options
-rw-r--r-- | Misc/NEWS | 5 | ||||
-rw-r--r-- | Python/pystate.c | 25 |
2 files changed, 16 insertions, 14 deletions
@@ -12,7 +12,10 @@ What's New in Python 2.4 (release candidate 1|beta 3) Core and builtins ----------------- -... +- Bug 1061968: Fixes in 2.4a3 to address thread bug 1010677 reintroduced + the years-old thread shutdown race bug 225673. Numeric history lesson + aside, all bugs in all three reports are fixed now. + Extension Modules ----------------- diff --git a/Python/pystate.c b/Python/pystate.c index 9ac0249..1825607 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -483,25 +483,24 @@ PyGILState_Release(PyGILState_STATE oldstate) --tcur->gilstate_counter; assert(tcur->gilstate_counter >= 0); /* illegal counter value */ - /* If we are about to destroy this thread-state, we must - clear it while the lock is held, as destructors may run - */ + /* If we're going to destroy this thread-state, we must + * clear it while the GIL is held, as destructors may run. + */ if (tcur->gilstate_counter == 0) { /* can't have been locked when we created it */ assert(oldstate == PyGILState_UNLOCKED); PyThreadState_Clear(tcur); + /* Delete the thread-state. Note this releases the GIL too! + * It's vital that the GIL be held here, to avoid shutdown + * races; see bugs 225673 and 1061968 (that nasty bug has a + * habit of coming back). + */ + PyThreadState_DeleteCurrent(); + /* Delete this thread from our TLS. */ + PyThread_delete_key_value(autoTLSkey); } - /* Release the lock if necessary */ - if (oldstate == PyGILState_UNLOCKED) + else if (oldstate == PyGILState_UNLOCKED) PyEval_ReleaseThread(tcur); - - /* Now complete destruction of the thread if necessary */ - if (tcur->gilstate_counter == 0) { - /* Delete this thread from our TLS */ - PyThread_delete_key_value(autoTLSkey); - /* Delete the thread-state */ - PyThreadState_Delete(tcur); - } } #endif /* WITH_THREAD */ |