src/hotspot/share/prims/unsafe.cpp
changeset 59252 623722a6aeb9
parent 59056 15936b142f86
child 59290 97d13893ec3c
equal deleted inserted replaced
59251:4cbfa5077d68 59252:623722a6aeb9
   901 UNSAFE_ENTRY(jobject, Unsafe_CompareAndExchangeReference(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject e_h, jobject x_h)) {
   901 UNSAFE_ENTRY(jobject, Unsafe_CompareAndExchangeReference(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject e_h, jobject x_h)) {
   902   oop x = JNIHandles::resolve(x_h);
   902   oop x = JNIHandles::resolve(x_h);
   903   oop e = JNIHandles::resolve(e_h);
   903   oop e = JNIHandles::resolve(e_h);
   904   oop p = JNIHandles::resolve(obj);
   904   oop p = JNIHandles::resolve(obj);
   905   assert_field_offset_sane(p, offset);
   905   assert_field_offset_sane(p, offset);
   906   oop res = HeapAccess<ON_UNKNOWN_OOP_REF>::oop_atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e);
   906   oop res = HeapAccess<ON_UNKNOWN_OOP_REF>::oop_atomic_cmpxchg_at(p, (ptrdiff_t)offset, e, x);
   907   return JNIHandles::make_local(env, res);
   907   return JNIHandles::make_local(env, res);
   908 } UNSAFE_END
   908 } UNSAFE_END
   909 
   909 
   910 UNSAFE_ENTRY(jint, Unsafe_CompareAndExchangeInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x)) {
   910 UNSAFE_ENTRY(jint, Unsafe_CompareAndExchangeInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x)) {
   911   oop p = JNIHandles::resolve(obj);
   911   oop p = JNIHandles::resolve(obj);
   912   if (p == NULL) {
   912   if (p == NULL) {
   913     volatile jint* addr = (volatile jint*)index_oop_from_field_offset_long(p, offset);
   913     volatile jint* addr = (volatile jint*)index_oop_from_field_offset_long(p, offset);
   914     return RawAccess<>::atomic_cmpxchg(x, addr, e);
   914     return RawAccess<>::atomic_cmpxchg(addr, e, x);
   915   } else {
   915   } else {
   916     assert_field_offset_sane(p, offset);
   916     assert_field_offset_sane(p, offset);
   917     return HeapAccess<>::atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e);
   917     return HeapAccess<>::atomic_cmpxchg_at(p, (ptrdiff_t)offset, e, x);
   918   }
   918   }
   919 } UNSAFE_END
   919 } UNSAFE_END
   920 
   920 
   921 UNSAFE_ENTRY(jlong, Unsafe_CompareAndExchangeLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong e, jlong x)) {
   921 UNSAFE_ENTRY(jlong, Unsafe_CompareAndExchangeLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong e, jlong x)) {
   922   oop p = JNIHandles::resolve(obj);
   922   oop p = JNIHandles::resolve(obj);
   923   if (p == NULL) {
   923   if (p == NULL) {
   924     volatile jlong* addr = (volatile jlong*)index_oop_from_field_offset_long(p, offset);
   924     volatile jlong* addr = (volatile jlong*)index_oop_from_field_offset_long(p, offset);
   925     return RawAccess<>::atomic_cmpxchg(x, addr, e);
   925     return RawAccess<>::atomic_cmpxchg(addr, e, x);
   926   } else {
   926   } else {
   927     assert_field_offset_sane(p, offset);
   927     assert_field_offset_sane(p, offset);
   928     return HeapAccess<>::atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e);
   928     return HeapAccess<>::atomic_cmpxchg_at(p, (ptrdiff_t)offset, e, x);
   929   }
   929   }
   930 } UNSAFE_END
   930 } UNSAFE_END
   931 
   931 
   932 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSetReference(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject e_h, jobject x_h)) {
   932 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSetReference(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject e_h, jobject x_h)) {
   933   oop x = JNIHandles::resolve(x_h);
   933   oop x = JNIHandles::resolve(x_h);
   934   oop e = JNIHandles::resolve(e_h);
   934   oop e = JNIHandles::resolve(e_h);
   935   oop p = JNIHandles::resolve(obj);
   935   oop p = JNIHandles::resolve(obj);
   936   assert_field_offset_sane(p, offset);
   936   assert_field_offset_sane(p, offset);
   937   oop ret = HeapAccess<ON_UNKNOWN_OOP_REF>::oop_atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e);
   937   oop ret = HeapAccess<ON_UNKNOWN_OOP_REF>::oop_atomic_cmpxchg_at(p, (ptrdiff_t)offset, e, x);
   938   return ret == e;
   938   return ret == e;
   939 } UNSAFE_END
   939 } UNSAFE_END
   940 
   940 
   941 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSetInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x)) {
   941 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSetInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x)) {
   942   oop p = JNIHandles::resolve(obj);
   942   oop p = JNIHandles::resolve(obj);
   943   if (p == NULL) {
   943   if (p == NULL) {
   944     volatile jint* addr = (volatile jint*)index_oop_from_field_offset_long(p, offset);
   944     volatile jint* addr = (volatile jint*)index_oop_from_field_offset_long(p, offset);
   945     return RawAccess<>::atomic_cmpxchg(x, addr, e) == e;
   945     return RawAccess<>::atomic_cmpxchg(addr, e, x) == e;
   946   } else {
   946   } else {
   947     assert_field_offset_sane(p, offset);
   947     assert_field_offset_sane(p, offset);
   948     return HeapAccess<>::atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e) == e;
   948     return HeapAccess<>::atomic_cmpxchg_at(p, (ptrdiff_t)offset, e, x) == e;
   949   }
   949   }
   950 } UNSAFE_END
   950 } UNSAFE_END
   951 
   951 
   952 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSetLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong e, jlong x)) {
   952 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSetLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong e, jlong x)) {
   953   oop p = JNIHandles::resolve(obj);
   953   oop p = JNIHandles::resolve(obj);
   954   if (p == NULL) {
   954   if (p == NULL) {
   955     volatile jlong* addr = (volatile jlong*)index_oop_from_field_offset_long(p, offset);
   955     volatile jlong* addr = (volatile jlong*)index_oop_from_field_offset_long(p, offset);
   956     return RawAccess<>::atomic_cmpxchg(x, addr, e) == e;
   956     return RawAccess<>::atomic_cmpxchg(addr, e, x) == e;
   957   } else {
   957   } else {
   958     assert_field_offset_sane(p, offset);
   958     assert_field_offset_sane(p, offset);
   959     return HeapAccess<>::atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e) == e;
   959     return HeapAccess<>::atomic_cmpxchg_at(p, (ptrdiff_t)offset, e, x) == e;
   960   }
   960   }
   961 } UNSAFE_END
   961 } UNSAFE_END
   962 
   962 
   963 static void post_thread_park_event(EventThreadPark* event, const oop obj, jlong timeout_nanos, jlong until_epoch_millis) {
   963 static void post_thread_park_event(EventThreadPark* event, const oop obj, jlong timeout_nanos, jlong until_epoch_millis) {
   964   assert(event != NULL, "invariant");
   964   assert(event != NULL, "invariant");