src/share/vm/prims/unsafe.cpp

changeset 9318
576949777967
parent 8638
8b37c5a17316
child 9327
f96fcd9e1e1b
     1.1 --- a/src/share/vm/prims/unsafe.cpp	Thu May 03 18:59:48 2018 +0200
     1.2 +++ b/src/share/vm/prims/unsafe.cpp	Tue Sep 06 13:01:27 2016 +0200
     1.3 @@ -199,37 +199,40 @@
     1.4  
     1.5  // Get/SetObject must be special-cased, since it works with handles.
     1.6  
     1.7 +// We could be accessing the referent field in a reference
     1.8 +// object. If G1 is enabled then we need to register non-null
     1.9 +// referent with the SATB barrier.
    1.10 +
    1.11 +#if INCLUDE_ALL_GCS
    1.12 +static bool is_java_lang_ref_Reference_access(oop o, jlong offset) {
    1.13 +  if (offset == java_lang_ref_Reference::referent_offset && o != NULL) {
    1.14 +    Klass* k = o->klass();
    1.15 +    if (InstanceKlass::cast(k)->reference_type() != REF_NONE) {
    1.16 +      assert(InstanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
    1.17 +      return true;
    1.18 +    }
    1.19 +  }
    1.20 + return false;
    1.21 +}
    1.22 +#endif
    1.23 +
    1.24 +static void ensure_satb_referent_alive(oop o, jlong offset, oop v) {
    1.25 +#if INCLUDE_ALL_GCS
    1.26 +  if (UseG1GC && v != NULL && is_java_lang_ref_Reference_access(o, offset)) {
    1.27 +    G1SATBCardTableModRefBS::enqueue(v);
    1.28 +  }
    1.29 +#endif
    1.30 +}
    1.31 +
    1.32  // The xxx140 variants for backward compatibility do not allow a full-width offset.
    1.33  UNSAFE_ENTRY(jobject, Unsafe_GetObject140(JNIEnv *env, jobject unsafe, jobject obj, jint offset))
    1.34    UnsafeWrapper("Unsafe_GetObject");
    1.35    if (obj == NULL)  THROW_0(vmSymbols::java_lang_NullPointerException());
    1.36    GET_OOP_FIELD(obj, offset, v)
    1.37 -  jobject ret = JNIHandles::make_local(env, v);
    1.38 -#if INCLUDE_ALL_GCS
    1.39 -  // We could be accessing the referent field in a reference
    1.40 -  // object. If G1 is enabled then we need to register a non-null
    1.41 -  // referent with the SATB barrier.
    1.42 -  if (UseG1GC) {
    1.43 -    bool needs_barrier = false;
    1.44  
    1.45 -    if (ret != NULL) {
    1.46 -      if (offset == java_lang_ref_Reference::referent_offset) {
    1.47 -        oop o = JNIHandles::resolve_non_null(obj);
    1.48 -        Klass* k = o->klass();
    1.49 -        if (InstanceKlass::cast(k)->reference_type() != REF_NONE) {
    1.50 -          assert(InstanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
    1.51 -          needs_barrier = true;
    1.52 -        }
    1.53 -      }
    1.54 -    }
    1.55 +  ensure_satb_referent_alive(p, offset, v);
    1.56  
    1.57 -    if (needs_barrier) {
    1.58 -      oop referent = JNIHandles::resolve(ret);
    1.59 -      G1SATBCardTableModRefBS::enqueue(referent);
    1.60 -    }
    1.61 -  }
    1.62 -#endif // INCLUDE_ALL_GCS
    1.63 -  return ret;
    1.64 +  return JNIHandles::make_local(env, v);
    1.65  UNSAFE_END
    1.66  
    1.67  UNSAFE_ENTRY(void, Unsafe_SetObject140(JNIEnv *env, jobject unsafe, jobject obj, jint offset, jobject x_h))
    1.68 @@ -262,32 +265,10 @@
    1.69  UNSAFE_ENTRY(jobject, Unsafe_GetObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset))
    1.70    UnsafeWrapper("Unsafe_GetObject");
    1.71    GET_OOP_FIELD(obj, offset, v)
    1.72 -  jobject ret = JNIHandles::make_local(env, v);
    1.73 -#if INCLUDE_ALL_GCS
    1.74 -  // We could be accessing the referent field in a reference
    1.75 -  // object. If G1 is enabled then we need to register non-null
    1.76 -  // referent with the SATB barrier.
    1.77 -  if (UseG1GC) {
    1.78 -    bool needs_barrier = false;
    1.79  
    1.80 -    if (ret != NULL) {
    1.81 -      if (offset == java_lang_ref_Reference::referent_offset && obj != NULL) {
    1.82 -        oop o = JNIHandles::resolve(obj);
    1.83 -        Klass* k = o->klass();
    1.84 -        if (InstanceKlass::cast(k)->reference_type() != REF_NONE) {
    1.85 -          assert(InstanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
    1.86 -          needs_barrier = true;
    1.87 -        }
    1.88 -      }
    1.89 -    }
    1.90 +  ensure_satb_referent_alive(p, offset, v);
    1.91  
    1.92 -    if (needs_barrier) {
    1.93 -      oop referent = JNIHandles::resolve(ret);
    1.94 -      G1SATBCardTableModRefBS::enqueue(referent);
    1.95 -    }
    1.96 -  }
    1.97 -#endif // INCLUDE_ALL_GCS
    1.98 -  return ret;
    1.99 +  return JNIHandles::make_local(env, v);
   1.100  UNSAFE_END
   1.101  
   1.102  UNSAFE_ENTRY(void, Unsafe_SetObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h))
   1.103 @@ -312,6 +293,9 @@
   1.104    } else {
   1.105      (void)const_cast<oop&>(v = *(volatile oop*) addr);
   1.106    }
   1.107 +
   1.108 +  ensure_satb_referent_alive(p, offset, v);
   1.109 +
   1.110    OrderAccess::acquire();
   1.111    return JNIHandles::make_local(env, v);
   1.112  UNSAFE_END

mercurial