< prev index next >

src/share/vm/prims/jni.cpp

Print this page
rev 12117 : Pin regions that contain JNI critical regions, instead of bail-and-retry protocol.

@@ -3182,10 +3182,11 @@
   if (isCopy != NULL) {
     *isCopy = JNI_FALSE;
   }
   oop a = JNIHandles::resolve_non_null(array);
   a = oopDesc::bs()->write_barrier(a);
+  Universe::heap()->enter_critical(a);
   assert(a->is_array(), "just checking");
   BasicType type;
   if (a->is_objArray()) {
     type = T_OBJECT;
   } else {

@@ -3199,20 +3200,37 @@
 
 JNI_ENTRY(void, jni_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode))
   JNIWrapper("ReleasePrimitiveArrayCritical");
   HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_ENTRY(env, array, carray, mode);
   // The array, carray and mode arguments are ignored
+  oop a = JNIHandles::resolve_non_null(array);
+  a = oopDesc::bs()->read_barrier(a);
+#ifdef ASSERT
+  assert(a->is_array(), "just checking");
+  BasicType type;
+  if (a->is_objArray()) {
+    type = T_OBJECT;
+  } else {
+    type = TypeArrayKlass::cast(a->klass())->element_type();
+  }
+  void* ret = arrayOop(a)->base(type);
+  assert(ret == carray, "check array not moved");
+#endif
+
+  Universe::heap()->exit_critical(a);
   GCLocker::unlock_critical(thread);
 HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_RETURN();
 JNI_END
 
 
 JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy))
   JNIWrapper("GetStringCritical");
   HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(env, string, (uintptr_t *) isCopy);
   GCLocker::lock_critical(thread);
   oop s = JNIHandles::resolve_non_null(string);
+  s = oopDesc::bs()->write_barrier(s);
+  Universe::heap()->enter_critical(s);
   typeArrayOop s_value = java_lang_String::value(s);
   bool is_latin1 = java_lang_String::is_latin1(s);
   if (isCopy != NULL) {
     *isCopy = is_latin1 ? JNI_TRUE : JNI_FALSE;
   }

@@ -3239,10 +3257,12 @@
 JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars))
   JNIWrapper("ReleaseStringCritical");
   HOTSPOT_JNI_RELEASESTRINGCRITICAL_ENTRY(env, str, (uint16_t *) chars);
   // The str and chars arguments are ignored for UTF16 strings
   oop s = JNIHandles::resolve_non_null(str);
+  s = oopDesc::bs()->read_barrier(s);
+  Universe::heap()->exit_critical(s);
   bool is_latin1 = java_lang_String::is_latin1(s);
   if (is_latin1) {
     // For latin1 string, free jchar array allocated by earlier call to GetStringCritical.
     // This assumes that ReleaseStringCritical bookends GetStringCritical.
     FREE_C_HEAP_ARRAY(jchar, chars);
< prev index next >