[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