diff options
author | Maksim Levental <maksim.levental@gmail.com> | 2025-07-25 07:05:30 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-07-25 08:05:30 -0400 |
commit | 21774489f0a812254c110bebfff3aa9b6c4ad960 (patch) | |
tree | 39c1c243f40ef5793fcb509f4a7e57eef5af0061 /mlir/test/python | |
parent | 8005c6a1081c94e440b9c91e6b50cba9b72d186f (diff) | |
download | llvm-21774489f0a812254c110bebfff3aa9b6c4ad960.zip llvm-21774489f0a812254c110bebfff3aa9b6c4ad960.tar.gz llvm-21774489f0a812254c110bebfff3aa9b6c4ad960.tar.bz2 |
[mlir][python] fix PyDenseResourceElementsAttribute finalizer (#150561)
This PR melds https://github.com/llvm/llvm-project/pull/150137 and
https://github.com/llvm/llvm-project/pull/149414 *and* partially reverts
https://github.com/llvm/llvm-project/pull/124832.
The summary is the `PyDenseResourceElementsAttribute` finalizer/deleter
has/had two problems
1. wasn't threadsafe (can be called from a different thread than that
which currently holds the GIL)
2. can be called while the interpreter is "not initialized"
https://github.com/llvm/llvm-project/pull/124832 for some reason decides
to re-initialize the interpreter to avoid case 2 and runs afoul of the
fact that `Py_IsInitialized` can be false during the finalization of the
interpreter itself (e.g., at the end of a script).
I don't know why this decision was made (I missed the PR) but I believe
we should never be calling
[Py_Initialize](https://docs.python.org/3/c-api/init.html#c.Py_Initialize):
> In an application \*\*\*\***embedding Python**\*\*\*\*, this should be
called before using any other Python/C API functions
**but we aren't embedding Python**!
So therefore we will only be in case 2 when the interpreter is being
finalized and in that case we should just leak the buffer.
Note,
[lldb](https://github.com/llvm/llvm-project/blob/548ca9e97673a168023a616d311d901ca04b29a3/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp#L81-L93)
does a similar sort of thing for its finalizers.
Co-authored-by: Anton Korobeynikov <anton@korobeynikov.info>
Co-authored-by: Max Manainen <maximmanainen@gmail.com>
Co-authored-by: Anton Korobeynikov <anton@korobeynikov.info>
Co-authored-by: Max Manainen <maximmanainen@gmail.com>
Diffstat (limited to 'mlir/test/python')
-rw-r--r-- | mlir/test/python/ir/array_attributes.py | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/mlir/test/python/ir/array_attributes.py b/mlir/test/python/ir/array_attributes.py index ef1d835..66f7ec8 100644 --- a/mlir/test/python/ir/array_attributes.py +++ b/mlir/test/python/ir/array_attributes.py @@ -31,6 +31,7 @@ def testGetDenseElementsUnsupported(): # CHECK: unimplemented array format conversion from format: print(e) + # CHECK-LABEL: TEST: testGetDenseElementsUnSupportedTypeOkIfExplicitTypeProvided @run def testGetDenseElementsUnSupportedTypeOkIfExplicitTypeProvided(): @@ -41,8 +42,9 @@ def testGetDenseElementsUnSupportedTypeOkIfExplicitTypeProvided(): # realistic example would be a NumPy extension type like the bfloat16 # type from the ml_dtypes package, which isn't a dependency of this # test. - attr = DenseElementsAttr.get(array.view(np.datetime64), - type=IntegerType.get_signless(64)) + attr = DenseElementsAttr.get( + array.view(np.datetime64), type=IntegerType.get_signless(64) + ) # CHECK: dense<{{\[}}[1, 2, 3], [4, 5, 6]]> : tensor<2x3xi64> print(attr) # CHECK: {{\[}}[1 2 3] @@ -135,6 +137,7 @@ def testGetDenseElementsFromListMixedTypes(): # Splats. ################################################################################ + # CHECK-LABEL: TEST: testGetDenseElementsSplatInt @run def testGetDenseElementsSplatInt(): @@ -617,3 +620,18 @@ def testGetDenseResourceElementsAttr(): # CHECK: BACKING MEMORY DELETED # CHECK: EXIT FUNCTION print("EXIT FUNCTION") + + +# CHECK-LABEL: TEST: testDanglingResource +print("TEST: testDanglingResource") +# see https://github.com/llvm/llvm-project/pull/149414, https://github.com/llvm/llvm-project/pull/150137, https://github.com/llvm/llvm-project/pull/150561 +# 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)), + ) |