--- a/src/hotspot/share/prims/jni.cpp Wed Apr 04 11:25:26 2018 +0200
+++ b/src/hotspot/share/prims/jni.cpp Wed Apr 04 11:59:47 2018 +0200
@@ -36,6 +36,7 @@
#include "classfile/symbolTable.hpp"
#include "classfile/systemDictionary.hpp"
#include "classfile/vmSymbols.hpp"
+#include "gc/shared/gcLocker.inline.hpp"
#include "interpreter/linkResolver.hpp"
#include "memory/allocation.hpp"
#include "memory/allocation.inline.hpp"
@@ -3145,6 +3146,24 @@
}
JNI_END
+static oop lock_gc_or_pin_object(JavaThread* thread, jobject obj) {
+ if (Universe::heap()->supports_object_pinning()) {
+ const oop o = JNIHandles::resolve_non_null(obj);
+ return Universe::heap()->pin_object(thread, o);
+ } else {
+ GCLocker::lock_critical(thread);
+ return JNIHandles::resolve_non_null(obj);
+ }
+}
+
+static void unlock_gc_or_unpin_object(JavaThread* thread, jobject obj) {
+ if (Universe::heap()->supports_object_pinning()) {
+ const oop o = JNIHandles::resolve_non_null(obj);
+ return Universe::heap()->unpin_object(thread, o);
+ } else {
+ GCLocker::unlock_critical(thread);
+ }
+}
JNI_ENTRY(void*, jni_GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy))
JNIWrapper("GetPrimitiveArrayCritical");
@@ -3152,8 +3171,7 @@
if (isCopy != NULL) {
*isCopy = JNI_FALSE;
}
- oop a = JNIHandles::resolve_non_null(array);
- a = Universe::heap()->pin_object(thread, a);
+ oop a = lock_gc_or_pin_object(thread, array);
assert(a->is_array(), "just checking");
BasicType type;
if (a->is_objArray()) {
@@ -3170,8 +3188,7 @@
JNI_ENTRY(void, jni_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode))
JNIWrapper("ReleasePrimitiveArrayCritical");
HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_ENTRY(env, array, carray, mode);
- oop a = JNIHandles::resolve_non_null(array);
- Universe::heap()->unpin_object(thread, a);
+ unlock_gc_or_unpin_object(thread, array);
HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_RETURN();
JNI_END
@@ -3179,8 +3196,7 @@
JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy))
JNIWrapper("GetStringCritical");
HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(env, string, (uintptr_t *) isCopy);
- oop s = JNIHandles::resolve_non_null(string);
- s = Universe::heap()->pin_object(thread, s);
+ oop s = lock_gc_or_pin_object(thread, string);
typeArrayOop s_value = java_lang_String::value(s);
bool is_latin1 = java_lang_String::is_latin1(s);
if (isCopy != NULL) {
@@ -3217,7 +3233,7 @@
// This assumes that ReleaseStringCritical bookends GetStringCritical.
FREE_C_HEAP_ARRAY(jchar, chars);
}
- Universe::heap()->unpin_object(thread, s);
+ unlock_gc_or_unpin_object(thread, str);
HOTSPOT_JNI_RELEASESTRINGCRITICAL_RETURN();
JNI_END