]> granicus.if.org Git - python/commitdiff
_PyGILState_Init(), PyGILState_Ensure(): Since PyThread_set_key_value()
authorTim Peters <tim.peters@gmail.com>
Sat, 9 Oct 2004 22:47:13 +0000 (22:47 +0000)
committerTim Peters <tim.peters@gmail.com>
Sat, 9 Oct 2004 22:47:13 +0000 (22:47 +0000)
can fail, check its return value, and die if it does fail.

_PyGILState_Init():  Assert that the thread doesn't already have an
association for autoTLSkey.  If it does, PyThread_set_key_value() will
ignore the attempt to (re)set the association, which the code clearly
doesn't want.

Python/pystate.c

index d88d2d116e8289680381ef6cf2619435a8c9bca0..ba9be971b8d200af5591eddcbfe19243bdf55180 100644 (file)
@@ -395,7 +395,9 @@ _PyGILState_Init(PyInterpreterState *i, PyThreadState *t)
        autoTLSkey = PyThread_create_key();
        autoInterpreterState = i;
        /* Now stash the thread state for this thread in TLS */
-       PyThread_set_key_value(autoTLSkey, (void *)t);
+       assert(PyThread_get_key_value(autoTLSkey) == NULL);
+       if (PyThread_set_key_value(autoTLSkey, (void *)t) < 0)
+               Py_FatalError("Couldn't create autoTLSkey mapping");
        assert(t->gilstate_counter == 0); /* must be a new thread state */
        t->gilstate_counter = 1;
 }
@@ -434,7 +436,8 @@ PyGILState_Ensure(void)
                tcur = PyThreadState_New(autoInterpreterState);
                if (tcur == NULL)
                        Py_FatalError("Couldn't create thread-state for new thread");
-               PyThread_set_key_value(autoTLSkey, (void *)tcur);
+               if (PyThread_set_key_value(autoTLSkey, (void *)tcur) < 0)
+                       Py_FatalError("Couldn't create autoTLSkey mapping");
                current = 0; /* new thread state is never current */
        }
        else