diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-06-09 14:52:53 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-06-09 14:56:02 +0200 |
commit | 7919f70e8fc41ecb4b5d0dc78f4847e592e8e446 (patch) | |
tree | 1758f2e52bf5ecc7ca8ab19c54e38c673b9ee342 | |
parent | bsps/sparc: tlib clock driver timecounter support (diff) | |
download | rtems-7919f70e8fc41ecb4b5d0dc78f4847e592e8e446.tar.bz2 |
score: Fix compiler memory barriers for atomic ops
-rw-r--r-- | cpukit/score/include/rtems/score/cpustdatomic.h | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/cpukit/score/include/rtems/score/cpustdatomic.h b/cpukit/score/include/rtems/score/cpustdatomic.h index 46a44efdb2..2696e3afbc 100644 --- a/cpukit/score/include/rtems/score/cpustdatomic.h +++ b/cpukit/score/include/rtems/score/cpustdatomic.h @@ -185,9 +185,13 @@ static inline unsigned int _CPU_atomic_Load_uint( const CPU_atomic_Uint *obj, CP #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) return atomic_load_explicit( obj, order ); #else + unsigned int val; + (void) order; + val = *obj; RTEMS_COMPILER_MEMORY_BARRIER(); - return *obj; + + return val; #endif } @@ -198,9 +202,13 @@ static inline unsigned long _CPU_atomic_Load_ulong( const CPU_atomic_Ulong *obj, #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) return atomic_load_explicit( obj, order ); #else + unsigned long val; + (void) order; + val = *obj; RTEMS_COMPILER_MEMORY_BARRIER(); - return *obj; + + return val; #endif } @@ -211,9 +219,13 @@ static inline void *_CPU_atomic_Load_ptr( const CPU_atomic_Pointer *obj, CPU_ato #elif defined(_RTEMS_SCORE_CPUSTDATOMIC_USE_STDATOMIC) return (void *) atomic_load_explicit( obj, order ); #else + uintptr_t val; + (void) order; + val = *obj; RTEMS_COMPILER_MEMORY_BARRIER(); - return (void *) *obj; + + return (void *) val; #endif } @@ -225,8 +237,8 @@ static inline void _CPU_atomic_Store_uint( CPU_atomic_Uint *obj, unsigned int de atomic_store_explicit( obj, desired, order ); #else (void) order; - *obj = desired; RTEMS_COMPILER_MEMORY_BARRIER(); + *obj = desired; #endif } @@ -238,8 +250,8 @@ static inline void _CPU_atomic_Store_ulong( CPU_atomic_Ulong *obj, unsigned long atomic_store_explicit( obj, desired, order ); #else (void) order; - *obj = desired; RTEMS_COMPILER_MEMORY_BARRIER(); + *obj = desired; #endif } @@ -251,8 +263,8 @@ static inline void _CPU_atomic_Store_ptr( CPU_atomic_Pointer *obj, void *desired atomic_store_explicit( obj, (uintptr_t) desired, order ); #else (void) order; - *obj = (uintptr_t) desired; RTEMS_COMPILER_MEMORY_BARRIER(); + *obj = (uintptr_t) desired; #endif } |