From 3686e5b52f2a02c1c19050479d1dd0fd9d1dd4f8 Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere Date: Wed, 6 Aug 2025 09:06:54 -0700 Subject: [lldb] Eliminate (_)Py_IsFinalizing (NFC) (#152226) Looking at the implementation of `pylifecycle.c` in cpython, finalizing and initialized are set at the same time. Therefore we can eliminate the call to `Py_IsFinalizing` and only check `Py_IsInitialized`, which is part of the stable API. I converted the check to an assert and confirmed that during my test suite runs, we never got into the if block. Because we check before taking the lock, there is an opportunity for a race, but that exact same race exists with the original code. --- .../ScriptInterpreter/Python/PythonDataObjects.cpp | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) (limited to 'lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp') diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp index 82aa022..27ac5432 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp @@ -71,24 +71,11 @@ Expected python::As(Expected &&obj) { return std::string(utf8.get()); } -static bool python_is_finalizing() { -#if PY_VERSION_HEX >= 0x030d0000 - return Py_IsFinalizing(); -#else - return _Py_IsFinalizing(); -#endif -} - void PythonObject::Reset() { if (m_py_obj && Py_IsInitialized()) { - if (python_is_finalizing()) { - // Leak m_py_obj rather than crashing the process. - // https://docs.python.org/3/c-api/init.html#c.PyGILState_Ensure - } else { - PyGILState_STATE state = PyGILState_Ensure(); - Py_DECREF(m_py_obj); - PyGILState_Release(state); - } + PyGILState_STATE state = PyGILState_Ensure(); + Py_DECREF(m_py_obj); + PyGILState_Release(state); } m_py_obj = nullptr; } -- cgit v1.1