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


3167       // as_utf8_string null-terminates the result string
3168     } else {
3169       // JDK null-terminates the buffer even in len is zero
3170       if (buf != NULL) {
3171         buf[0] = 0;
3172       }
3173     }
3174   }
3175 JNI_END
3176 
3177 
3178 JNI_ENTRY(void*, jni_GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy))
3179   JNIWrapper("GetPrimitiveArrayCritical");
3180  HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_ENTRY(env, array, (uintptr_t *) isCopy);
3181   GCLocker::lock_critical(thread);
3182   if (isCopy != NULL) {
3183     *isCopy = JNI_FALSE;
3184   }
3185   oop a = JNIHandles::resolve_non_null(array);
3186   a = oopDesc::bs()->write_barrier(a);

3187   assert(a->is_array(), "just checking");
3188   BasicType type;
3189   if (a->is_objArray()) {
3190     type = T_OBJECT;
3191   } else {
3192     type = TypeArrayKlass::cast(a->klass())->element_type();
3193   }
3194   void* ret = arrayOop(a)->base(type);
3195  HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_RETURN(ret);
3196   return ret;
3197 JNI_END
3198 
3199 
3200 JNI_ENTRY(void, jni_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode))
3201   JNIWrapper("ReleasePrimitiveArrayCritical");
3202   HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_ENTRY(env, array, carray, mode);
3203   // The array, carray and mode arguments are ignored















3204   GCLocker::unlock_critical(thread);
3205 HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_RETURN();
3206 JNI_END
3207 
3208 
3209 JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy))
3210   JNIWrapper("GetStringCritical");
3211   HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(env, string, (uintptr_t *) isCopy);
3212   GCLocker::lock_critical(thread);
3213   oop s = JNIHandles::resolve_non_null(string);


3214   typeArrayOop s_value = java_lang_String::value(s);
3215   bool is_latin1 = java_lang_String::is_latin1(s);
3216   if (isCopy != NULL) {
3217     *isCopy = is_latin1 ? JNI_TRUE : JNI_FALSE;
3218   }
3219   jchar* ret;
3220   if (!is_latin1) {
3221     ret = (jchar*) s_value->base(T_CHAR);
3222   } else {
3223     // Inflate latin1 encoded string to UTF16
3224     int s_len = java_lang_String::length(s);
3225     ret = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal);  // add one for zero termination
3226     /* JNI Specification states return NULL on OOM */
3227     if (ret != NULL) {
3228       for (int i = 0; i < s_len; i++) {
3229         ret[i] = ((jchar) s_value->byte_at(i)) & 0xff;
3230       }
3231       ret[s_len] = 0;
3232     }
3233   }
3234  HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN((uint16_t *) ret);
3235   return ret;
3236 JNI_END
3237 
3238 
3239 JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars))
3240   JNIWrapper("ReleaseStringCritical");
3241   HOTSPOT_JNI_RELEASESTRINGCRITICAL_ENTRY(env, str, (uint16_t *) chars);
3242   // The str and chars arguments are ignored for UTF16 strings
3243   oop s = JNIHandles::resolve_non_null(str);


3244   bool is_latin1 = java_lang_String::is_latin1(s);
3245   if (is_latin1) {
3246     // For latin1 string, free jchar array allocated by earlier call to GetStringCritical.
3247     // This assumes that ReleaseStringCritical bookends GetStringCritical.
3248     FREE_C_HEAP_ARRAY(jchar, chars);
3249   }
3250   GCLocker::unlock_critical(thread);
3251 HOTSPOT_JNI_RELEASESTRINGCRITICAL_RETURN();
3252 JNI_END
3253 
3254 
3255 JNI_ENTRY(jweak, jni_NewWeakGlobalRef(JNIEnv *env, jobject ref))
3256   JNIWrapper("jni_NewWeakGlobalRef");
3257  HOTSPOT_JNI_NEWWEAKGLOBALREF_ENTRY(env, ref);
3258   Handle ref_handle(thread, JNIHandles::resolve(ref));
3259   jweak ret = JNIHandles::make_weak_global(ref_handle);
3260  HOTSPOT_JNI_NEWWEAKGLOBALREF_RETURN(ret);
3261   return ret;
3262 JNI_END
3263 




3167       // as_utf8_string null-terminates the result string
3168     } else {
3169       // JDK null-terminates the buffer even in len is zero
3170       if (buf != NULL) {
3171         buf[0] = 0;
3172       }
3173     }
3174   }
3175 JNI_END
3176 
3177 
3178 JNI_ENTRY(void*, jni_GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy))
3179   JNIWrapper("GetPrimitiveArrayCritical");
3180  HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_ENTRY(env, array, (uintptr_t *) isCopy);
3181   GCLocker::lock_critical(thread);
3182   if (isCopy != NULL) {
3183     *isCopy = JNI_FALSE;
3184   }
3185   oop a = JNIHandles::resolve_non_null(array);
3186   a = oopDesc::bs()->write_barrier(a);
3187   Universe::heap()->enter_critical(a);
3188   assert(a->is_array(), "just checking");
3189   BasicType type;
3190   if (a->is_objArray()) {
3191     type = T_OBJECT;
3192   } else {
3193     type = TypeArrayKlass::cast(a->klass())->element_type();
3194   }
3195   void* ret = arrayOop(a)->base(type);
3196  HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_RETURN(ret);
3197   return ret;
3198 JNI_END
3199 
3200 
3201 JNI_ENTRY(void, jni_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode))
3202   JNIWrapper("ReleasePrimitiveArrayCritical");
3203   HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_ENTRY(env, array, carray, mode);
3204   // The array, carray and mode arguments are ignored
3205   oop a = JNIHandles::resolve_non_null(array);
3206   a = oopDesc::bs()->read_barrier(a);
3207 #ifdef ASSERT
3208   assert(a->is_array(), "just checking");
3209   BasicType type;
3210   if (a->is_objArray()) {
3211     type = T_OBJECT;
3212   } else {
3213     type = TypeArrayKlass::cast(a->klass())->element_type();
3214   }
3215   void* ret = arrayOop(a)->base(type);
3216   assert(ret == carray, "check array not moved");
3217 #endif
3218 
3219   Universe::heap()->exit_critical(a);
3220   GCLocker::unlock_critical(thread);
3221 HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_RETURN();
3222 JNI_END
3223 
3224 
3225 JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy))
3226   JNIWrapper("GetStringCritical");
3227   HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(env, string, (uintptr_t *) isCopy);
3228   GCLocker::lock_critical(thread);
3229   oop s = JNIHandles::resolve_non_null(string);
3230   s = oopDesc::bs()->write_barrier(s);
3231   Universe::heap()->enter_critical(s);
3232   typeArrayOop s_value = java_lang_String::value(s);
3233   bool is_latin1 = java_lang_String::is_latin1(s);
3234   if (isCopy != NULL) {
3235     *isCopy = is_latin1 ? JNI_TRUE : JNI_FALSE;
3236   }
3237   jchar* ret;
3238   if (!is_latin1) {
3239     ret = (jchar*) s_value->base(T_CHAR);
3240   } else {
3241     // Inflate latin1 encoded string to UTF16
3242     int s_len = java_lang_String::length(s);
3243     ret = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal);  // add one for zero termination
3244     /* JNI Specification states return NULL on OOM */
3245     if (ret != NULL) {
3246       for (int i = 0; i < s_len; i++) {
3247         ret[i] = ((jchar) s_value->byte_at(i)) & 0xff;
3248       }
3249       ret[s_len] = 0;
3250     }
3251   }
3252  HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN((uint16_t *) ret);
3253   return ret;
3254 JNI_END
3255 
3256 
3257 JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars))
3258   JNIWrapper("ReleaseStringCritical");
3259   HOTSPOT_JNI_RELEASESTRINGCRITICAL_ENTRY(env, str, (uint16_t *) chars);
3260   // The str and chars arguments are ignored for UTF16 strings
3261   oop s = JNIHandles::resolve_non_null(str);
3262   s = oopDesc::bs()->read_barrier(s);
3263   Universe::heap()->exit_critical(s);
3264   bool is_latin1 = java_lang_String::is_latin1(s);
3265   if (is_latin1) {
3266     // For latin1 string, free jchar array allocated by earlier call to GetStringCritical.
3267     // This assumes that ReleaseStringCritical bookends GetStringCritical.
3268     FREE_C_HEAP_ARRAY(jchar, chars);
3269   }
3270   GCLocker::unlock_critical(thread);
3271 HOTSPOT_JNI_RELEASESTRINGCRITICAL_RETURN();
3272 JNI_END
3273 
3274 
3275 JNI_ENTRY(jweak, jni_NewWeakGlobalRef(JNIEnv *env, jobject ref))
3276   JNIWrapper("jni_NewWeakGlobalRef");
3277  HOTSPOT_JNI_NEWWEAKGLOBALREF_ENTRY(env, ref);
3278   Handle ref_handle(thread, JNIHandles::resolve(ref));
3279   jweak ret = JNIHandles::make_weak_global(ref_handle);
3280  HOTSPOT_JNI_NEWWEAKGLOBALREF_RETURN(ret);
3281   return ret;
3282 JNI_END
3283 


< prev index next >