]> granicus.if.org Git - python/commitdiff
Revert rev 2.35. It was based on erroneous reasoning -- the current
authorTim Peters <tim.peters@gmail.com>
Sun, 10 Oct 2004 05:30:40 +0000 (05:30 +0000)
committerTim Peters <tim.peters@gmail.com>
Sun, 10 Oct 2004 05:30:40 +0000 (05:30 +0000)
thread's id can't get duplicated, because (of course!) the current thread
is still running.  The code should work either way, but reverting the
gratuitous change should make backporting easier, and gets the bad
reasoning out of 2.35's new comments.

Python/pystate.c

index 613f8cc15bc8073120191e9342c80b05369de4e0..9ac02499e54f54eb1a980b8e74d1f2d8a5b1a0b6 100644 (file)
@@ -484,31 +484,24 @@ PyGILState_Release(PyGILState_STATE oldstate)
        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.
-        * In addition, we have to delete out TLS entry, which is keyed
-        * by thread id, while the GIL is held:  the thread calling us may
-        * go away, and a new thread may be created with the same thread
-        * id.  If we don't delete our TLS until after the GIL is released,
-        * that new thread may manage to insert a TLS value with the same
-        * thread id as ours, and then we'd erroneously delete it.
-        */
+          clear it while the lock 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 this thread from our TLS */
-               PyThread_delete_key_value(autoTLSkey);
        }
 
        /* Release the lock if necessary */
        if (oldstate == PyGILState_UNLOCKED)
                PyEval_ReleaseThread(tcur);
 
-       /* Now complete destruction of the thread if necessary.  This
-        * couldn't be done before PyEval_ReleaseThread() because
-        * PyThreadState_Delete doesn't allow deleting the current thread.
-        */
-       if (tcur->gilstate_counter == 0)
+       /* 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 */