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"); |