From 8c624ea1c3c5c912bb28a7f75b47858cfee0d317 Mon Sep 17 00:00:00 2001 From: Anton Korobeynikov Date: Tue, 22 Jul 2025 15:55:47 -0700 Subject: [PATCH] Do not re-initialize interpreter during finalization. This causes all kinds of issues including stolen GIL and segfaults. --- mlir/lib/Bindings/Python/IRAttributes.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mlir/lib/Bindings/Python/IRAttributes.cpp b/mlir/lib/Bindings/Python/IRAttributes.cpp index 8f79caf08a6d0..a783b0346385e 100644 --- a/mlir/lib/Bindings/Python/IRAttributes.cpp +++ b/mlir/lib/Bindings/Python/IRAttributes.cpp @@ -1428,6 +1428,12 @@ class PyDenseIntElementsAttribute } }; +// Check if the python version is less than 3.13. Py_IsFinalizing is a part +// of stable ABI since 3.13 and before it was available as _Py_IsFinalizing. +#if PY_VERSION_HEX < 0x030d0000 +#define Py_IsFinalizing _Py_IsFinalizing +#endif + class PyDenseResourceElementsAttribute : public PyConcreteAttribute { public: @@ -1474,7 +1480,7 @@ class PyDenseResourceElementsAttribute // The userData is a Py_buffer* that the deleter owns. auto deleter = [](void *userData, const void *data, size_t size, size_t align) { - if (!Py_IsInitialized()) + if (!Py_IsFinalizing() && !Py_IsInitialized()) Py_Initialize(); Py_buffer *ownedView = static_cast(userData); nb::gil_scoped_acquire gil;