hotspot/src/share/vm/prims/unsafe.cpp
changeset 41052 3362c4368286
parent 40664 1ec65b303bb7
child 41066 e8c366069761
equal deleted inserted replaced
41051:77740a69b211 41052:3362c4368286
   148   void* addr() {
   148   void* addr() {
   149     return index_oop_from_field_offset_long(JNIHandles::resolve(_obj), _offset);
   149     return index_oop_from_field_offset_long(JNIHandles::resolve(_obj), _offset);
   150   }
   150   }
   151 
   151 
   152   template <typename T>
   152   template <typename T>
   153   T normalize(T x) {
   153   T normalize_for_write(T x) {
   154     return x;
   154     return x;
   155   }
   155   }
   156 
   156 
   157   jboolean normalize(jboolean x) {
   157   jboolean normalize_for_write(jboolean x) {
   158     return x & 1;
   158     return x & 1;
       
   159   }
       
   160 
       
   161   template <typename T>
       
   162   T normalize_for_read(T x) {
       
   163     return x;
       
   164   }
       
   165 
       
   166   jboolean normalize_for_read(jboolean x) {
       
   167     return x != 0;
   159   }
   168   }
   160 
   169 
   161   /**
   170   /**
   162    * Helper class to wrap memory accesses in JavaThread::doing_unsafe_access()
   171    * Helper class to wrap memory accesses in JavaThread::doing_unsafe_access()
   163    */
   172    */
   194   T get() {
   203   T get() {
   195     GuardUnsafeAccess guard(_thread, _obj);
   204     GuardUnsafeAccess guard(_thread, _obj);
   196 
   205 
   197     T* p = (T*)addr();
   206     T* p = (T*)addr();
   198 
   207 
   199     T x = *p;
   208     T x = normalize_for_read(*p);
   200 
   209 
   201     return x;
   210     return x;
   202   }
   211   }
   203 
   212 
   204   template <typename T>
   213   template <typename T>
   205   void put(T x) {
   214   void put(T x) {
   206     GuardUnsafeAccess guard(_thread, _obj);
   215     GuardUnsafeAccess guard(_thread, _obj);
   207 
   216 
   208     T* p = (T*)addr();
   217     T* p = (T*)addr();
   209 
   218 
   210     *p = normalize(x);
   219     *p = normalize_for_write(x);
   211   }
   220   }
   212 
   221 
   213 
   222 
   214   template <typename T>
   223   template <typename T>
   215   T get_volatile() {
   224   T get_volatile() {
   221       OrderAccess::fence();
   230       OrderAccess::fence();
   222     }
   231     }
   223 
   232 
   224     T x = OrderAccess::load_acquire((volatile T*)p);
   233     T x = OrderAccess::load_acquire((volatile T*)p);
   225 
   234 
   226     return x;
   235     return normalize_for_read(x);
   227   }
   236   }
   228 
   237 
   229   template <typename T>
   238   template <typename T>
   230   void put_volatile(T x) {
   239   void put_volatile(T x) {
   231     GuardUnsafeAccess guard(_thread, _obj);
   240     GuardUnsafeAccess guard(_thread, _obj);
   232 
   241 
   233     T* p = (T*)addr();
   242     T* p = (T*)addr();
   234 
   243 
   235     OrderAccess::release_store_fence((volatile T*)p, normalize(x));
   244     OrderAccess::release_store_fence((volatile T*)p, normalize_for_write(x));
   236   }
   245   }
   237 
   246 
   238 
   247 
   239 #ifndef SUPPORTS_NATIVE_CX8
   248 #ifndef SUPPORTS_NATIVE_CX8
   240   jlong get_jlong_locked() {
   249   jlong get_jlong_locked() {
   254 
   263 
   255     MutexLockerEx mu(UnsafeJlong_lock, Mutex::_no_safepoint_check_flag);
   264     MutexLockerEx mu(UnsafeJlong_lock, Mutex::_no_safepoint_check_flag);
   256 
   265 
   257     jlong* p = (jlong*)addr();
   266     jlong* p = (jlong*)addr();
   258 
   267 
   259     Atomic::store(normalize(x),  p);
   268     Atomic::store(normalize_for_write(x),  p);
   260   }
   269   }
   261 #endif
   270 #endif
   262 };
   271 };
   263 
   272 
   264 // Get/PutObject must be special-cased, since it works with handles.
   273 // Get/PutObject must be special-cased, since it works with handles.