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()) { |