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