[foreign-memaccess] RFR 8227394: Add MemorySegment::asByteBuffer convenience method

Jorn Vernee jbvernee at xs4all.nl
Thu Jul 11 12:57:14 UTC 2019


> What do you think?

I have felt for a while that asByteBuffer morally belongs on 
MemorySegment, since a MemoryAddress models a cursor, so 'treating a 
cursor as a span of memory', as the name asByteBuffer implies feels odd, 
and indeed we still have to supply the size separately.

Like you say, by adding a MemorySegment::asByteBuffer we introduce a 
problem because some segments are too large, but this seems pretty 
similar to being able to pass a size to MemoryAddress::asByteBuffer that 
is too large, which is still possible even if it's an `int`. At the same 
time we have one less problem because we can no longer use a 
MemoryAddress that is out of bounds of the segment.

It feels like a pretty much even trade.

> I'm less convinced on the
> usefulness of turning an entire memory segment into a bytebuffer: if
> you really wanted to view the entire memory segment as a BB, maybe you
> just wanted to create a (direct) BB in the first place?

By that same line of thought, do we need MemoryAddress::asByteBuffer? 
This is meant as an interop thing, where you just have a MemorySegment 
that is given to you, and would like to turn it into a ByteBuffer.

I agree with the concern of the API explosion. I was also looking at 
removing the asByteBuffer method from MemoryAddress, and replacing it 
with a more general 'sliceAt' method, that slices the underlying 
MemorySegment at the offset denoted by the MemoryAddress itself (instead 
of having to pass that manually as the offset to MemorySegment::slice). 
I could imagine cases where a user has a MemoryAddress and wants to do 
an offset and then slice, e.g. I have a pointer to some struct, returned 
by some third party allocator API, and want to give someone else a 
pointer to access just a single field, I can try and call 
`address.segment().slice(...)`, but the problem would be that I don't 
know what to pass as offset (after all, the MemoryAddress I have might 
not be the base address of the segment).

With a `sliceAt` method, the current use of asByteBuffer(int) could be 
replaced with `address.sliceAt(newSize).asByteBuffer()`.

Prototype: 
http://cr.openjdk.java.net/~jvernee/panama/webrevs/8227394/webrev.01/

What do you think? Of course, if you'd rather hold off on fiddling with 
the API too much at this time that's fine with me :) (I'm guessing we're 
trying to target JDK 14 as an incubating feature?)

Jorn

On 2019-07-11 14:00, Maurizio Cimadamore wrote:
> Hi Jorn,
> I gave some thought about this in the past, and my conclusion was
> mixed - and I filed this in the "you ain't gonna need it" bucket
> (YAGNI).
> 
> The motivations are that (i) it is really simple to emulate the API
> with the existing methods (as the implementation of the new method
> shows), and that (ii) the new API is, by necessity, a partial API -
> not all segments can be mapped onto a byte buffer - some are too
> large; while the existing API on memory address is total (thanks to
> the explicit int parameter).
> 
> In other words, the existing API on MemoryAddress supports what I
> believe to be the most important interop idiom: slicing a big memory
> segment into multiple < 32bits buffer views. I'm less convinced on the
> usefulness of turning an entire memory segment into a bytebuffer: if
> you really wanted to view the entire memory segment as a BB, maybe you
> just wanted to create a (direct) BB in the first place?
> 
> The current model is kind of easy to explain - the moves we allow are:
> 
> * ByteBuffer -> MemorySegment
> 
> * MemoryAddress + int -> ByteBuffer
> 
> This feels minimal. If we add another dimension, as per your patch:
> 
> * MemorySegment -> ByteBuffer
> 
> Then the next question is - should we allow also:
> 
> * ByteBuffer -> MemoryAddress? (e.g. create a big segment from the
> byte buffer and then have a memory address point at the BB offset)
> 
> Which feels a bit like a slippery slope. I'd be more confident in
> adding a facility like this after some real world validation.
> 
> What do you think?
> 
> Maurizio
> 
> On 11/07/2019 12:28, Jorn Vernee wrote:
>> Hi,
>> 
>> Please review this small patch that adds an asByteBuffer convenience 
>> method to MemorySegment that returns a buffer the size of the segment.
>> 
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8227394
>> Webrev: 
>> http://cr.openjdk.java.net/~jvernee/panama/webrevs/8227394/webrev.00/
>> 
>> (note that the javadoc is largely taken from 
>> MemoryAddress::asByteBuffer).
>> 
>> My reason for adding this is that I wanted to reach for this method a 
>> few times when playing with the API, but it didn't exist. So, I 
>> thought it would be useful to have.
>> 
>> (Also, I originally wanted to upload this to GitHub [1] to test out 
>> the Skara [2] tools, but apparently that's not operational yet :) )
>> 
>> Thanks,
>> Jorn
>> 
>> [1] : https://github.com/openjdk/panama/pull/1
>> [2] : https://github.com/openjdk/skara#openjdk-project-skara


More information about the panama-dev mailing list