[Python-checkins] python/dist/src/Python pystate.c,2.34,2.35

tim_one at users.sourceforge.net tim_one at users.sourceforge.net
Sun Oct 10 01:55:39 CEST 2004


Update of /cvsroot/python/python/dist/src/Python
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv337/Python

Modified Files:
	pystate.c 
Log Message:
PyGILState_Release():  If we need to delete the TLS entry for this thread,
that must be done under protection of the GIL, for reasons explained in
new comments.


Index: pystate.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/pystate.c,v
retrieving revision 2.34
retrieving revision 2.35
diff -u -d -r2.34 -r2.35
--- pystate.c	9 Oct 2004 22:47:13 -0000	2.34
+++ pystate.c	9 Oct 2004 23:55:36 -0000	2.35
@@ -472,24 +472,31 @@
 	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
-	*/
+	 * 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.
+	 */
 	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 */
-	if (tcur->gilstate_counter == 0) {
-		/* Delete this thread from our TLS */
-		PyThread_delete_key_value(autoTLSkey);
-		/* Delete the thread-state */
+	/* 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)
 		PyThreadState_Delete(tcur);
-	}
 }
 #endif /* WITH_THREAD */



More information about the Python-checkins mailing list