src/share/vm/prims/unsafe.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 8161720 Cdiff src/share/vm/prims/unsafe.cpp

src/share/vm/prims/unsafe.cpp

Print this page

        

*** 148,165 **** void* addr() { return index_oop_from_field_offset_long(JNIHandles::resolve(_obj), _offset); } template <typename T> ! T normalize(T x) { return x; } ! jboolean normalize(jboolean x) { return x & 1; } /** * Helper class to wrap memory accesses in JavaThread::doing_unsafe_access() */ class GuardUnsafeAccess { JavaThread* _thread; --- 148,174 ---- void* addr() { return index_oop_from_field_offset_long(JNIHandles::resolve(_obj), _offset); } template <typename T> ! T normalize_for_write(T x) { return x; } ! jboolean normalize_for_write(jboolean x) { return x & 1; } + template <typename T> + T normalize_for_read(T x) { + return x; + } + + jboolean normalize_for_read(jboolean x) { + return x != 0; + } + /** * Helper class to wrap memory accesses in JavaThread::doing_unsafe_access() */ class GuardUnsafeAccess { JavaThread* _thread;
*** 194,215 **** T get() { GuardUnsafeAccess guard(_thread, _obj); T* p = (T*)addr(); ! T x = *p; return x; } template <typename T> void put(T x) { GuardUnsafeAccess guard(_thread, _obj); T* p = (T*)addr(); ! *p = normalize(x); } template <typename T> T get_volatile() { --- 203,224 ---- T get() { GuardUnsafeAccess guard(_thread, _obj); T* p = (T*)addr(); ! T x = normalize_for_read(*p); return x; } template <typename T> void put(T x) { GuardUnsafeAccess guard(_thread, _obj); T* p = (T*)addr(); ! *p = normalize_for_write(x); } template <typename T> T get_volatile() {
*** 221,240 **** OrderAccess::fence(); } T x = OrderAccess::load_acquire((volatile T*)p); ! return x; } template <typename T> void put_volatile(T x) { GuardUnsafeAccess guard(_thread, _obj); T* p = (T*)addr(); ! OrderAccess::release_store_fence((volatile T*)p, normalize(x)); } #ifndef SUPPORTS_NATIVE_CX8 jlong get_jlong_locked() { --- 230,249 ---- OrderAccess::fence(); } T x = OrderAccess::load_acquire((volatile T*)p); ! return normalize_for_read(x); } template <typename T> void put_volatile(T x) { GuardUnsafeAccess guard(_thread, _obj); T* p = (T*)addr(); ! OrderAccess::release_store_fence((volatile T*)p, normalize_for_write(x)); } #ifndef SUPPORTS_NATIVE_CX8 jlong get_jlong_locked() {
*** 254,264 **** MutexLockerEx mu(UnsafeJlong_lock, Mutex::_no_safepoint_check_flag); jlong* p = (jlong*)addr(); ! Atomic::store(normalize(x), p); } #endif }; // Get/PutObject must be special-cased, since it works with handles. --- 263,273 ---- MutexLockerEx mu(UnsafeJlong_lock, Mutex::_no_safepoint_check_flag); jlong* p = (jlong*)addr(); ! Atomic::store(normalize_for_write(x), p); } #endif }; // Get/PutObject must be special-cased, since it works with handles.
src/share/vm/prims/unsafe.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File