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