epos_status_code epos_barrier_release(
  epos_id          id,
  uint32_t         *released
)
{
  Barrier_Control   *the_barrier;
  Objects_Locations  location;

  if ( !released )
    return RTEMS_INVALID_ADDRESS;

  the_barrier = _Barrier_Get( id, &location );
  switch ( location ) {

    case OBJECTS_LOCAL:
      *released = _CORE_barrier_Release( &the_barrier->Barrier, id, NULL );
      _Thread_Enable_dispatch();
      return RTEMS_SUCCESSFUL;

#if defined(RTEMS_MULTIPROCESSING)
    case OBJECTS_REMOTE:
#endif
    case OBJECTS_ERROR:
      break;
  }

  return RTEMS_INVALID_ID;
}
Example #2
0
void _CORE_barrier_Wait(
    CORE_barrier_Control                *the_barrier,
    Thread_Control                      *executing,
    Objects_Id                           id,
    bool                                 wait,
    Watchdog_Interval                    timeout,
    CORE_barrier_API_mp_support_callout  api_barrier_mp_support
)
{
    ISR_Level       level;

    executing->Wait.return_code = CORE_BARRIER_STATUS_SUCCESSFUL;
    _ISR_Disable( level );
    the_barrier->number_of_waiting_threads++;
    if ( _CORE_barrier_Is_automatic( &the_barrier->Attributes ) ) {
        if ( the_barrier->number_of_waiting_threads ==
                the_barrier->Attributes.maximum_count) {
            executing->Wait.return_code = CORE_BARRIER_STATUS_AUTOMATICALLY_RELEASED;
            _ISR_Enable( level );
            _CORE_barrier_Release( the_barrier, id, api_barrier_mp_support );
            return;
        }
    }

    _Thread_queue_Enter_critical_section( &the_barrier->Wait_queue );
    executing->Wait.queue          = &the_barrier->Wait_queue;
    executing->Wait.id             = id;
    _ISR_Enable( level );

    _Thread_queue_Enqueue( &the_barrier->Wait_queue, timeout );
}