8016538: volatile double access via Unsafe.cpp is not atomic

Fri, 19 Jul 2013 08:34:48 -0700

author
minqi
date
Fri, 19 Jul 2013 08:34:48 -0700
changeset 5430
4614a598dae1
parent 5428
383a5e21cc2d
child 5431
55a61ceb2fe7

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

src/os_cpu/bsd_x86/vm/orderAccess_bsd_x86.inline.hpp file | annotate | diff | comparison | revisions
src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp file | annotate | diff | comparison | revisions
src/os_cpu/solaris_x86/vm/orderAccess_solaris_x86.inline.hpp file | annotate | diff | comparison | revisions
src/os_cpu/windows_x86/vm/orderAccess_windows_x86.inline.hpp file | annotate | diff | comparison | revisions
     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

mercurial