[rtems commit] score: Fix SMP lock implementation

Sebastian Huber sebh at rtems.org
Fri Mar 6 13:03:55 UTC 2015


Module:    rtems
Branch:    master
Commit:    da06fe948c0878057e5f563ebd3dfe40c0f1b0d2
Changeset: http://git.rtems.org/rtems/commit/?id=da06fe948c0878057e5f563ebd3dfe40c0f1b0d2

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri Mar  6 13:20:44 2015 +0100

score: Fix SMP lock implementation

See also:

https://nahratzah.wordpress.com/2012/10/12/a-trivial-fair-spinlock/

http://concurrencyfreaks.blogspot.de/2014/05/relaxed-atomics-optimizations-for.html

---

 cpukit/score/include/rtems/score/atomic.h       | 2 ++
 cpukit/score/include/rtems/score/cpustdatomic.h | 6 ++++++
 cpukit/score/include/rtems/score/smplock.h      | 2 +-
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/cpukit/score/include/rtems/score/atomic.h b/cpukit/score/include/rtems/score/atomic.h
index cb09c95..0cf3e99 100644
--- a/cpukit/score/include/rtems/score/atomic.h
+++ b/cpukit/score/include/rtems/score/atomic.h
@@ -50,6 +50,8 @@ typedef CPU_atomic_Order Atomic_Order;
 
 #define ATOMIC_ORDER_RELEASE CPU_ATOMIC_ORDER_RELEASE
 
+#define ATOMIC_ORDER_ACQ_REL CPU_ATOMIC_ORDER_ACQ_REL
+
 #define ATOMIC_ORDER_SEQ_CST CPU_ATOMIC_ORDER_SEQ_CST
 
 #define ATOMIC_INITIALIZER_UINT( value ) CPU_ATOMIC_INITIALIZER_UINT( value )
diff --git a/cpukit/score/include/rtems/score/cpustdatomic.h b/cpukit/score/include/rtems/score/cpustdatomic.h
index 3f7c14f..d27c75f 100644
--- a/cpukit/score/include/rtems/score/cpustdatomic.h
+++ b/cpukit/score/include/rtems/score/cpustdatomic.h
@@ -56,6 +56,8 @@ typedef std::memory_order CPU_atomic_Order;
 
 #define CPU_ATOMIC_ORDER_RELEASE std::memory_order_release
 
+#define CPU_ATOMIC_ORDER_ACQ_REL std::memory_order_acq_rel
+
 #define CPU_ATOMIC_ORDER_SEQ_CST std::memory_order_seq_cst
 
 #define CPU_ATOMIC_INITIALIZER_UINT( value ) ATOMIC_VAR_INIT( value )
@@ -85,6 +87,8 @@ typedef memory_order CPU_atomic_Order;
 
 #define CPU_ATOMIC_ORDER_RELEASE memory_order_release
 
+#define CPU_ATOMIC_ORDER_ACQ_REL memory_order_acq_rel
+
 #define CPU_ATOMIC_ORDER_SEQ_CST memory_order_seq_cst
 
 #define CPU_ATOMIC_INITIALIZER_UINT( value ) ATOMIC_VAR_INIT( value )
@@ -114,6 +118,8 @@ typedef int CPU_atomic_Order;
 
 #define CPU_ATOMIC_ORDER_RELEASE 3
 
+#define CPU_ATOMIC_ORDER_ACQ_REL 4
+
 #define CPU_ATOMIC_ORDER_SEQ_CST 5
 
 #define CPU_ATOMIC_INITIALIZER_UINT( value ) ( value )
diff --git a/cpukit/score/include/rtems/score/smplock.h b/cpukit/score/include/rtems/score/smplock.h
index cc54c69..364a722 100644
--- a/cpukit/score/include/rtems/score/smplock.h
+++ b/cpukit/score/include/rtems/score/smplock.h
@@ -280,7 +280,7 @@ static inline void _SMP_ticket_lock_Acquire(
 #endif
 
   my_ticket =
-    _Atomic_Fetch_add_uint( &lock->next_ticket, 1U, ATOMIC_ORDER_RELAXED );
+    _Atomic_Fetch_add_uint( &lock->next_ticket, 1U, ATOMIC_ORDER_ACQ_REL );
 
 #if defined( RTEMS_PROFILING )
   now_serving =



More information about the vc mailing list