Fri, 19 Jul 2013 08:34:48 -0700
8016538: volatile double access via Unsafe.cpp is not atomic
Summary: volatile jdouble load/store is not atomic, fix by using of existing volatile jlong operations which are atomic for jdouble.
Reviewed-by: kvn, vladidan, jrose
Contributed-by: david.holmes@oracle.com
1.1 --- a/src/os_cpu/bsd_x86/vm/orderAccess_bsd_x86.inline.hpp Thu Jul 18 18:00:39 2013 -0700 1.2 +++ b/src/os_cpu/bsd_x86/vm/orderAccess_bsd_x86.inline.hpp Fri Jul 19 08:34:48 2013 -0700 1.3 @@ -72,7 +72,7 @@ 1.4 inline juint OrderAccess::load_acquire(volatile juint* p) { return *p; } 1.5 inline julong OrderAccess::load_acquire(volatile julong* p) { return Atomic::load((volatile jlong*)p); } 1.6 inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { return *p; } 1.7 -inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { return *p; } 1.8 +inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { return jdouble_cast(Atomic::load((volatile jlong*)p)); } 1.9 1.10 inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t* p) { return *p; } 1.11 inline void* OrderAccess::load_ptr_acquire(volatile void* p) { return *(void* volatile *)p; } 1.12 @@ -87,7 +87,7 @@ 1.13 inline void OrderAccess::release_store(volatile juint* p, juint v) { *p = v; } 1.14 inline void OrderAccess::release_store(volatile julong* p, julong v) { Atomic::store((jlong)v, (volatile jlong*)p); } 1.15 inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { *p = v; } 1.16 -inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { *p = v; } 1.17 +inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { release_store((volatile jlong*)p, jlong_cast(v)); } 1.18 1.19 inline void OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { *p = v; } 1.20 inline void OrderAccess::release_store_ptr(volatile void* p, void* v) { *(void* volatile *)p = v; } 1.21 @@ -190,7 +190,7 @@ 1.22 inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { release_store_fence((volatile jlong*)p, (jlong)v); } 1.23 1.24 inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { *p = v; fence(); } 1.25 -inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { *p = v; fence(); } 1.26 +inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { release_store_fence((volatile jlong*)p, jdouble_cast(v)); } 1.27 1.28 inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) { 1.29 #ifdef AMD64
2.1 --- a/src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp Thu Jul 18 18:00:39 2013 -0700 2.2 +++ b/src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp Fri Jul 19 08:34:48 2013 -0700 2.3 @@ -72,7 +72,7 @@ 2.4 inline juint OrderAccess::load_acquire(volatile juint* p) { return *p; } 2.5 inline julong OrderAccess::load_acquire(volatile julong* p) { return Atomic::load((volatile jlong*)p); } 2.6 inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { return *p; } 2.7 -inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { return *p; } 2.8 +inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { return jdouble_cast(Atomic::load((volatile jlong*)p)); } 2.9 2.10 inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t* p) { return *p; } 2.11 inline void* OrderAccess::load_ptr_acquire(volatile void* p) { return *(void* volatile *)p; } 2.12 @@ -87,7 +87,7 @@ 2.13 inline void OrderAccess::release_store(volatile juint* p, juint v) { *p = v; } 2.14 inline void OrderAccess::release_store(volatile julong* p, julong v) { Atomic::store((jlong)v, (volatile jlong*)p); } 2.15 inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { *p = v; } 2.16 -inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { *p = v; } 2.17 +inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { release_store((volatile jlong *)p, jlong_cast(v)); } 2.18 2.19 inline void OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { *p = v; } 2.20 inline void OrderAccess::release_store_ptr(volatile void* p, void* v) { *(void* volatile *)p = v; } 2.21 @@ -129,7 +129,7 @@ 2.22 inline void OrderAccess::store_fence(juint* p, juint v) { store_fence((jint*)p, (jint)v); } 2.23 inline void OrderAccess::store_fence(julong* p, julong v) { store_fence((jlong*)p, (jlong)v); } 2.24 inline void OrderAccess::store_fence(jfloat* p, jfloat v) { *p = v; fence(); } 2.25 -inline void OrderAccess::store_fence(jdouble* p, jdouble v) { *p = v; fence(); } 2.26 +inline void OrderAccess::store_fence(jdouble* p, jdouble v) { store_fence((jlong*)p, jlong_cast(v)); } 2.27 2.28 inline void OrderAccess::store_ptr_fence(intptr_t* p, intptr_t v) { 2.29 #ifdef AMD64 2.30 @@ -190,7 +190,7 @@ 2.31 inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { release_store_fence((volatile jlong*)p, (jlong)v); } 2.32 2.33 inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { *p = v; fence(); } 2.34 -inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { *p = v; fence(); } 2.35 +inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { release_store_fence((volatile jlong*)p, jlong_cast(v)); } 2.36 2.37 inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) { 2.38 #ifdef AMD64
3.1 --- a/src/os_cpu/solaris_x86/vm/orderAccess_solaris_x86.inline.hpp Thu Jul 18 18:00:39 2013 -0700 3.2 +++ b/src/os_cpu/solaris_x86/vm/orderAccess_solaris_x86.inline.hpp Fri Jul 19 08:34:48 2013 -0700 3.3 @@ -88,7 +88,7 @@ 3.4 inline juint OrderAccess::load_acquire(volatile juint* p) { return *p; } 3.5 inline julong OrderAccess::load_acquire(volatile julong* p) { return Atomic::load((volatile jlong*)p); } 3.6 inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { return *p; } 3.7 -inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { return *p; } 3.8 +inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { return jdouble_cast(Atomic::load((volatile jlong*)p)); } 3.9 3.10 inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t* p) { return *p; } 3.11 inline void* OrderAccess::load_ptr_acquire(volatile void* p) { return *(void* volatile *)p; } 3.12 @@ -103,7 +103,7 @@ 3.13 inline void OrderAccess::release_store(volatile juint* p, juint v) { *p = v; } 3.14 inline void OrderAccess::release_store(volatile julong* p, julong v) { Atomic::store((jlong)v, (volatile jlong*)p); } 3.15 inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { *p = v; } 3.16 -inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { *p = v; } 3.17 +inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { release_store((volatile jlong*)p, jlong_cast(v)); } 3.18 3.19 inline void OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { *p = v; } 3.20 inline void OrderAccess::release_store_ptr(volatile void* p, void* v) { *(void* volatile *)p = v; } 3.21 @@ -129,9 +129,9 @@ 3.22 inline void OrderAccess::release_store_fence(volatile jubyte* p, jubyte v) { *p = v; fence(); } 3.23 inline void OrderAccess::release_store_fence(volatile jushort* p, jushort v) { *p = v; fence(); } 3.24 inline void OrderAccess::release_store_fence(volatile juint* p, juint v) { *p = v; fence(); } 3.25 -inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { release_store(p, v); fence(); } 3.26 +inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { release_store((jlong *)p, (jlong)v); fence(); } 3.27 inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { *p = v; fence(); } 3.28 -inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { *p = v; fence(); } 3.29 +inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { release_store_fence((volatile jlong*)p, jlong_cast(v)); } 3.30 3.31 inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) { *p = v; fence(); } 3.32 inline void OrderAccess::release_store_ptr_fence(volatile void* p, void* v) { *(void* volatile *)p = v; fence(); }
4.1 --- a/src/os_cpu/windows_x86/vm/orderAccess_windows_x86.inline.hpp Thu Jul 18 18:00:39 2013 -0700 4.2 +++ b/src/os_cpu/windows_x86/vm/orderAccess_windows_x86.inline.hpp Fri Jul 19 08:34:48 2013 -0700 4.3 @@ -71,7 +71,7 @@ 4.4 inline juint OrderAccess::load_acquire(volatile juint* p) { return *p; } 4.5 inline julong OrderAccess::load_acquire(volatile julong* p) { return Atomic::load((volatile jlong*)p); } 4.6 inline jfloat OrderAccess::load_acquire(volatile jfloat* p) { return *p; } 4.7 -inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { return *p; } 4.8 +inline jdouble OrderAccess::load_acquire(volatile jdouble* p) { return jdouble_cast(Atomic::load((volatile jlong*)p)); } 4.9 4.10 inline intptr_t OrderAccess::load_ptr_acquire(volatile intptr_t* p) { return *p; } 4.11 inline void* OrderAccess::load_ptr_acquire(volatile void* p) { return *(void* volatile *)p; } 4.12 @@ -86,7 +86,7 @@ 4.13 inline void OrderAccess::release_store(volatile juint* p, juint v) { *p = v; } 4.14 inline void OrderAccess::release_store(volatile julong* p, julong v) { Atomic::store((jlong)v, (volatile jlong*)p); } 4.15 inline void OrderAccess::release_store(volatile jfloat* p, jfloat v) { *p = v; } 4.16 -inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { *p = v; } 4.17 +inline void OrderAccess::release_store(volatile jdouble* p, jdouble v) { release_store((volatile jlong*)p, jlong_cast(v)); } 4.18 4.19 inline void OrderAccess::release_store_ptr(volatile intptr_t* p, intptr_t v) { *p = v; } 4.20 inline void OrderAccess::release_store_ptr(volatile void* p, void* v) { *(void* volatile *)p = v; } 4.21 @@ -195,7 +195,7 @@ 4.22 inline void OrderAccess::release_store_fence(volatile juint* p, juint v) { release_store_fence((volatile jint*)p, (jint)v); } 4.23 inline void OrderAccess::release_store_fence(volatile julong* p, julong v) { release_store_fence((volatile jlong*)p, (jlong)v); } 4.24 inline void OrderAccess::release_store_fence(volatile jfloat* p, jfloat v) { *p = v; fence(); } 4.25 -inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { *p = v; fence(); } 4.26 +inline void OrderAccess::release_store_fence(volatile jdouble* p, jdouble v) { release_store_fence((volatile jlong*)p, jlong_cast(v)); } 4.27 4.28 inline void OrderAccess::release_store_ptr_fence(volatile intptr_t* p, intptr_t v) { 4.29 #ifdef AMD64