From 8cdd636f877c906121b27934522876a1d9ac12db Mon Sep 17 00:00:00 2001 From: Eric Snow Date: Thu, 21 Nov 2024 10:33:15 -0700 Subject: [PATCH] [3.13] gh-126986: Stop Using _PyInterpreterState_FailIfNotRunning() (gh-127112) This is a pseudo-backport of d6b3e78 (gh-126988). In that change for 3.14+, we dropped _PyInterpreterState_FailIfNotRunning() and added _PyErr_SetInterpreterAlreadyRunning(). Here, we replace usage of _PyInterpreterState_FailIfNotRunning() with the inlined equivalent of _PyErr_SetInterpreterAlreadyRunning(), without adding that function. That way we avoid changing the 3.13 ABI. --- Python/crossinterp.c | 4 ++-- Python/pystate.c | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Python/crossinterp.c b/Python/crossinterp.c index 2af0dd6191a..01bb45d23ba 100644 --- a/Python/crossinterp.c +++ b/Python/crossinterp.c @@ -985,8 +985,8 @@ _PyXI_ApplyErrorCode(_PyXI_errcode code, PyInterpreterState *interp) break; case _PyXI_ERR_ALREADY_RUNNING: assert(interp != NULL); - assert(_PyInterpreterState_IsRunningMain(interp)); - _PyInterpreterState_FailIfRunningMain(interp); + // In 3.14+ we use _PyErr_SetInterpreterAlreadyRunning(). + PyErr_SetString(PyExc_InterpreterError, "interpreter already running"); break; case _PyXI_ERR_MAIN_NS_FAILURE: PyErr_SetString(PyExc_InterpreterError, diff --git a/Python/pystate.c b/Python/pystate.c index ad3fdce69bf..960895e5bad 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -1053,7 +1053,9 @@ get_main_thread(PyInterpreterState *interp) int _PyInterpreterState_SetRunningMain(PyInterpreterState *interp) { - if (_PyInterpreterState_FailIfRunningMain(interp) < 0) { + if (get_main_thread(interp) != NULL) { + // In 3.14+ we use _PyErr_SetInterpreterAlreadyRunning(). + PyErr_SetString(PyExc_InterpreterError, "interpreter already running"); return -1; } PyThreadState *tstate = current_fast_get(); @@ -1099,6 +1101,7 @@ _PyThreadState_IsRunningMain(PyThreadState *tstate) return get_main_thread(interp) == tstate; } +// This has been removed in 3.14. int _PyInterpreterState_FailIfRunningMain(PyInterpreterState *interp) {