src/share/vm/prims/unsafe.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
*** old/src/share/vm/prims/unsafe.cpp Tue May 3 11:38:13 2016
--- new/src/share/vm/prims/unsafe.cpp Tue May 3 11:38:13 2016
*** 137,156 ****
--- 137,165 ----
* Helper class for accessing memory.
*
* Normalizes values and wraps accesses in
* JavaThread::doing_unsafe_access() if needed.
*/
! class MemoryAccess : StackObj {
JavaThread* _thread;
jobject _obj;
jlong _offset;
// Resolves and returns the address of the memory access
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;
*** 180,198 ****
--- 189,198 ----
MemoryAccess(JavaThread* thread, jobject obj, jlong offset)
: _thread(thread), _obj(obj), _offset(offset) {
}
template <typename T>
T normalize(T x) {
return x;
}
jboolean normalize(jboolean x) {
return x & 1;
}
template <typename T>
T get() {
GuardUnsafeAccess guard(_thread, _obj);
T* p = (T*)addr();
*** 240,266 ****
--- 240,266 ----
//
template <typename T>
T get_mutex() {
GuardUnsafeAccess guard(_thread, _obj);
T* p = (T*)addr();
MutexLockerEx mu(UnsafeJlong_lock, Mutex::_no_safepoint_check_flag);
+ T* p = (T*)addr();
+
T x = Atomic::load(p);
return x;
}
template <typename T>
void put_mutex(T x) {
GuardUnsafeAccess guard(_thread, _obj);
T* p = (T*)addr();
MutexLockerEx mu(UnsafeJlong_lock, Mutex::_no_safepoint_check_flag);
+ T* p = (T*)addr();
+
Atomic::store(normalize(x), p);
}
#endif
};
*** 978,988 ****
--- 978,988 ----
return (jint)(Atomic::cmpxchg(x, addr, e));
} UNSAFE_END
UNSAFE_ENTRY(jlong, Unsafe_CompareAndExchangeLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong e, jlong x)) {
- Handle p (THREAD, JNIHandles::resolve(obj));
jlong* addr = (jlong*)index_oop_from_field_offset_long(p(), offset);
#ifdef SUPPORTS_NATIVE_CX8
return (jlong)(Atomic::cmpxchg(x, addr, e));
#else
*** 1021,1032 ****
--- 1021,1032 ----
return (jint)(Atomic::cmpxchg(x, addr, e)) == e;
} UNSAFE_END
UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapLong(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jlong e, jlong x)) {
! oop p = JNIHandles::resolve(obj);
! jlong* addr = (jlong*)index_oop_from_field_offset_long(p, offset);
! Handle p(THREAD, JNIHandles::resolve(obj));
! jlong* addr = (jlong*)index_oop_from_field_offset_long(p(), offset);
#ifdef SUPPORTS_NATIVE_CX8
return (jlong)(Atomic::cmpxchg(x, addr, e)) == e;
#else
if (VM_Version::supports_cx8()) {
src/share/vm/prims/unsafe.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File