< prev index next >

src/hotspot/share/prims/unsafe.cpp

Print this page




 886 
 887   // let caller initialize it as needed...
 888 
 889   return (jclass) res_jh;
 890 } UNSAFE_END
 891 
 892 
 893 
 894 UNSAFE_ENTRY(void, Unsafe_ThrowException(JNIEnv *env, jobject unsafe, jthrowable thr)) {
 895   ThreadToNativeFromVM ttnfv(thread);
 896   env->Throw(thr);
 897 } UNSAFE_END
 898 
 899 // JSR166 ------------------------------------------------------------------
 900 
 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);
 903   oop e = JNIHandles::resolve(e_h);
 904   oop p = JNIHandles::resolve(obj);
 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);
 907   return JNIHandles::make_local(env, res);
 908 } UNSAFE_END
 909 
 910 UNSAFE_ENTRY(jint, Unsafe_CompareAndExchangeInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x)) {
 911   oop p = JNIHandles::resolve(obj);
 912   if (p == NULL) {
 913     volatile jint* addr = (volatile jint*)index_oop_from_field_offset_long(p, offset);
 914     return RawAccess<>::atomic_cmpxchg(x, addr, e);
 915   } else {
 916     assert_field_offset_sane(p, offset);
 917     return HeapAccess<>::atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e);
 918   }
 919 } UNSAFE_END
 920 
 921 UNSAFE_ENTRY(jlong, Unsafe_CompareAndExchangeLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong e, jlong x)) {
 922   oop p = JNIHandles::resolve(obj);
 923   if (p == NULL) {
 924     volatile jlong* addr = (volatile jlong*)index_oop_from_field_offset_long(p, offset);
 925     return RawAccess<>::atomic_cmpxchg(x, addr, e);
 926   } else {
 927     assert_field_offset_sane(p, offset);
 928     return HeapAccess<>::atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e);
 929   }
 930 } UNSAFE_END
 931 
 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);
 934   oop e = JNIHandles::resolve(e_h);
 935   oop p = JNIHandles::resolve(obj);
 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);
 938   return ret == e;
 939 } UNSAFE_END
 940 
 941 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSetInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x)) {
 942   oop p = JNIHandles::resolve(obj);
 943   if (p == NULL) {
 944     volatile jint* addr = (volatile jint*)index_oop_from_field_offset_long(p, offset);
 945     return RawAccess<>::atomic_cmpxchg(x, addr, e) == e;
 946   } else {
 947     assert_field_offset_sane(p, offset);
 948     return HeapAccess<>::atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e) == e;
 949   }
 950 } UNSAFE_END
 951 
 952 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSetLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong e, jlong x)) {
 953   oop p = JNIHandles::resolve(obj);
 954   if (p == NULL) {
 955     volatile jlong* addr = (volatile jlong*)index_oop_from_field_offset_long(p, offset);
 956     return RawAccess<>::atomic_cmpxchg(x, addr, e) == e;
 957   } else {
 958     assert_field_offset_sane(p, offset);
 959     return HeapAccess<>::atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e) == e;
 960   }
 961 } UNSAFE_END
 962 
 963 static void post_thread_park_event(EventThreadPark* event, const oop obj, jlong timeout_nanos, jlong until_epoch_millis) {
 964   assert(event != NULL, "invariant");
 965   assert(event->should_commit(), "invariant");
 966   event->set_parkedClass((obj != NULL) ? obj->klass() : NULL);
 967   event->set_timeout(timeout_nanos);
 968   event->set_until(until_epoch_millis);
 969   event->set_address((obj != NULL) ? (u8)cast_from_oop<uintptr_t>(obj) : 0);
 970   event->commit();
 971 }
 972 
 973 UNSAFE_ENTRY(void, Unsafe_Park(JNIEnv *env, jobject unsafe, jboolean isAbsolute, jlong time)) {
 974   HOTSPOT_THREAD_PARK_BEGIN((uintptr_t) thread->parker(), (int) isAbsolute, time);
 975   EventThreadPark event;
 976 
 977   JavaThreadParkedState jtps(thread, time != 0);
 978   thread->parker()->park(isAbsolute != 0, time);
 979   if (event.should_commit()) {




 886 
 887   // let caller initialize it as needed...
 888 
 889   return (jclass) res_jh;
 890 } UNSAFE_END
 891 
 892 
 893 
 894 UNSAFE_ENTRY(void, Unsafe_ThrowException(JNIEnv *env, jobject unsafe, jthrowable thr)) {
 895   ThreadToNativeFromVM ttnfv(thread);
 896   env->Throw(thr);
 897 } UNSAFE_END
 898 
 899 // JSR166 ------------------------------------------------------------------
 900 
 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);
 903   oop e = JNIHandles::resolve(e_h);
 904   oop p = JNIHandles::resolve(obj);
 905   assert_field_offset_sane(p, offset);
 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);
 908 } UNSAFE_END
 909 
 910 UNSAFE_ENTRY(jint, Unsafe_CompareAndExchangeInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x)) {
 911   oop p = JNIHandles::resolve(obj);
 912   if (p == NULL) {
 913     volatile jint* addr = (volatile jint*)index_oop_from_field_offset_long(p, offset);
 914     return RawAccess<>::atomic_cmpxchg(addr, e, x);
 915   } else {
 916     assert_field_offset_sane(p, offset);
 917     return HeapAccess<>::atomic_cmpxchg_at(p, (ptrdiff_t)offset, e, x);
 918   }
 919 } UNSAFE_END
 920 
 921 UNSAFE_ENTRY(jlong, Unsafe_CompareAndExchangeLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong e, jlong x)) {
 922   oop p = JNIHandles::resolve(obj);
 923   if (p == NULL) {
 924     volatile jlong* addr = (volatile jlong*)index_oop_from_field_offset_long(p, offset);
 925     return RawAccess<>::atomic_cmpxchg(addr, e, x);
 926   } else {
 927     assert_field_offset_sane(p, offset);
 928     return HeapAccess<>::atomic_cmpxchg_at(p, (ptrdiff_t)offset, e, x);
 929   }
 930 } UNSAFE_END
 931 
 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);
 934   oop e = JNIHandles::resolve(e_h);
 935   oop p = JNIHandles::resolve(obj);
 936   assert_field_offset_sane(p, offset);
 937   oop ret = HeapAccess<ON_UNKNOWN_OOP_REF>::oop_atomic_cmpxchg_at(p, (ptrdiff_t)offset, e, x);
 938   return ret == e;
 939 } UNSAFE_END
 940 
 941 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSetInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x)) {
 942   oop p = JNIHandles::resolve(obj);
 943   if (p == NULL) {
 944     volatile jint* addr = (volatile jint*)index_oop_from_field_offset_long(p, offset);
 945     return RawAccess<>::atomic_cmpxchg(addr, e, x) == e;
 946   } else {
 947     assert_field_offset_sane(p, offset);
 948     return HeapAccess<>::atomic_cmpxchg_at(p, (ptrdiff_t)offset, e, x) == e;
 949   }
 950 } UNSAFE_END
 951 
 952 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSetLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong e, jlong x)) {
 953   oop p = JNIHandles::resolve(obj);
 954   if (p == NULL) {
 955     volatile jlong* addr = (volatile jlong*)index_oop_from_field_offset_long(p, offset);
 956     return RawAccess<>::atomic_cmpxchg(addr, e, x) == e;
 957   } else {
 958     assert_field_offset_sane(p, offset);
 959     return HeapAccess<>::atomic_cmpxchg_at(p, (ptrdiff_t)offset, e, x) == e;
 960   }
 961 } UNSAFE_END
 962 
 963 static void post_thread_park_event(EventThreadPark* event, const oop obj, jlong timeout_nanos, jlong until_epoch_millis) {
 964   assert(event != NULL, "invariant");
 965   assert(event->should_commit(), "invariant");
 966   event->set_parkedClass((obj != NULL) ? obj->klass() : NULL);
 967   event->set_timeout(timeout_nanos);
 968   event->set_until(until_epoch_millis);
 969   event->set_address((obj != NULL) ? (u8)cast_from_oop<uintptr_t>(obj) : 0);
 970   event->commit();
 971 }
 972 
 973 UNSAFE_ENTRY(void, Unsafe_Park(JNIEnv *env, jobject unsafe, jboolean isAbsolute, jlong time)) {
 974   HOTSPOT_THREAD_PARK_BEGIN((uintptr_t) thread->parker(), (int) isAbsolute, time);
 975   EventThreadPark event;
 976 
 977   JavaThreadParkedState jtps(thread, time != 0);
 978   thread->parker()->park(isAbsolute != 0, time);
 979   if (event.should_commit()) {


< prev index next >