File indexing completed on 2025-05-11 08:24:26
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 #ifdef HAVE_CONFIG_H
0039 #include "config.h"
0040 #endif
0041
0042 #include <rtems/score/corebarrierimpl.h>
0043 #include <rtems/score/statesimpl.h>
0044 #include <rtems/score/threadimpl.h>
0045 #include <rtems/score/threadqops.h>
0046
0047 static void _CORE_barrier_Thread_queue_extract(
0048 Thread_queue_Queue *queue,
0049 Thread_Control *the_thread,
0050 Thread_queue_Context *queue_context
0051 )
0052 {
0053 CORE_barrier_Control *the_barrier;
0054
0055 the_barrier = RTEMS_CONTAINER_OF(
0056 queue,
0057 CORE_barrier_Control,
0058 Wait_queue.Queue
0059 );
0060 --the_barrier->number_of_waiting_threads;
0061 _Thread_queue_FIFO_extract(
0062 &the_barrier->Wait_queue.Queue,
0063 the_thread,
0064 queue_context
0065 );
0066 }
0067
0068 const Thread_queue_Operations _CORE_barrier_Thread_queue_operations = {
0069 .priority_actions = _Thread_queue_Do_nothing_priority_actions,
0070 .enqueue = _Thread_queue_FIFO_enqueue,
0071 .extract = _CORE_barrier_Thread_queue_extract,
0072 .surrender = _Thread_queue_FIFO_surrender,
0073 .first = _Thread_queue_FIFO_first
0074 };
0075
0076 Status_Control _CORE_barrier_Seize(
0077 CORE_barrier_Control *the_barrier,
0078 Thread_Control *executing,
0079 bool wait,
0080 Thread_queue_Context *queue_context
0081 )
0082 {
0083 uint32_t new_number_of_waiting_threads;
0084
0085 _CORE_barrier_Acquire_critical( the_barrier, queue_context );
0086
0087
0088
0089
0090
0091
0092 new_number_of_waiting_threads = the_barrier->number_of_waiting_threads + 1;
0093
0094 if ( new_number_of_waiting_threads == the_barrier->maximum_count ) {
0095 _CORE_barrier_Surrender( the_barrier, queue_context );
0096 return STATUS_BARRIER_AUTOMATICALLY_RELEASED;
0097 } else {
0098 the_barrier->number_of_waiting_threads = new_number_of_waiting_threads;
0099 _Thread_queue_Context_set_thread_state(
0100 queue_context,
0101 STATES_WAITING_FOR_BARRIER
0102 );
0103 _Thread_queue_Enqueue(
0104 &the_barrier->Wait_queue.Queue,
0105 &_CORE_barrier_Thread_queue_operations,
0106 executing,
0107 queue_context
0108 );
0109 return _Thread_Wait_get_status( executing );
0110 }
0111 }