--- old/src/share/vm/prims/jni.cpp 2015-10-08 22:15:56.007104837 +0200 +++ new/src/share/vm/prims/jni.cpp 2015-10-08 22:15:55.956106055 +0200 @@ -336,7 +336,7 @@ } ResourceMark rm(THREAD); ClassFileStream st((u1*) buf, bufLen, NULL); - Handle class_loader (THREAD, JNIHandles::resolve(loaderRef)); + Handle class_loader (THREAD, oopDesc::bs()->write_barrier(JNIHandles::resolve(loaderRef))); if (UsePerfData && !class_loader.is_null()) { // check whether the current caller thread holds the lock or not. @@ -575,6 +575,10 @@ oop sub_mirror = JNIHandles::resolve_non_null(sub); oop super_mirror = JNIHandles::resolve_non_null(super); + + sub_mirror = oopDesc::bs()->write_barrier(sub_mirror); + super_mirror = oopDesc::bs()->write_barrier(super_mirror); + if (java_lang_Class::is_primitive(sub_mirror) || java_lang_Class::is_primitive(super_mirror)) { jboolean ret = (sub_mirror == super_mirror); @@ -817,7 +821,9 @@ HOTSPOT_JNI_ISSAMEOBJECT_ENTRY(env, r1, r2); oop a = JNIHandles::resolve(r1); + a = oopDesc::bs()->write_barrier(a); oop b = JNIHandles::resolve(r2); + b = oopDesc::bs()->write_barrier(b); jboolean ret = (a == b) ? JNI_TRUE : JNI_FALSE; HOTSPOT_JNI_ISSAMEOBJECT_RETURN(ret); @@ -2062,7 +2068,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 && @@ -2467,7 +2473,7 @@ HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(env, string, (uintptr_t *) isCopy); jchar* buf = NULL; oop s = JNIHandles::resolve_non_null(string); - typeArrayOop s_value = java_lang_String::value(s); + typeArrayOop s_value = typeArrayOop(oopDesc::bs()->read_barrier(java_lang_String::value(s))); if (s_value != NULL) { int s_len = java_lang_String::length(s); int s_offset = java_lang_String::offset(s); @@ -2715,6 +2721,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 +2780,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 +2831,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 +2882,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 +3081,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 +3100,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; @@ -3116,6 +3126,7 @@ if (len > 0) { int s_offset = java_lang_String::offset(s); typeArrayOop s_value = java_lang_String::value(s); + s_value = typeArrayOop(oopDesc::bs()->read_barrier(s_value)); memcpy(buf, s_value->char_at_addr(s_offset+start), sizeof(jchar)*len); } } @@ -3156,6 +3167,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()) { @@ -3188,6 +3200,7 @@ oop s = JNIHandles::resolve_non_null(string); int s_len = java_lang_String::length(s); typeArrayOop s_value = java_lang_String::value(s); + s_value = typeArrayOop(oopDesc::bs()->read_barrier(s_value)); int s_offset = java_lang_String::offset(s); const jchar* ret; if (s_len > 0) {