RFR: JDK-8205549 JDK-8205698 Support of flattened values in Unsafe

Paul Sandoz paul.sandoz at oracle.com
Wed Jun 27 23:54:13 UTC 2018


Hi John,

Those new API points you propose match closely with what i had in mind, and i also agree that a set of query methods are important (I was just scratching the surface of that).

IMHO i think we can make a tentative split now and that would also increase prototyping velocity without potentially destabilizing  existing unsafe usages. Mandy’s patch indicates the amount of Java platform code changes are manageable for such a split and it can allow for quicker experimentation with VarHandles.  

Paul.

> On Jun 27, 2018, at 3:22 PM, John Rose <john.r.rose at oracle.com> wrote:
> 
> On Jun 27, 2018, at 2:17 PM, Frederic Parain <frederic.parain at oracle.com> wrote:
>> 
>> Please review this changeset which adds support for flattened values to the Unsafe API.
>> 
>> http://cr.openjdk.java.net/~fparain/Unsafe/webrev.02/index.html
>> 
>> This changeset addresses the following issues:
>> - reading from /writing to a flattenable/flattened field with Unsafe
>> - null-check when writing to a flattenable field
>> - initialization barrier when reading an uninitialized static value field with Unsafe
>> - enforcing values immutability even when using Unsafe
>> - reading from /writing to a value array with Unsafe
>> - null-check when writing to a value array with Unsafe
>> 
>> Thanks,
>> 
>> Fred
> 
> Impressive work Fred; you have a nice way to doing the impossible.
> 
> The existing version of U.putObject doesn't look at metadata, but clearly
> the new version has to depend on metadata to see how the container is shaped.
> 
> I see how this can work the way you did it, and why it's useful to unblock
> prototyping.  But it's not a design that I want to see made permanent.
> 
> Container analysis is a delicate and potentially buggy operation which I am
> surprised can be hidden safely under U.putObject.  The basic contract of
> Unsafe is to force the user to take responsibility for querying the container,
> and issue the U.putX that matches the container.  The benefit of this contract
> is not only avoiding delicate and buggy operations inside Unsafe, but also
> a simpler optimization model.
> 
> So, I view this as a work-in-progress, which can unblock existing
> code that uses Unsafe without requiring that code to be revamped.
> 
> Later, the get/putObject APIs need to be split into versions which explicitly
> manage references vs. flat values.  Unsafe-using code that wants full
> optimization will want to avoid get/putObject if it has this complicated
> stuff going on under the hood.
> 
> New API points are needed to let the user work explicitly with the
> container shape:
> 
>    public Object getValue(Object o, long offset, Class<?> valueType);
>    public void putValue(Object o, long offset, Class<?> valueType, Object value);
>    public Object getReference(Object o, long offset);
>    public void putReference(Object o, long offset, Object reference);
> 
> The get/putValue API points would load and store values of the given type
> in their native format (flattened).  If you knew a container wasn't flattened
> although the type could be, you'd call putReference.
> 
> We could also deprecate get/putObject so that users will be forced to
> do the container analysis.  An non-deprecated version of your container
> analysis should have a more complex-sounding name, such as
> getReferenceOrValue.  Or we should just force users to write their
> own; it's simple if the hooks are provided (see below).
> 
> The valueType operand is there even when the value is also present,
> for robustness.  If we derive valueType from value automatically, the
> user loses a channel for asserting the container analysis.  You could
> get heap-scribbling bugs when the value is of the wrong type.  Oddly
> enough, the Unsafe API has a concern with safety:  You have to give
> the user a reasonable chance to write safe code using Unsafe.
> 
> I think we also want queries which can execute the logic you have written,
> directly, and not in the course of reading or writing the heap.  Something
> like this would give unsafe users control over factoring the metadata
> queries from the access itself:
> 
>    public Class<?> objectFieldContainerType(Field f);
>    public Field findObjectField(Class<?> objClass, long offset);
>    public Object getReferenceOrValue(Object o, long offset) {
>      Class<?> ctype = objectFieldContainerType(findObjectField(o.getClass(), offset));
>      if (ctype.isValue())  return getValue(o, offset, ctype);
>      else return getReference(o, offset);
>    }
> 
> All that said, for the present review, it looks good as a work in progress.
> 
> (If the benefit of overloading get/putObject is small, consider naming
> this new logic with a new name like getReferenceOrValue.  But I'm guessing
> the overloading trick is a short-term requirement, to avoid cracking open
> lots of platform code.)
> 
> If we don't have another bug to track Unsafe support for container analysis
> of flat fields, let's file one as a followup to this.
> 
> — John




More information about the valhalla-dev mailing list