< prev index next >
src/share/vm/prims/jni.cpp
Print this page
*** 334,344 ****
}
class_name = SymbolTable::new_symbol(name, CHECK_NULL);
}
ResourceMark rm(THREAD);
ClassFileStream st((u1*) buf, bufLen, NULL);
! Handle class_loader (THREAD, JNIHandles::resolve(loaderRef));
if (UsePerfData && !class_loader.is_null()) {
// check whether the current caller thread holds the lock or not.
// If not, increment the corresponding counter
if (ObjectSynchronizer::
--- 334,344 ----
}
class_name = SymbolTable::new_symbol(name, CHECK_NULL);
}
ResourceMark rm(THREAD);
ClassFileStream st((u1*) buf, bufLen, NULL);
! Handle class_loader (THREAD, oopDesc::bs()->write_barrier(JNIHandles::resolve(loaderRef)));
if (UsePerfData && !class_loader.is_null()) {
// check whether the current caller thread holds the lock or not.
// If not, increment the corresponding counter
if (ObjectSynchronizer::
*** 573,582 ****
--- 573,586 ----
HOTSPOT_JNI_ISASSIGNABLEFROM_ENTRY(env, sub, super);
oop sub_mirror = JNIHandles::resolve_non_null(sub);
oop super_mirror = JNIHandles::resolve_non_null(super);
+
+ sub_mirror = oopDesc::bs()->write_barrier(sub_mirror);
+ super_mirror = oopDesc::bs()->write_barrier(super_mirror);
+
if (java_lang_Class::is_primitive(sub_mirror) ||
java_lang_Class::is_primitive(super_mirror)) {
jboolean ret = (sub_mirror == super_mirror);
HOTSPOT_JNI_ISASSIGNABLEFROM_RETURN(ret);
*** 815,825 ****
--- 819,831 ----
JNIWrapper("IsSameObject");
HOTSPOT_JNI_ISSAMEOBJECT_ENTRY(env, r1, r2);
oop a = JNIHandles::resolve(r1);
+ a = oopDesc::bs()->write_barrier(a);
oop b = JNIHandles::resolve(r2);
+ b = oopDesc::bs()->write_barrier(b);
jboolean ret = (a == b) ? JNI_TRUE : JNI_FALSE;
HOTSPOT_JNI_ISSAMEOBJECT_RETURN(ret);
return ret;
JNI_END
*** 2060,2070 ****
jobject ret = JNIHandles::make_local(env, o->obj_field(offset));
#if INCLUDE_ALL_GCS
// If G1 is enabled and we are accessing the value of the referent
// field in a reference object then we need to register a non-null
// referent with the SATB barrier.
! if (UseG1GC) {
bool needs_barrier = false;
if (ret != NULL &&
offset == java_lang_ref_Reference::referent_offset &&
InstanceKlass::cast(k)->reference_type() != REF_NONE) {
--- 2066,2076 ----
jobject ret = JNIHandles::make_local(env, o->obj_field(offset));
#if INCLUDE_ALL_GCS
// If G1 is enabled and we are accessing the value of the referent
// field in a reference object then we need to register a non-null
// referent with the SATB barrier.
! if (UseG1GC || UseShenandoahGC) {
bool needs_barrier = false;
if (ret != NULL &&
offset == java_lang_ref_Reference::referent_offset &&
InstanceKlass::cast(k)->reference_type() != REF_NONE) {
*** 2465,2475 ****
JNIEnv *env, jstring string, jboolean *isCopy))
JNIWrapper("GetStringChars");
HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(env, string, (uintptr_t *) isCopy);
jchar* buf = NULL;
oop s = JNIHandles::resolve_non_null(string);
! typeArrayOop s_value = java_lang_String::value(s);
if (s_value != NULL) {
int s_len = java_lang_String::length(s);
int s_offset = java_lang_String::offset(s);
buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal); // add one for zero termination
/* JNI Specification states return NULL on OOM */
--- 2471,2481 ----
JNIEnv *env, jstring string, jboolean *isCopy))
JNIWrapper("GetStringChars");
HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(env, string, (uintptr_t *) isCopy);
jchar* buf = NULL;
oop s = JNIHandles::resolve_non_null(string);
! typeArrayOop s_value = typeArrayOop(oopDesc::bs()->read_barrier(java_lang_String::value(s)));
if (s_value != NULL) {
int s_len = java_lang_String::length(s);
int s_offset = java_lang_String::offset(s);
buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal); // add one for zero termination
/* JNI Specification states return NULL on OOM */
*** 2713,2722 ****
--- 2719,2729 ----
jni_Get##Result##ArrayElements(JNIEnv *env, ElementType##Array array, jboolean *isCopy)) \
JNIWrapper("Get" XSTR(Result) "ArrayElements"); \
EntryProbe; \
/* allocate an chunk of memory in c land */ \
typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
+ a = typeArrayOop(oopDesc::bs()->read_barrier(a)); \
ElementType* result; \
int len = a->length(); \
if (len == 0) { \
/* Empty array: legal but useless, can't return NULL. \
* Return a pointer to something useless. \
*** 2771,2780 ****
--- 2778,2788 ----
jni_Release##Result##ArrayElements(JNIEnv *env, ElementType##Array array, \
ElementType *buf, jint mode)) \
JNIWrapper("Release" XSTR(Result) "ArrayElements"); \
EntryProbe; \
typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
+ a = typeArrayOop(oopDesc::bs()->write_barrier(a)); \
int len = a->length(); \
if (len != 0) { /* Empty array: nothing to free or copy. */ \
if ((mode == 0) || (mode == JNI_COMMIT)) { \
memcpy(a->Tag##_at_addr(0), buf, sizeof(ElementType)*len); \
} \
*** 2821,2830 ****
--- 2829,2839 ----
jsize len, ElementType *buf)) \
JNIWrapper("Get" XSTR(Result) "ArrayRegion"); \
EntryProbe; \
DT_VOID_RETURN_MARK(Get##Result##ArrayRegion); \
typeArrayOop src = typeArrayOop(JNIHandles::resolve_non_null(array)); \
+ src = typeArrayOop(oopDesc::bs()->read_barrier(src)); \
if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)src->length())) { \
THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
} else { \
if (len > 0) { \
int sc = TypeArrayKlass::cast(src->klass())->log2_element_size(); \
*** 2871,2880 ****
--- 2880,2890 ----
jsize len, const ElementType *buf)) \
JNIWrapper("Set" XSTR(Result) "ArrayRegion"); \
EntryProbe; \
DT_VOID_RETURN_MARK(Set##Result##ArrayRegion); \
typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array)); \
+ dst = typeArrayOop(oopDesc::bs()->write_barrier(dst)); \
if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)dst->length())) { \
THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
} else { \
if (len > 0) { \
int sc = TypeArrayKlass::cast(dst->klass())->log2_element_size(); \
*** 3069,3079 ****
// If the object is null, we can't do anything with it
if (jobj == NULL) {
THROW_(vmSymbols::java_lang_NullPointerException(), JNI_ERR);
}
! Handle obj(thread, JNIHandles::resolve_non_null(jobj));
ObjectSynchronizer::jni_enter(obj, CHECK_(JNI_ERR));
ret = JNI_OK;
return ret;
JNI_END
--- 3079,3089 ----
// If the object is null, we can't do anything with it
if (jobj == NULL) {
THROW_(vmSymbols::java_lang_NullPointerException(), JNI_ERR);
}
! Handle obj(thread, oopDesc::bs()->write_barrier(JNIHandles::resolve_non_null(jobj)));
ObjectSynchronizer::jni_enter(obj, CHECK_(JNI_ERR));
ret = JNI_OK;
return ret;
JNI_END
*** 3088,3098 ****
// Don't do anything with a null object
if (jobj == NULL) {
THROW_(vmSymbols::java_lang_NullPointerException(), JNI_ERR);
}
! Handle obj(THREAD, JNIHandles::resolve_non_null(jobj));
ObjectSynchronizer::jni_exit(obj(), CHECK_(JNI_ERR));
ret = JNI_OK;
return ret;
JNI_END
--- 3098,3108 ----
// Don't do anything with a null object
if (jobj == NULL) {
THROW_(vmSymbols::java_lang_NullPointerException(), JNI_ERR);
}
! Handle obj(THREAD, oopDesc::bs()->write_barrier(JNIHandles::resolve_non_null(jobj)));
ObjectSynchronizer::jni_exit(obj(), CHECK_(JNI_ERR));
ret = JNI_OK;
return ret;
JNI_END
*** 3114,3123 ****
--- 3124,3134 ----
THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
} else {
if (len > 0) {
int s_offset = java_lang_String::offset(s);
typeArrayOop s_value = java_lang_String::value(s);
+ s_value = typeArrayOop(oopDesc::bs()->read_barrier(s_value));
memcpy(buf, s_value->char_at_addr(s_offset+start), sizeof(jchar)*len);
}
}
JNI_END
*** 3154,3163 ****
--- 3165,3175 ----
GC_locker::lock_critical(thread);
if (isCopy != NULL) {
*isCopy = JNI_FALSE;
}
oop a = JNIHandles::resolve_non_null(array);
+ a = oopDesc::bs()->write_barrier(a);
assert(a->is_array(), "just checking");
BasicType type;
if (a->is_objArray()) {
type = T_OBJECT;
} else {
*** 3186,3195 ****
--- 3198,3208 ----
*isCopy = JNI_FALSE;
}
oop s = JNIHandles::resolve_non_null(string);
int s_len = java_lang_String::length(s);
typeArrayOop s_value = java_lang_String::value(s);
+ s_value = typeArrayOop(oopDesc::bs()->read_barrier(s_value));
int s_offset = java_lang_String::offset(s);
const jchar* ret;
if (s_len > 0) {
ret = s_value->char_at_addr(s_offset);
} else {
< prev index next >