mirror of https://github.com/python/cpython.git
gh-59956: Add a Test to Verify GILState Matches the "Current" Thread State (gh-101625)
This test should have been in gh-101431. https://github.com/python/cpython/issues/59956
This commit is contained in:
parent
38752760c9
commit
914f8fd9f7
|
@ -1413,6 +1413,9 @@ def callback():
|
||||||
ret = assert_python_ok('-X', 'tracemalloc', '-c', code)
|
ret = assert_python_ok('-X', 'tracemalloc', '-c', code)
|
||||||
self.assertIn(b'callback called', ret.out)
|
self.assertIn(b'callback called', ret.out)
|
||||||
|
|
||||||
|
def test_gilstate_matches_current(self):
|
||||||
|
_testcapi.test_current_tstate_matches()
|
||||||
|
|
||||||
|
|
||||||
class Test_testcapi(unittest.TestCase):
|
class Test_testcapi(unittest.TestCase):
|
||||||
locals().update((name, getattr(_testcapi, name))
|
locals().update((name, getattr(_testcapi, name))
|
||||||
|
|
|
@ -1534,6 +1534,42 @@ crash_no_current_thread(PyObject *self, PyObject *Py_UNUSED(ignored))
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test that the GILState thread and the "current" thread match. */
|
||||||
|
static PyObject *
|
||||||
|
test_current_tstate_matches(PyObject *self, PyObject *Py_UNUSED(ignored))
|
||||||
|
{
|
||||||
|
PyThreadState *orig_tstate = PyThreadState_Get();
|
||||||
|
|
||||||
|
if (orig_tstate != PyGILState_GetThisThreadState()) {
|
||||||
|
PyErr_SetString(PyExc_RuntimeError,
|
||||||
|
"current thread state doesn't match GILState");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *err = NULL;
|
||||||
|
PyThreadState_Swap(NULL);
|
||||||
|
PyThreadState *substate = Py_NewInterpreter();
|
||||||
|
|
||||||
|
if (substate != PyThreadState_Get()) {
|
||||||
|
err = "subinterpreter thread state not current";
|
||||||
|
goto finally;
|
||||||
|
}
|
||||||
|
if (substate != PyGILState_GetThisThreadState()) {
|
||||||
|
err = "subinterpreter thread state doesn't match GILState";
|
||||||
|
goto finally;
|
||||||
|
}
|
||||||
|
|
||||||
|
finally:
|
||||||
|
Py_EndInterpreter(substate);
|
||||||
|
PyThreadState_Swap(orig_tstate);
|
||||||
|
|
||||||
|
if (err != NULL) {
|
||||||
|
PyErr_SetString(PyExc_RuntimeError, err);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
Py_RETURN_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
/* To run some code in a sub-interpreter. */
|
/* To run some code in a sub-interpreter. */
|
||||||
static PyObject *
|
static PyObject *
|
||||||
run_in_subinterp(PyObject *self, PyObject *args)
|
run_in_subinterp(PyObject *self, PyObject *args)
|
||||||
|
@ -3354,6 +3390,7 @@ static PyMethodDef TestMethods[] = {
|
||||||
{"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
|
{"make_memoryview_from_NULL_pointer", make_memoryview_from_NULL_pointer,
|
||||||
METH_NOARGS},
|
METH_NOARGS},
|
||||||
{"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
|
{"crash_no_current_thread", crash_no_current_thread, METH_NOARGS},
|
||||||
|
{"test_current_tstate_matches", test_current_tstate_matches, METH_NOARGS},
|
||||||
{"run_in_subinterp", run_in_subinterp, METH_VARARGS},
|
{"run_in_subinterp", run_in_subinterp, METH_VARARGS},
|
||||||
{"run_in_subinterp_with_config",
|
{"run_in_subinterp_with_config",
|
||||||
_PyCFunction_CAST(run_in_subinterp_with_config),
|
_PyCFunction_CAST(run_in_subinterp_with_config),
|
||||||
|
|
Loading…
Reference in New Issue