--- old/src/share/vm/prims/jni.cpp 2015-10-14 13:54:31.103481185 +0200 +++ new/src/share/vm/prims/jni.cpp 2015-10-14 13:54:30.991483893 +0200 @@ -339,10 +339,11 @@ Handle class_loader (THREAD, JNIHandles::resolve(loaderRef)); if (UsePerfData && !class_loader.is_null()) { + Handle class_loader1 (THREAD, oopDesc::bs()->write_barrier(class_loader())); // check whether the current caller thread holds the lock or not. // If not, increment the corresponding counter if (ObjectSynchronizer:: - query_lock_ownership((JavaThread*)THREAD, class_loader) != + query_lock_ownership((JavaThread*)THREAD, class_loader1) != ObjectSynchronizer::owner_self) { ClassLoader::sync_JNIDefineClassLockFreeCounter()->inc(); } @@ -578,7 +579,11 @@ if (java_lang_Class::is_primitive(sub_mirror) || java_lang_Class::is_primitive(super_mirror)) { jboolean ret = (sub_mirror == super_mirror); - + if (UseShenandoahGC && ret == JNI_FALSE) { + sub_mirror = oopDesc::bs()->read_barrier(sub_mirror); + super_mirror = oopDesc::bs()->read_barrier(super_mirror); + ret = (sub_mirror == super_mirror); + } HOTSPOT_JNI_ISASSIGNABLEFROM_RETURN(ret); return ret; } @@ -820,6 +825,11 @@ oop b = JNIHandles::resolve(r2); jboolean ret = (a == b) ? JNI_TRUE : JNI_FALSE; + if (UseShenandoahGC && ret == JNI_FALSE) { + a = oopDesc::bs()->read_barrier(a); + b = oopDesc::bs()->read_barrier(b); + ret = (a == b) ? JNI_TRUE : JNI_FALSE; + } HOTSPOT_JNI_ISSAMEOBJECT_RETURN(ret); return ret; JNI_END @@ -2062,7 +2072,7 @@ // If G1 is enabled and we are accessing the value of the referent // field in a reference object then we need to register a non-null // referent with the SATB barrier. - if (UseG1GC) { + if (UseG1GC || UseShenandoahGC) { bool needs_barrier = false; if (ret != NULL && @@ -2715,6 +2725,7 @@ EntryProbe; \ /* allocate an chunk of memory in c land */ \ typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \ + a = typeArrayOop(oopDesc::bs()->read_barrier(a)); \ ElementType* result; \ int len = a->length(); \ if (len == 0) { \ @@ -2773,6 +2784,7 @@ JNIWrapper("Release" XSTR(Result) "ArrayElements"); \ EntryProbe; \ typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \ + a = typeArrayOop(oopDesc::bs()->write_barrier(a)); \ int len = a->length(); \ if (len != 0) { /* Empty array: nothing to free or copy. */ \ if ((mode == 0) || (mode == JNI_COMMIT)) { \ @@ -2823,6 +2835,7 @@ EntryProbe; \ DT_VOID_RETURN_MARK(Get##Result##ArrayRegion); \ typeArrayOop src = typeArrayOop(JNIHandles::resolve_non_null(array)); \ + src = typeArrayOop(oopDesc::bs()->read_barrier(src)); \ if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)src->length())) { \ THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \ } else { \ @@ -2873,6 +2886,7 @@ EntryProbe; \ DT_VOID_RETURN_MARK(Set##Result##ArrayRegion); \ typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array)); \ + dst = typeArrayOop(oopDesc::bs()->write_barrier(dst)); \ if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)dst->length())) { \ THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \ } else { \ @@ -3071,7 +3085,7 @@ THROW_(vmSymbols::java_lang_NullPointerException(), JNI_ERR); } - Handle obj(thread, JNIHandles::resolve_non_null(jobj)); + Handle obj(thread, oopDesc::bs()->write_barrier(JNIHandles::resolve_non_null(jobj))); ObjectSynchronizer::jni_enter(obj, CHECK_(JNI_ERR)); ret = JNI_OK; return ret; @@ -3090,7 +3104,7 @@ THROW_(vmSymbols::java_lang_NullPointerException(), JNI_ERR); } - Handle obj(THREAD, JNIHandles::resolve_non_null(jobj)); + Handle obj(THREAD, oopDesc::bs()->write_barrier(JNIHandles::resolve_non_null(jobj))); ObjectSynchronizer::jni_exit(obj(), CHECK_(JNI_ERR)); ret = JNI_OK; @@ -3156,6 +3170,7 @@ *isCopy = JNI_FALSE; } oop a = JNIHandles::resolve_non_null(array); + a = oopDesc::bs()->write_barrier(a); assert(a->is_array(), "just checking"); BasicType type; if (a->is_objArray()) {