diff --git a/mlir/lib/Bindings/Python/IRAttributes.cpp b/mlir/lib/Bindings/Python/IRAttributes.cpp index 8f79caf08a6d0..fad7d2ad25db0 100644 --- a/mlir/lib/Bindings/Python/IRAttributes.cpp +++ b/mlir/lib/Bindings/Python/IRAttributes.cpp @@ -1428,6 +1428,16 @@ class PyDenseIntElementsAttribute } }; +static bool pythonIsFinalizing() { +#if PY_VERSION_HEX >= 0x030d0000 + return Py_IsFinalizing(); +#elif PY_VERSION_HEX >= 0x03070000 + return _Py_IsFinalizing(); +#else + return _Py_Finalizing != nullptr; +#endif +} + class PyDenseResourceElementsAttribute : public PyConcreteAttribute { public: @@ -1474,7 +1484,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_IsInitialized() || pythonIsFinalizing())) Py_Initialize(); Py_buffer *ownedView = static_cast(userData); nb::gil_scoped_acquire gil; diff --git a/mlir/test/python/ir/array_attributes.py b/mlir/test/python/ir/array_attributes.py index ef1d835fc6401..48ae2fdaf567f 100644 --- a/mlir/test/python/ir/array_attributes.py +++ b/mlir/test/python/ir/array_attributes.py @@ -617,3 +617,16 @@ def test_attribute(context, mview): # CHECK: BACKING MEMORY DELETED # CHECK: EXIT FUNCTION print("EXIT FUNCTION") + + +print("TEST: danglingResource") +# This error occurs only when there is an alive context with a DenseResourceElementsAttr +# in the end of the program, so we put it here without an encapsulating function. +ctx = Context() + +with ctx, Location.unknown(): + DenseResourceElementsAttr.get_from_buffer( + memoryview(np.array([1,2,3])), + "some_resource", + RankedTensorType.get((3,), IntegerType.get_signed(32)) + )