summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2015-06-09 14:52:53 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-06-09 14:56:02 +0200
commit7919f70e8fc41ecb4b5d0dc78f4847e592e8e446 (patch)
tree1758f2e52bf5ecc7ca8ab19c54e38c673b9ee342
parentbsps/sparc: tlib clock driver timecounter support (diff)
downloadrtems-7919f70e8fc41ecb4b5d0dc78f4847e592e8e446.tar.bz2
score: Fix compiler memory barriers for atomic ops
-rw-r--r--cpukit/score/include/rtems/score/cpustdatomic.h24
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
}