880 }
881 } UNSAFE_END
882
883 UNSAFE_ENTRY(jlong, Unsafe_CompareAndExchangeLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong e, jlong x)) {
884 oop p = JNIHandles::resolve(obj);
885 if (oopDesc::is_null(p)) {
886 volatile jlong* addr = (volatile jlong*)index_oop_from_field_offset_long(p, offset);
887 return RawAccess<>::atomic_cmpxchg(x, addr, e);
888 } else {
889 assert_field_offset_sane(p, offset);
890 return HeapAccess<>::atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e);
891 }
892 } UNSAFE_END
893
894 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSetObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject e_h, jobject x_h)) {
895 oop x = JNIHandles::resolve(x_h);
896 oop e = JNIHandles::resolve(e_h);
897 oop p = JNIHandles::resolve(obj);
898 assert_field_offset_sane(p, offset);
899 oop ret = HeapAccess<ON_UNKNOWN_OOP_REF>::oop_atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e);
900 return ret == e;
901 } UNSAFE_END
902
903 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSetInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x)) {
904 oop p = JNIHandles::resolve(obj);
905 if (oopDesc::is_null(p)) {
906 volatile jint* addr = (volatile jint*)index_oop_from_field_offset_long(p, offset);
907 return RawAccess<>::atomic_cmpxchg(x, addr, e) == e;
908 } else {
909 assert_field_offset_sane(p, offset);
910 return HeapAccess<>::atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e) == e;
911 }
912 } UNSAFE_END
913
914 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSetLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong e, jlong x)) {
915 oop p = JNIHandles::resolve(obj);
916 if (oopDesc::is_null(p)) {
917 volatile jlong* addr = (volatile jlong*)index_oop_from_field_offset_long(p, offset);
918 return RawAccess<>::atomic_cmpxchg(x, addr, e) == e;
919 } else {
920 assert_field_offset_sane(p, offset);
|
880 }
881 } UNSAFE_END
882
883 UNSAFE_ENTRY(jlong, Unsafe_CompareAndExchangeLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong e, jlong x)) {
884 oop p = JNIHandles::resolve(obj);
885 if (oopDesc::is_null(p)) {
886 volatile jlong* addr = (volatile jlong*)index_oop_from_field_offset_long(p, offset);
887 return RawAccess<>::atomic_cmpxchg(x, addr, e);
888 } else {
889 assert_field_offset_sane(p, offset);
890 return HeapAccess<>::atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e);
891 }
892 } UNSAFE_END
893
894 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSetObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject e_h, jobject x_h)) {
895 oop x = JNIHandles::resolve(x_h);
896 oop e = JNIHandles::resolve(e_h);
897 oop p = JNIHandles::resolve(obj);
898 assert_field_offset_sane(p, offset);
899 oop ret = HeapAccess<ON_UNKNOWN_OOP_REF>::oop_atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e);
900 return oopDesc::equals(ret, e);
901 } UNSAFE_END
902
903 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSetInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x)) {
904 oop p = JNIHandles::resolve(obj);
905 if (oopDesc::is_null(p)) {
906 volatile jint* addr = (volatile jint*)index_oop_from_field_offset_long(p, offset);
907 return RawAccess<>::atomic_cmpxchg(x, addr, e) == e;
908 } else {
909 assert_field_offset_sane(p, offset);
910 return HeapAccess<>::atomic_cmpxchg_at(x, p, (ptrdiff_t)offset, e) == e;
911 }
912 } UNSAFE_END
913
914 UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSetLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong e, jlong x)) {
915 oop p = JNIHandles::resolve(obj);
916 if (oopDesc::is_null(p)) {
917 volatile jlong* addr = (volatile jlong*)index_oop_from_field_offset_long(p, offset);
918 return RawAccess<>::atomic_cmpxchg(x, addr, e) == e;
919 } else {
920 assert_field_offset_sane(p, offset);
|