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