< prev index next >

src/share/vm/prims/jni.cpp

Print this page
rev 11463 : Backport Traversal GC


2613   JNIWrapper("GetObjectField");
2614 #ifndef USDT2
2615   DTRACE_PROBE3(hotspot_jni, GetObjectField__entry, env, obj, fieldID);
2616 #else /* USDT2 */
2617   HOTSPOT_JNI_GETOBJECTFIELD_ENTRY(
2618                                    env, obj, (uintptr_t) fieldID);
2619 #endif /* USDT2 */
2620   oop o = JNIHandles::resolve_non_null(obj);
2621   Klass* k = o->klass();
2622   int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
2623   // Keep JVMTI addition small and only check enabled flag here.
2624   // jni_GetField_probe() assumes that is okay to create handles.
2625   if (JvmtiExport::should_post_field_access()) {
2626     o = JvmtiExport::jni_GetField_probe(thread, obj, o, k, fieldID, false);
2627   }
2628   jobject ret = JNIHandles::make_local(env, o->obj_field(offset));
2629 #if INCLUDE_ALL_GCS
2630   // If G1 is enabled and we are accessing the value of the referent
2631   // field in a reference object then we need to register a non-null
2632   // referent with the SATB barrier.
2633   if (UseG1GC || (UseShenandoahGC && ShenandoahSATBBarrier)) {
2634     bool needs_barrier = false;
2635 
2636     if (ret != NULL &&
2637         offset == java_lang_ref_Reference::referent_offset &&
2638         InstanceKlass::cast(k)->reference_type() != REF_NONE) {
2639       assert(InstanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
2640       needs_barrier = true;
2641     }
2642 
2643     if (needs_barrier) {
2644       oop referent = JNIHandles::resolve(ret);
2645       G1SATBCardTableModRefBS::enqueue(referent);
2646     }
2647   }
2648 #endif // INCLUDE_ALL_GCS
2649 #ifndef USDT2
2650   DTRACE_PROBE1(hotspot_jni, GetObjectField__return, ret);
2651 #else /* USDT2 */
2652 HOTSPOT_JNI_GETOBJECTFIELD_RETURN(
2653                                   ret);




2613   JNIWrapper("GetObjectField");
2614 #ifndef USDT2
2615   DTRACE_PROBE3(hotspot_jni, GetObjectField__entry, env, obj, fieldID);
2616 #else /* USDT2 */
2617   HOTSPOT_JNI_GETOBJECTFIELD_ENTRY(
2618                                    env, obj, (uintptr_t) fieldID);
2619 #endif /* USDT2 */
2620   oop o = JNIHandles::resolve_non_null(obj);
2621   Klass* k = o->klass();
2622   int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
2623   // Keep JVMTI addition small and only check enabled flag here.
2624   // jni_GetField_probe() assumes that is okay to create handles.
2625   if (JvmtiExport::should_post_field_access()) {
2626     o = JvmtiExport::jni_GetField_probe(thread, obj, o, k, fieldID, false);
2627   }
2628   jobject ret = JNIHandles::make_local(env, o->obj_field(offset));
2629 #if INCLUDE_ALL_GCS
2630   // If G1 is enabled and we are accessing the value of the referent
2631   // field in a reference object then we need to register a non-null
2632   // referent with the SATB barrier.
2633   if (UseG1GC || (UseShenandoahGC && ShenandoahKeepAliveBarrier)) {
2634     bool needs_barrier = false;
2635 
2636     if (ret != NULL &&
2637         offset == java_lang_ref_Reference::referent_offset &&
2638         InstanceKlass::cast(k)->reference_type() != REF_NONE) {
2639       assert(InstanceKlass::cast(k)->is_subclass_of(SystemDictionary::Reference_klass()), "sanity");
2640       needs_barrier = true;
2641     }
2642 
2643     if (needs_barrier) {
2644       oop referent = JNIHandles::resolve(ret);
2645       G1SATBCardTableModRefBS::enqueue(referent);
2646     }
2647   }
2648 #endif // INCLUDE_ALL_GCS
2649 #ifndef USDT2
2650   DTRACE_PROBE1(hotspot_jni, GetObjectField__return, ret);
2651 #else /* USDT2 */
2652 HOTSPOT_JNI_GETOBJECTFIELD_RETURN(
2653                                   ret);


< prev index next >