_PyGILState_Init(), PyGILState_Ensure(): Since PyThread_set_key_value()

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.
This commit is contained in:
Tim Peters 2004-10-09 22:47:13 +00:00
parent fda787fcec
commit f9becec8cd

View file

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