< 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 >