[foreign-memaccess] RFR 8225172: Add way to create deref VarHandles without using the Layout API

Jorn Vernee jbvernee at xs4all.nl
Tue Jun 4 00:15:35 UTC 2019


Maurizio Cimadamore schreef op 2019-06-04 01:41:
> Hi Jorn,
> I too feel some of the tension you are talking about, but I'm quite
> opposed to a builder API such as the one you described.

Yeah - this was more of a suggestion to get the conversation going, in 
hindsight.

> Rather, what I'd be interested to explore, is whether we could built
> complex dereference expressions out  of simpler ones, using an
> approach similar to MethodHandle combinators. Let's assume that each
> memory access VH has an offset, denoted as O. Then it seems to me that
> there are only a bunch of moves we want to allow:
> 
> * obtain a memory address dereference for a given carrier type - this
> is the entry point VH, whose O = zero
> 
> * starting from a given memory address VH with offset O, obtain a new
> VH' whose O' =  O + C (where C is an argument to the combinator)
> 
> * starting from a given memory address VH with offset O, obtain a new
> one, called VH' whose offset O' = (S * N) + O (where S is an argument
> to the combinator - the scale - and N is a dynamic argument to VH' -
> the array index)
> 
> So, let's say I want to access the i32 in the layout below:
> 
> [5 : [ x32 i32 ] ]
> 
> What I'd do would be something like:
> 
> VarHandle handle = MemoryAddresses.dereferenceHandle(int.class); //(MA) 
> -> I
> handle = MemoryAddresses.offsetHandle(handle, 4); //(MA) -> I
> handle = MemoryAddresses.elementHandle(handle, 8); //(MA, J) -> I
> 
> 
> I think this is expressive enough to do what our API currently allows,
> and I kind of like that it gets there in a more primitive way (and
> very similar to how MH are constructed bottom up).

Yes, this seems much better than my idea :)

One thing I like about it is that we immediately get a VarHandle for the 
most simple case, rather than having to do several API calls to get 
there.

> Whether I'd like to completely give up Layout/LayoutPath for something
> like this I'm not sure though. The ability of constructing a full
> memory layout and then obtaining a var handle from one of its path
> seems pretty good. I've written examples with this API where going
> down the Layout route immediately spotted latent alignment issues that
> were present in the Unsafe code that it replaced. So, while we can get
> there in a more primitive way, I'm not 100% sure of whether that means
> we should get rid of layouts too. At the very least, layouts are
> useful whenever there's some kind of size/alignment/offset computation
> to be done, which, with layout, can be expressed at a slightly higher
> level.

Agree here as well. I just entertained the thought of removing Layouts, 
but also remembered that this is something that people actaully asked 
for w.r.t. direct ByteBuffers. So I think it's good to keep. But at the 
same time I'd like to see the Layout API being decoupled a bit more from 
the deref VarHandle API. Having a separate API layer in between seems 
like a good way to assure that, while also offering users the additional 
option to user their own layout APIs.

Jorn

> Maurizio
> 
> 
> 
> 
> On 03/06/2019 17:46, Jorn Vernee wrote:
>> Forgot to 'hg add' one file. See updated webrev: 
>> http://cr.openjdk.java.net/~jvernee/panama/webrevs/8225172/webrev.02/
>> 
>> Thanks,
>> Jorn
>> 
>> Jorn Vernee schreef op 2019-06-03 18:38:
>>> Hi,
>>> 
>>> I've implemented an alternative way of creating memory access
>>> VarHandles, which bypasses the Layout API. One reason for having such
>>> an alternative API is that it offers users the opportunity to use
>>> their own (pre-existing) layout APIs when creating VarHandles. This
>>> mainly consists of a builder API called MemoryAccessVarHandleBuilder,
>>> which can be used similarly to LayoutPath to construct a VarHandle.
>>> 
>>> As a side effect I've removed the dependency on Layout/LayoutPath 
>>> from
>>> VarHandles::makeMemoryAddressViewHandle. I think this decoupling 
>>> makes
>>> this API point more suited to what's possible to do with memory 
>>> access
>>> VarHandles.
>>> 
>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8225172
>>> Webrev: 
>>> http://cr.openjdk.java.net/~jvernee/panama/webrevs/8225172/webrev.01/
>>> 
>>> Added tests are pretty minimal since the resulting VarHandle is
>>> already tested by the existing tests using the Layout API.
>>> 
>>> This also opens up the possibility of removing the Layout API
>>> altogether if we wanted. Another TODO is adding a way to disable
>>> alignment checking upon access (which would need changes to the
>>> VarHandle impl classes I think).
>>> 
>>> Thanks,
>>> Jorn


More information about the panama-dev mailing list