cleanup action captures original segment

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Mon Jan 6 11:08:32 UTC 2025


On 29/12/2024 10:50, Wojciech Lukowicz wrote:
> Turns out AbstractMemorySegmentImpl#reinterpretInternal creates a lambda
> wrapper around the cleanup action which captures the original segment
> and consequently its scope, doing here what the JavaDoc warns against:

This is correct, and subtle. What the code does is this:

```
Runnable action = cleanup != null ?
                 () -> 
cleanup.accept(SegmentFactories.makeNativeSegmentUnchecked(address(), 
newSize)) :
                 null;
```

The cleanup action is created against a _fresh_ memory segment that 
points at the same address as the old segment. The fresh segment points 
to the global arena, so it doesn't share anything with the old segment. 
BUT, the use of `address()` inside the cleanup action implicitly 
captures the old segment instance. This is a bug.

Filed:
https://bugs.openjdk.org/browse/JDK-8347047

Thanks
Maurizio
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/panama-dev/attachments/20250106/c0192cc2/attachment.htm>


More information about the panama-dev mailing list