JNI was <was> Re: RFR: 8183546: [MVT] cleanup/improve vreturn convention implementation

Paul Sandoz paul.sandoz at oracle.com
Thu Jul 6 14:58:11 UTC 2017


Slight change in behaviour with the patch applied. Now i observe null returned if ValueTypeReturnedAsFields is enabled or disabled. (Note this behaviour is observed when running with -Xint).

This is currently what i am using:

  http://cr.openjdk.java.net/~psandoz/valhalla/unsafe-value-jdk/webrev/ <http://cr.openjdk.java.net/~psandoz/valhalla/unsafe-value-jdk/webrev/>
  http://cr.openjdk.java.net/~psandoz/valhalla/unsafe-value-hotspot/webrev/ <http://cr.openjdk.java.net/~psandoz/valhalla/unsafe-value-hotspot/webrev/>

Paul.

> On 6 Jul 2017, at 06:46, Paul Sandoz <paul.sandoz at oracle.com> wrote:
> 
> Sigh, it would help if I apply the patch! Sorry for the noise I will report back after testing with the applied patch.
> 
> Paul.
> 
>> On Jul 5, 2017, at 18:17, Paul Sandoz <paul.sandoz at oracle.com> wrote:
>> 
>> Unfortunately i still observe the same errors with ValueTypeReturnedAsFields being enabled or disabled for the identity JNI function e.g.:
>> 
>> UNSAFE_ENTRY(jobject, Unsafe_GetValueIdentity(JNIEnv *env, jobject unsafe, jobject jvalue)) {
>> oop value = JNIHandles::resolve(jvalue);
>> assert(value->klass()->is_value(), "jvalue must be an value");
>> 
>> return jvalue;
>> } UNSAFE_END
>> 
>> When ValueTypeReturnedAsFields is enabled the error is:
>> 
>> V  [libjvm.dylib+0x102dcd4]  VMError::report_and_die(int, char const*, char const*, __va_list_tag*, Thread*, unsigned char*, void*, void*, char const*, int, unsigned long)+0x5a4
>> V  [libjvm.dylib+0x102e578]  VMError::report_and_die(Thread*, char const*, int, char const*, char const*, __va_list_tag*)+0x78
>> V  [libjvm.dylib+0x699b9f]  report_vm_error(char const*, int, char const*, char const*, ...)+0x19f
>> V  [libjvm.dylib+0xd4d63e]  Monitor::check_prelock_state(Thread*)+0x9e
>> V  [libjvm.dylib+0xd4d28c]  Monitor::lock(Thread*)+0x9c
>> V  [libjvm.dylib+0x4f07b4]  MutexLocker::MutexLocker(Monitor*, Thread*)+0xb4
>> V  [libjvm.dylib+0x4eff15]  MutexLocker::MutexLocker(Monitor*, Thread*)+0x25
>> V  [libjvm.dylib+0xf65082]  SystemDictionary::add_loader_constraint(Symbol*, Handle, Handle, Thread*)+0x192
>> V  [libjvm.dylib+0xf6540b]  SystemDictionary::check_signature_loaders(Symbol*, Handle, Handle, bool, Thread*)+0xfb
>> V  [libjvm.dylib+0xb9cb7d]  LinkResolver::check_method_loader_constraints(LinkInfo const&, methodHandle const&, char const*, Thread*)+0xcd
>> V  [libjvm.dylib+0xb9c0e9]  LinkResolver::resolve_method(LinkInfo const&, Bytecodes::Code, Thread*)+0x649
>> V  [libjvm.dylib+0xb9ba05]  LinkResolver::resolve_method_statically(Bytecodes::Code, constantPoolHandle const&, int, Thread*)+0x2d5
>> V  [libjvm.dylib+0x37497d]  Bytecode_invoke::static_target(Thread*)+0x7d
>> V  [libjvm.dylib+0xeb3a28]  SharedRuntime::store_value_type_fields_to_buf(JavaThread*, long)+0x218
>> v  ~RuntimeStub::store_value_type_fields_to_buf
>> j  runtime.valhalla.valuetypes.UnsafeTest.main([Ljava/lang/String;)V+30
>> 
>> 
>> When ValueTypeReturnedAsFields is disabled a null value is returned. I tried detecting whether the value oop is in the heap with:
>> 
>> Universe::heap()->is_in_reserved(value)
>> 
>> and reallocating but it made no difference. I also started debugging HS but i don’t understand enough about how the template interpreter works to “interpret” the behaviour and track operations on the returned object.
>> 
>> There is something asymmetric about the handling of jobject value arguments and jobject value return.
>> 
>> 
>> Further more, does the creation of a jobject from a value oop require that the value be allocated on the heap? I think so otherwise i get failures for assertions such as:
>> 
>> assert(Universe::heap()->is_in_reserved(obj), "sanity check");
>> 
>> Paul.
>> 
>> 
>>> On 5 Jul 2017, at 10:51, Paul Sandoz <Paul.Sandoz at oracle.com> wrote:
>>> 
>>> 
>>>> On 5 Jul 2017, at 00:33, Roland Westrelin <rwestrel at redhat.com> wrote:
>>>> 
>>>> 
>>>> http://cr.openjdk.java.net/~roland/valhalla/vreturn-improv/webrev.00/
>>>> 
>>>> This patch:
>>>> 
>>>> - reworks the verification logic in
>>>> SharedRuntime::store_value_type_fields_to_buf() to address the crash
>>>> that Paul encountered
>>>> 
>>> 
>>> Thanks. I will verify this week when i update the Unsafe methods to be in sync with Fred’s latest changes.
>>> 
>>> Paul.
>>> 
>>>> - changes the vreturn convention so if we return the klass pointer +
>>>> fields, the klass pointer is tagged by setting its least significant
>>>> bit. This way it's cheaper for the caller to detect if it's getting an
>>>> oop, a buffered value or a list of fields back from the callee. (this
>>>> is based on a discussion with Fred)
>>>> 
>>>> - stores precomputed extended signature and vreturn registers in the
>>>> ValueKlass to not have to compute them every time they are
>>>> needed. This is also something Fred suggested. I considered
>>>> initializaing those fields on first use but came to the conclusion it
>>>> would make things too complicated. For instance the vreturn registers
>>>> are sometimes use at a point where the thread can't safepoint making
>>>> it impossible to use a metadata Array.
>>>> 
>>>> Roland.
>>> 
>> 
> 



More information about the valhalla-dev mailing list