[rtems commit] score: Add barrier thread queue operations

Sebastian Huber sebh at rtems.org
Sat Feb 6 20:35:02 UTC 2021


Module:    rtems
Branch:    5
Commit:    ef1ac8afff4b3b3700fdebdeb4a2ae04211b5686
Changeset: http://git.rtems.org/rtems/commit/?id=ef1ac8afff4b3b3700fdebdeb4a2ae04211b5686

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri Feb  5 14:35:56 2021 +0100

score: Add barrier thread queue operations

This fixes a missing decrement of the number of waiting threads during a
barrier wait timeout.

Close #4232.

---

 cpukit/include/rtems/score/corebarrierimpl.h |  9 +++++++-
 cpukit/score/src/corebarrierrelease.c        |  3 +--
 cpukit/score/src/corebarrierwait.c           | 32 +++++++++++++++++++++++++++-
 3 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/cpukit/include/rtems/score/corebarrierimpl.h b/cpukit/include/rtems/score/corebarrierimpl.h
index 9e9ddfd..13e052d 100644
--- a/cpukit/include/rtems/score/corebarrierimpl.h
+++ b/cpukit/include/rtems/score/corebarrierimpl.h
@@ -35,7 +35,14 @@ extern "C" {
  * @{
  */
 
-#define CORE_BARRIER_TQ_OPERATIONS &_Thread_queue_Operations_FIFO
+/**
+ * @brief These thread queue operations are used for core barriers.
+ *
+ * They are a specialization of ::_Thread_queue_Operations_FIFO.  The only
+ * difference is that the extract operation decrements
+ * CORE_barrier_Control::number_of_waiting_threads.
+ */
+extern const Thread_queue_Operations _CORE_barrier_Thread_queue_operations;
 
 /**
  *  @brief Initializes the core barrier.
diff --git a/cpukit/score/src/corebarrierrelease.c b/cpukit/score/src/corebarrierrelease.c
index a2e6886..da8da0a 100644
--- a/cpukit/score/src/corebarrierrelease.c
+++ b/cpukit/score/src/corebarrierrelease.c
@@ -27,10 +27,9 @@ uint32_t _CORE_barrier_Do_flush(
   Thread_queue_Context      *queue_context
 )
 {
-  the_barrier->number_of_waiting_threads = 0;
   return _Thread_queue_Flush_critical(
     &the_barrier->Wait_queue.Queue,
-    CORE_BARRIER_TQ_OPERATIONS,
+    &_CORE_barrier_Thread_queue_operations,
     filter,
     queue_context
   );
diff --git a/cpukit/score/src/corebarrierwait.c b/cpukit/score/src/corebarrierwait.c
index f45873c..2c59460 100644
--- a/cpukit/score/src/corebarrierwait.c
+++ b/cpukit/score/src/corebarrierwait.c
@@ -21,6 +21,36 @@
 #include <rtems/score/corebarrierimpl.h>
 #include <rtems/score/statesimpl.h>
 #include <rtems/score/threadimpl.h>
+#include <rtems/score/threadqops.h>
+
+static void _CORE_barrier_Thread_queue_extract(
+  Thread_queue_Queue   *queue,
+  Thread_Control       *the_thread,
+  Thread_queue_Context *queue_context
+)
+{
+  CORE_barrier_Control *the_barrier;
+
+  the_barrier = RTEMS_CONTAINER_OF(
+    queue,
+    CORE_barrier_Control,
+    Wait_queue.Queue
+  );
+  --the_barrier->number_of_waiting_threads;
+  _Thread_queue_FIFO_extract(
+    &the_barrier->Wait_queue.Queue,
+    the_thread,
+    queue_context
+  );
+}
+
+const Thread_queue_Operations _CORE_barrier_Thread_queue_operations = {
+  .priority_actions = _Thread_queue_Do_nothing_priority_actions,
+  .enqueue = _Thread_queue_FIFO_enqueue,
+  .extract = _CORE_barrier_Thread_queue_extract,
+  .surrender = _Thread_queue_FIFO_surrender,
+  .first = _Thread_queue_FIFO_first
+};
 
 Status_Control _CORE_barrier_Seize(
   CORE_barrier_Control *the_barrier,
@@ -50,7 +80,7 @@ Status_Control _CORE_barrier_Seize(
     );
     _Thread_queue_Enqueue(
       &the_barrier->Wait_queue.Queue,
-      CORE_BARRIER_TQ_OPERATIONS,
+      &_CORE_barrier_Thread_queue_operations,
       executing,
       queue_context
     );



More information about the vc mailing list