summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/smpbarrierwait.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-02-14 12:57:53 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-02-17 08:46:38 +0100
commitad7292f26465027cb8fd5494e613f5bd63607623 (patch)
tree0ccca5c00bc4ca1a4494486f52c5d30f04f7a961 /cpukit/score/src/smpbarrierwait.c
parentscore: Use atomic API for SMP lock (diff)
downloadrtems-ad7292f26465027cb8fd5494e613f5bd63607623.tar.bz2
score: Add SMP barrier
Diffstat (limited to 'cpukit/score/src/smpbarrierwait.c')
-rw-r--r--cpukit/score/src/smpbarrierwait.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/cpukit/score/src/smpbarrierwait.c b/cpukit/score/src/smpbarrierwait.c
new file mode 100644
index 0000000000..0a3cedba00
--- /dev/null
+++ b/cpukit/score/src/smpbarrierwait.c
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2013-2014 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ */
+
+#if HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <rtems/score/smpbarrier.h>
+
+void _SMP_barrier_Wait(
+ SMP_barrier_Control *control,
+ SMP_barrier_State *state,
+ unsigned int count
+)
+{
+ unsigned int sense = ~state->sense;
+ unsigned int previous_value;
+
+ state->sense = sense;
+
+ previous_value = _Atomic_Fetch_add_uint(
+ &control->value,
+ 1U,
+ ATOMIC_ORDER_RELAXED
+ );
+
+ if ( previous_value + 1U == count ) {
+ _Atomic_Store_uint( &control->value, 0U, ATOMIC_ORDER_RELAXED );
+ _Atomic_Store_uint( &control->sense, sense, ATOMIC_ORDER_RELEASE );
+ } else {
+ while (
+ _Atomic_Load_uint( &control->sense, ATOMIC_ORDER_ACQUIRE ) != sense
+ ) {
+ /* Wait */
+ }
+ }
+}