255 }; |
255 }; |
256 |
256 |
257 // These functions allow a null base pointer with an arbitrary address. |
257 // These functions allow a null base pointer with an arbitrary address. |
258 // But if the base pointer is non-null, the offset should make some sense. |
258 // But if the base pointer is non-null, the offset should make some sense. |
259 // That is, it should be in the range [0, MAX_OBJECT_SIZE]. |
259 // That is, it should be in the range [0, MAX_OBJECT_SIZE]. |
260 UNSAFE_ENTRY(jobject, Unsafe_GetObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset)) { |
260 UNSAFE_ENTRY(jobject, Unsafe_GetReference(JNIEnv *env, jobject unsafe, jobject obj, jlong offset)) { |
261 oop p = JNIHandles::resolve(obj); |
261 oop p = JNIHandles::resolve(obj); |
262 assert_field_offset_sane(p, offset); |
262 assert_field_offset_sane(p, offset); |
263 oop v = HeapAccess<ON_UNKNOWN_OOP_REF>::oop_load_at(p, offset); |
263 oop v = HeapAccess<ON_UNKNOWN_OOP_REF>::oop_load_at(p, offset); |
264 return JNIHandles::make_local(env, v); |
264 return JNIHandles::make_local(env, v); |
265 } UNSAFE_END |
265 } UNSAFE_END |
266 |
266 |
267 UNSAFE_ENTRY(void, Unsafe_PutObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h)) { |
267 UNSAFE_ENTRY(void, Unsafe_PutReference(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h)) { |
268 oop x = JNIHandles::resolve(x_h); |
268 oop x = JNIHandles::resolve(x_h); |
269 oop p = JNIHandles::resolve(obj); |
269 oop p = JNIHandles::resolve(obj); |
270 assert_field_offset_sane(p, offset); |
270 assert_field_offset_sane(p, offset); |
271 HeapAccess<ON_UNKNOWN_OOP_REF>::oop_store_at(p, offset, x); |
271 HeapAccess<ON_UNKNOWN_OOP_REF>::oop_store_at(p, offset, x); |
272 } UNSAFE_END |
272 } UNSAFE_END |
273 |
273 |
274 UNSAFE_ENTRY(jobject, Unsafe_GetObjectVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset)) { |
274 UNSAFE_ENTRY(jobject, Unsafe_GetReferenceVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset)) { |
275 oop p = JNIHandles::resolve(obj); |
275 oop p = JNIHandles::resolve(obj); |
276 assert_field_offset_sane(p, offset); |
276 assert_field_offset_sane(p, offset); |
277 oop v = HeapAccess<MO_SEQ_CST | ON_UNKNOWN_OOP_REF>::oop_load_at(p, offset); |
277 oop v = HeapAccess<MO_SEQ_CST | ON_UNKNOWN_OOP_REF>::oop_load_at(p, offset); |
278 return JNIHandles::make_local(env, v); |
278 return JNIHandles::make_local(env, v); |
279 } UNSAFE_END |
279 } UNSAFE_END |
280 |
280 |
281 UNSAFE_ENTRY(void, Unsafe_PutObjectVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h)) { |
281 UNSAFE_ENTRY(void, Unsafe_PutReferenceVolatile(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject x_h)) { |
282 oop x = JNIHandles::resolve(x_h); |
282 oop x = JNIHandles::resolve(x_h); |
283 oop p = JNIHandles::resolve(obj); |
283 oop p = JNIHandles::resolve(obj); |
284 assert_field_offset_sane(p, offset); |
284 assert_field_offset_sane(p, offset); |
285 HeapAccess<MO_SEQ_CST | ON_UNKNOWN_OOP_REF>::oop_store_at(p, offset, x); |
285 HeapAccess<MO_SEQ_CST | ON_UNKNOWN_OOP_REF>::oop_store_at(p, offset, x); |
286 } UNSAFE_END |
286 } UNSAFE_END |
862 env->Throw(thr); |
862 env->Throw(thr); |
863 } UNSAFE_END |
863 } UNSAFE_END |
864 |
864 |
865 // JSR166 ------------------------------------------------------------------ |
865 // JSR166 ------------------------------------------------------------------ |
866 |
866 |
867 UNSAFE_ENTRY(jobject, Unsafe_CompareAndExchangeObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject e_h, jobject x_h)) { |
867 UNSAFE_ENTRY(jobject, Unsafe_CompareAndExchangeReference(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject e_h, jobject x_h)) { |
868 oop x = JNIHandles::resolve(x_h); |
868 oop x = JNIHandles::resolve(x_h); |
869 oop e = JNIHandles::resolve(e_h); |
869 oop e = JNIHandles::resolve(e_h); |
870 oop p = JNIHandles::resolve(obj); |
870 oop p = JNIHandles::resolve(obj); |
871 assert_field_offset_sane(p, offset); |
871 assert_field_offset_sane(p, offset); |
872 oop res = HeapAccess<ON_UNKNOWN_OOP_REF>::oop_atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e); |
872 oop res = HeapAccess<ON_UNKNOWN_OOP_REF>::oop_atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e); |
893 assert_field_offset_sane(p, offset); |
893 assert_field_offset_sane(p, offset); |
894 return HeapAccess<>::atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e); |
894 return HeapAccess<>::atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e); |
895 } |
895 } |
896 } UNSAFE_END |
896 } UNSAFE_END |
897 |
897 |
898 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSetObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject e_h, jobject x_h)) { |
898 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSetReference(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject e_h, jobject x_h)) { |
899 oop x = JNIHandles::resolve(x_h); |
899 oop x = JNIHandles::resolve(x_h); |
900 oop e = JNIHandles::resolve(e_h); |
900 oop e = JNIHandles::resolve(e_h); |
901 oop p = JNIHandles::resolve(obj); |
901 oop p = JNIHandles::resolve(obj); |
902 assert_field_offset_sane(p, offset); |
902 assert_field_offset_sane(p, offset); |
903 oop ret = HeapAccess<ON_UNKNOWN_OOP_REF>::oop_atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e); |
903 oop ret = HeapAccess<ON_UNKNOWN_OOP_REF>::oop_atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e); |
1032 {CC "get" #Type "Volatile", CC "(" OBJ "J)" #Desc, FN_PTR(Unsafe_Get##Type##Volatile)}, \ |
1032 {CC "get" #Type "Volatile", CC "(" OBJ "J)" #Desc, FN_PTR(Unsafe_Get##Type##Volatile)}, \ |
1033 {CC "put" #Type "Volatile", CC "(" OBJ "J" #Desc ")V", FN_PTR(Unsafe_Put##Type##Volatile)} |
1033 {CC "put" #Type "Volatile", CC "(" OBJ "J" #Desc ")V", FN_PTR(Unsafe_Put##Type##Volatile)} |
1034 |
1034 |
1035 |
1035 |
1036 static JNINativeMethod jdk_internal_misc_Unsafe_methods[] = { |
1036 static JNINativeMethod jdk_internal_misc_Unsafe_methods[] = { |
1037 {CC "getObject", CC "(" OBJ "J)" OBJ "", FN_PTR(Unsafe_GetObject)}, |
1037 {CC "getReference", CC "(" OBJ "J)" OBJ "", FN_PTR(Unsafe_GetReference)}, |
1038 {CC "putObject", CC "(" OBJ "J" OBJ ")V", FN_PTR(Unsafe_PutObject)}, |
1038 {CC "putReference", CC "(" OBJ "J" OBJ ")V", FN_PTR(Unsafe_PutReference)}, |
1039 {CC "getObjectVolatile",CC "(" OBJ "J)" OBJ "", FN_PTR(Unsafe_GetObjectVolatile)}, |
1039 {CC "getReferenceVolatile", CC "(" OBJ "J)" OBJ, FN_PTR(Unsafe_GetReferenceVolatile)}, |
1040 {CC "putObjectVolatile",CC "(" OBJ "J" OBJ ")V", FN_PTR(Unsafe_PutObjectVolatile)}, |
1040 {CC "putReferenceVolatile", CC "(" OBJ "J" OBJ ")V", FN_PTR(Unsafe_PutReferenceVolatile)}, |
1041 |
1041 |
1042 {CC "getUncompressedObject", CC "(" ADR ")" OBJ, FN_PTR(Unsafe_GetUncompressedObject)}, |
1042 {CC "getUncompressedObject", CC "(" ADR ")" OBJ, FN_PTR(Unsafe_GetUncompressedObject)}, |
1043 |
1043 |
1044 DECLARE_GETPUTOOP(Boolean, Z), |
1044 DECLARE_GETPUTOOP(Boolean, Z), |
1045 DECLARE_GETPUTOOP(Byte, B), |
1045 DECLARE_GETPUTOOP(Byte, B), |
1065 {CC "pageSize", CC "()I", FN_PTR(Unsafe_PageSize)}, |
1065 {CC "pageSize", CC "()I", FN_PTR(Unsafe_PageSize)}, |
1066 |
1066 |
1067 {CC "defineClass0", CC "(" DC_Args ")" CLS, FN_PTR(Unsafe_DefineClass0)}, |
1067 {CC "defineClass0", CC "(" DC_Args ")" CLS, FN_PTR(Unsafe_DefineClass0)}, |
1068 {CC "allocateInstance", CC "(" CLS ")" OBJ, FN_PTR(Unsafe_AllocateInstance)}, |
1068 {CC "allocateInstance", CC "(" CLS ")" OBJ, FN_PTR(Unsafe_AllocateInstance)}, |
1069 {CC "throwException", CC "(" THR ")V", FN_PTR(Unsafe_ThrowException)}, |
1069 {CC "throwException", CC "(" THR ")V", FN_PTR(Unsafe_ThrowException)}, |
1070 {CC "compareAndSetObject",CC "(" OBJ "J" OBJ "" OBJ ")Z", FN_PTR(Unsafe_CompareAndSetObject)}, |
1070 {CC "compareAndSetReference",CC "(" OBJ "J" OBJ "" OBJ ")Z", FN_PTR(Unsafe_CompareAndSetReference)}, |
1071 {CC "compareAndSetInt", CC "(" OBJ "J""I""I"")Z", FN_PTR(Unsafe_CompareAndSetInt)}, |
1071 {CC "compareAndSetInt", CC "(" OBJ "J""I""I"")Z", FN_PTR(Unsafe_CompareAndSetInt)}, |
1072 {CC "compareAndSetLong", CC "(" OBJ "J""J""J"")Z", FN_PTR(Unsafe_CompareAndSetLong)}, |
1072 {CC "compareAndSetLong", CC "(" OBJ "J""J""J"")Z", FN_PTR(Unsafe_CompareAndSetLong)}, |
1073 {CC "compareAndExchangeObject", CC "(" OBJ "J" OBJ "" OBJ ")" OBJ, FN_PTR(Unsafe_CompareAndExchangeObject)}, |
1073 {CC "compareAndExchangeReference", CC "(" OBJ "J" OBJ "" OBJ ")" OBJ, FN_PTR(Unsafe_CompareAndExchangeReference)}, |
1074 {CC "compareAndExchangeInt", CC "(" OBJ "J""I""I"")I", FN_PTR(Unsafe_CompareAndExchangeInt)}, |
1074 {CC "compareAndExchangeInt", CC "(" OBJ "J""I""I"")I", FN_PTR(Unsafe_CompareAndExchangeInt)}, |
1075 {CC "compareAndExchangeLong", CC "(" OBJ "J""J""J"")J", FN_PTR(Unsafe_CompareAndExchangeLong)}, |
1075 {CC "compareAndExchangeLong", CC "(" OBJ "J""J""J"")J", FN_PTR(Unsafe_CompareAndExchangeLong)}, |
1076 |
1076 |
1077 {CC "park", CC "(ZJ)V", FN_PTR(Unsafe_Park)}, |
1077 {CC "park", CC "(ZJ)V", FN_PTR(Unsafe_Park)}, |
1078 {CC "unpark", CC "(" OBJ ")V", FN_PTR(Unsafe_Unpark)}, |
1078 {CC "unpark", CC "(" OBJ ")V", FN_PTR(Unsafe_Unpark)}, |