src/hotspot/share/prims/unsafe.cpp
changeset 52220 9c260a6b6471
parent 51444 3e5d28e6de32
child 52981 4eff16f47ae2
equal deleted inserted replaced
52219:151b990e3764 52220:9c260a6b6471
   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)},