[rtems commit] score: Enhance _SMP_barrier_Wait()
Sebastian Huber
sebh at rtems.org
Tue Oct 11 12:45:04 UTC 2016
Module: rtems
Branch: master
Commit: 271690eb8838f2af30593584a87cb7595bdbdc6b
Changeset: http://git.rtems.org/rtems/commit/?id=271690eb8838f2af30593584a87cb7595bdbdc6b
Author: Sebastian Huber <sebastian.huber at embedded-brains.de>
Date: Tue Oct 11 14:42:55 2016 +0200
score: Enhance _SMP_barrier_Wait()
Indicate which processor released the barrier. Similar to
pthread_barrier_wait().
---
cpukit/score/include/rtems/score/smpbarrier.h | 5 ++++-
cpukit/score/src/smpbarrierwait.c | 8 +++++++-
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/cpukit/score/include/rtems/score/smpbarrier.h b/cpukit/score/include/rtems/score/smpbarrier.h
index 8225450..fddf7bb 100644
--- a/cpukit/score/include/rtems/score/smpbarrier.h
+++ b/cpukit/score/include/rtems/score/smpbarrier.h
@@ -106,8 +106,11 @@ static inline void _SMP_barrier_State_initialize(
* @param[in, out] control The SMP barrier control.
* @param[in, out] state The SMP barrier per-thread state.
* @param[in] count The thread count bound to rendezvous.
+ *
+ * @retval true This processor performed the barrier release.
+ * @retval false Otherwise.
*/
-void _SMP_barrier_Wait(
+bool _SMP_barrier_Wait(
SMP_barrier_Control *control,
SMP_barrier_State *state,
unsigned int count
diff --git a/cpukit/score/src/smpbarrierwait.c b/cpukit/score/src/smpbarrierwait.c
index 5a0de90..d06d819 100644
--- a/cpukit/score/src/smpbarrierwait.c
+++ b/cpukit/score/src/smpbarrierwait.c
@@ -18,7 +18,7 @@
#include <rtems/score/smpbarrier.h>
-void _SMP_barrier_Wait(
+bool _SMP_barrier_Wait(
SMP_barrier_Control *control,
SMP_barrier_State *state,
unsigned int count
@@ -26,6 +26,7 @@ void _SMP_barrier_Wait(
{
unsigned int sense = ~state->sense;
unsigned int previous_value;
+ bool performed_release;
state->sense = sense;
@@ -38,11 +39,16 @@ void _SMP_barrier_Wait(
if ( previous_value + 1U == count ) {
_Atomic_Store_uint( &control->value, 0U, ATOMIC_ORDER_RELAXED );
_Atomic_Store_uint( &control->sense, sense, ATOMIC_ORDER_RELEASE );
+ performed_release = true;
} else {
while (
_Atomic_Load_uint( &control->sense, ATOMIC_ORDER_ACQUIRE ) != sense
) {
/* Wait */
}
+
+ performed_release = false;
}
+
+ return performed_release;
}
More information about the vc
mailing list