< 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,3191 ****
--- 3182,3192 ----
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,3218 ****
--- 3200,3236 ----
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,3248 ****
--- 3257,3268 ----
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 >