[foreign-jextract] Closing sliced segment closes original segment
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Tue Aug 4 13:19:50 UTC 2020
On 04/08/2020 14:06, Filip Krakowski wrote:
> Hi,
>
> I had a couple of IllegalStateExceptions stating that the segment I
> tried to close was already closed. After some debugging I found out
> this is caused by using a try-with-resources statement in combination
> with a MemorySegment (slice) returned by a field access ( try(var
> slice = struct.field$addr(originalsegment) { ... } ). After the
> statement the slice gets closed which also happens to close the
> original MemorySegment. I find this very confusing and would like to
> ask if this is intended behaviour or a bug.
This is the intended behavior, and is documented in the API javadoc.
When using the memory segment API directly, you can protect against this
(if you so wish) by making the sliced segment not closeable (see
MemorySegment::withAccessModes), before sharing it with a client.
In this case the offending party is jextract - so I think we'll have to
do something in the extracted code to prevent this issue e.g. have
jextract mark the returned slice as non-closeable, to make it clear that
in no way the returned segment can have lifecycle side-effects on the
original segment.
Thanks
Maurizio
>
> Best regards,
> Filip
> Email Signature
More information about the panama-dev
mailing list