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