[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