]> granicus.if.org Git - python/commitdiff
Issue #13156: _PyGILState_Reinit(): Re-associate the auto thread state with the
authorCharles-François Natali <neologix@free.fr>
Tue, 22 Nov 2011 18:49:51 +0000 (19:49 +0100)
committerCharles-François Natali <neologix@free.fr>
Tue, 22 Nov 2011 18:49:51 +0000 (19:49 +0100)
TLS key only if the thread that called fork() had an associated auto thread
state (this might not be the case for example for a thread created outside of
Python calling into a subinterpreter).

Python/pystate.c

index 40699af499496327ab481f249972e1803ab56523..3b4c6a2e65f8d1d14e5617d9251fa6fd94cc401d 100644 (file)
@@ -592,9 +592,9 @@ _PyGILState_Fini(void)
     autoInterpreterState = NULL;
 }
 
-/* Reset the TLS key - called by PyOS_AfterFork.
+/* Reset the TLS key - called by PyOS_AfterFork().
  * This should not be necessary, but some - buggy - pthread implementations
- * don't flush TLS on fork, see issue #10517.
+ * don't reset TLS upon fork(), see issue #10517.
  */
 void
 _PyGILState_Reinit(void)
@@ -604,8 +604,9 @@ _PyGILState_Reinit(void)
     if ((autoTLSkey = PyThread_create_key()) == -1)
         Py_FatalError("Could not allocate TLS entry");
 
-    /* re-associate the current thread state with the new key */
-    if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
+    /* If the thread had an associated auto thread state, reassociate it with
+     * the new key. */
+    if (tstate && PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0)
         Py_FatalError("Couldn't create autoTLSkey mapping");
 }