diff --git a/Misc/NEWS b/Misc/NEWS index 9d6996de306..8efa6d2e8bf 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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 9ac02499e54..182560748fe 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); - } - - /* Release the lock if necessary */ - 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 */ + /* 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); - /* Delete the thread-state */ - PyThreadState_Delete(tcur); } + /* Release the lock if necessary */ + else if (oldstate == PyGILState_UNLOCKED) + PyEval_ReleaseThread(tcur); } #endif /* WITH_THREAD */