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