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 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel