src/share/vm/prims/jni.cpp

Print this page
rev 2241 : [mq]: jni-read-barrier
rev 2242 : [mq]: reflection-unsafe-read-barrier

*** 1722,1731 **** --- 1722,1750 ---- // jni_GetField_probe() assumes that is okay to create handles. if (JvmtiExport::should_post_field_access()) { o = JvmtiExport::jni_GetField_probe(thread, obj, o, k, fieldID, false); } jobject ret = JNIHandles::make_local(env, o->obj_field(offset)); + #ifndef SERIALGC + // If G1 is enabled and we are accessing the value of the referent + // field in a reference object then we need to register the + // referent with the SATB barrier. + if (UseG1GC) { + bool needs_barrier = false; + + if (offset == java_lang_ref_Reference::referent_offset && + instanceKlass::cast(k)->reference_type() != REF_NONE) { + assert(instanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity"); + needs_barrier = true; + } + + if (needs_barrier) { + BarrierSet* bs = Universe::heap()->barrier_set(); + bs->write_ref_field_pre((oop*)o->obj_field_addr<oop>(offset), JNIHandles::resolve(ret)); + } + } + #endif // SERIALGC DTRACE_PROBE1(hotspot_jni, GetObjectField__return, ret); return ret; JNI_END