[foreign-memaccess] RFR: 8254343: Revisit API for supporting mapped memory segments

Jorn Vernee jvernee at openjdk.java.net
Mon Oct 12 10:42:19 UTC 2020


On Fri, 9 Oct 2020 21:10:05 GMT, Maurizio Cimadamore <mcimadamore at openjdk.org> wrote:

> As I was polishing the memory access API ahead of the upstream integration, I realized of a fatal flaw with the
> `MemorySegment` vs. `MappedMemorySegment` split. This split works against the idiomatic usage of the VarHandle API:
> since memory access var handles feature a `MemorySegment` coordinate, clients using a `MappedMemorySegment` will be
> using *inexact* access mode (which goes through an extra, expensive `asType` adaptation).   The only way to remove the
> perfomance issue is to make deep changes in the VarHandle machinery to support a more lax form of `asType` adaptation,
> but adding this to support mapped segments seems, frankly, overkill.  On top of that, while discussing this with Paul,
> I realized that no liveness check was performed on the load()/unload() operation, and that these operations, more
> generally, did not get the `@Scoped` treatment, meaning they will crash the VM when  used with shared segments.  This
> patch rectifies these issues; it removes the `MappedMemorySegment` interfaces, and it introduce a `MemoryMapping`
> abstraction instead. Clients can ask a memory mapping out of a segment; the memory mapping will contain the usual
> `load`/`force` operation, so there's no loss in expressiveness of the API.  For instance, to force contents of a mapped
> segment to be written in the underlying file, a client can do:  segment.asSlice(20, 100)
>        .mapping()
>        .ifPresent(MemoryMapping::force);
> 
> We believe this to be a reasonable compromise, which allows us to keep a single MemorySegment interface (instead of
> two), which removes the var handle performance issue, and in turn enables other improvements, such as turning the
> `spliterator` method into a true instance method.

Marked as reviewed by jvernee (Committer).

src/jdk.incubator.foreign/share/classes/jdk/incubator/foreign/MemorySegment.java line 237:

> 235:
> 236:     /**
> 237:      * Returns a spliterator for this given memory segment. The returned spliterator reports {@link
> Spliterator#SIZED},

Suggestion:

     * Returns a spliterator for this memory segment. The returned spliterator reports {@link Spliterator#SIZED},

-------------

PR: https://git.openjdk.java.net/panama-foreign/pull/377


More information about the panama-dev mailing list