--- old/src/share/vm/prims/unsafe.cpp 2016-05-03 11:38:13.705501769 -0700 +++ new/src/share/vm/prims/unsafe.cpp 2016-05-03 11:38:13.605499988 -0700 @@ -139,7 +139,7 @@ * Normalizes values and wraps accesses in * JavaThread::doing_unsafe_access() if needed. */ -class MemoryAccess { +class MemoryAccess : StackObj { JavaThread* _thread; jobject _obj; jlong _offset; @@ -149,6 +149,15 @@ return index_oop_from_field_offset_long(JNIHandles::resolve(_obj), _offset); } + template + T normalize(T x) { + return x; + } + + jboolean normalize(jboolean x) { + return x & 1; + } + /** * Helper class to wrap memory accesses in JavaThread::doing_unsafe_access() */ @@ -182,15 +191,6 @@ } template - T normalize(T x) { - return x; - } - - jboolean normalize(jboolean x) { - return x & 1; - } - - template T get() { GuardUnsafeAccess guard(_thread, _obj); @@ -242,10 +242,10 @@ 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; @@ -255,10 +255,10 @@ 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 @@ -980,7 +980,7 @@ } 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)); + Handle p(THREAD, JNIHandles::resolve(obj)); jlong* addr = (jlong*)index_oop_from_field_offset_long(p(), offset); #ifdef SUPPORTS_NATIVE_CX8 @@ -1023,8 +1023,8 @@ } 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;