[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