< prev index next >

src/hotspot/share/prims/unsafe.cpp

roman_version

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 {
< prev index next >