MemoryAddress object changes once put into memory
Ty Young
youngty1997 at gmail.com
Tue Jan 14 16:38:58 UTC 2020
On 1/14/20 10:34 AM, Maurizio Cimadamore wrote:
> If I understand correctly your question, this is to be expected. What
> is really happening is that you are serializing a MemoryAddress into a
> 'long' (its address) and save it into native memory. Since we're
> really only storing a 64-bit number, all the characteristics of a
> MemoryAddress are lost after a store - such as the spatial and
> temporal bounds.
>
> When you read that, later on, you just read a long, and the runtime
> will construct a MemoryAddress instance on top of that. Since no bound
> information is available, the runtime will resurrect that
> MemoryAddress as a Nothing-backed MemoryAddress. Which means the
> address will be unusable.
>
> But if you are serializing and deserializing segments you know, you
> can do a rebase after the deserialization (the get() operation), so
> that your address will become functionally equivalent to the one you
> started with.
Ah, OK. Thanks for the clarification.
What would you use to rebase the segment with? Obviously when I go to
reconstruct the array in Java all I have is what's stored at that same
point in the larger segment:
@Override
public Array<E> getValue(int index)
{
MemorySegment elementSegment = this.segment.asSlice(index*192,
192);
MemorySegment addressSegment = elementSegment.asSlice(0, 64);
MemorySegment layoutSegment = elementSegment.asSlice(64, 64);
MemorySegment lengthSegment = elementSegment.asSlice(128, 64);
VarHandle addressHandle =
MemoryHandles.varHandle(MemoryAddress.class, ByteOrder.nativeOrder());
VarHandle layoutHandle = MemoryHandles.varHandle(long.class,
ByteOrder.nativeOrder());
VarHandle lengthHandle = MemoryHandles.varHandle(long.class,
ByteOrder.nativeOrder());
MemoryAddress address =
(MemoryAddress)addressHandle.get(addressSegment.baseAddress());
long layout = (long)layoutHandle.get(layoutSegment.baseAddress());
long length = (long)lengthHandle.get(lengthSegment.baseAddress());
return new MemoryArray(address, layout, length);
}
So how do you go about rebasing something like this?
>
> Maurizio
>
>
> On 14/01/2020 16:18, Ty Young wrote:
>> Hi,
>>
>>
>> As mentioned in a different thread, a MemoryAccess instance changes
>> once put into memory. Here are all the relevant bits from the class:
>>
>>
>> private final MemorySegment segment;
>> private final SequenceLayout sequenceLayout;
>>
>> public ArrayArray(long length)
>> {
>> this.sequenceLayout = MemoryLayout.ofSequence(length*24,
>> MemoryLayouts.JAVA_LONG);
>>
>> this.segment =
>> MemorySegment.allocateNative(this.sequenceLayout);
>> }
>>
>>
>> @Override
>> public void setValue(int index, Array<E> value)
>> {
>> MemorySegment elementSegment =
>> this.segment.asSlice(index*192, 192);
>>
>> MemorySegment addressSegment = elementSegment.asSlice(0, 64);
>> MemorySegment layoutSegment = elementSegment.asSlice(64, 64);
>> MemorySegment lengthSegment = elementSegment.asSlice(128, 64);
>>
>> VarHandle addressHandle =
>> MemoryHandles.varHandle(MemoryAddress.class, ByteOrder.nativeOrder());
>> VarHandle layoutHandle = MemoryHandles.varHandle(long.class,
>> ByteOrder.nativeOrder());
>> VarHandle lengthHandle = MemoryHandles.varHandle(long.class,
>> ByteOrder.nativeOrder());
>>
>> addressHandle.set(addressSegment.baseAddress(),
>> value.getAddress());
>> layoutHandle.set(layoutSegment.baseAddress(),
>> value.getElementSequenceLayout().elementLayout().bitSize());
>> lengthHandle.set(lengthSegment.baseAddress(),
>> value.getLength().getAsLong());
>> }
>>
>>
>> ...
>>
>>
>> As shown here, the address of the array being set is being stored in
>> the addressSegment. However, once read back into Java it changes so
>> that both it's ID changes, has an offset, and its limit is zero when
>> it should be 64 even when read back in using the same VarHandle in
>> setValue method. Am I doing something wrong(like no rebasing?) or is
>> there something else going on?
>>
More information about the panama-dev
mailing list