[PATCH 3/3] score: Add barrier thread queue operations

Sebastian Huber sebastian.huber at embedded-brains.de
Fri Feb 5 13:37:37 UTC 2021


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

Close #4230.
---
 cpukit/include/rtems/score/corebarrierimpl.h |  4 ++-
 cpukit/score/src/corebarrierrelease.c        |  1 -
 cpukit/score/src/corebarrierwait.c           | 30 ++++++++++++++++++++
 3 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/cpukit/include/rtems/score/corebarrierimpl.h b/cpukit/include/rtems/score/corebarrierimpl.h
index c2dfea8f9b..2317d748c1 100644
--- a/cpukit/include/rtems/score/corebarrierimpl.h
+++ b/cpukit/include/rtems/score/corebarrierimpl.h
@@ -33,7 +33,9 @@ extern "C" {
  * @{
  */
 
-#define CORE_BARRIER_TQ_OPERATIONS &_Thread_queue_Operations_FIFO
+extern const Thread_queue_Operations _CORE_barrier_Thread_queue_operations;
+
+#define CORE_BARRIER_TQ_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 5d510107d6..1f03b24bac 100644
--- a/cpukit/score/src/corebarrierrelease.c
+++ b/cpukit/score/src/corebarrierrelease.c
@@ -28,7 +28,6 @@ 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,
diff --git a/cpukit/score/src/corebarrierwait.c b/cpukit/score/src/corebarrierwait.c
index 3da9b05953..7651e20737 100644
--- a/cpukit/score/src/corebarrierwait.c
+++ b/cpukit/score/src/corebarrierwait.c
@@ -23,6 +23,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,
-- 
2.26.2



More information about the devel mailing list