int pthread_barrier_wait(
  pthread_barrier_t *barrier
)
{
  POSIX_Barrier_Control   *the_barrier = NULL;
  Objects_Locations        location;

  if ( !barrier )
    return EINVAL;

  the_barrier = _POSIX_Barrier_Get( barrier, &location );
  switch ( location ) {

    case OBJECTS_LOCAL:
      _CORE_barrier_Wait(
        &the_barrier->Barrier,
        the_barrier->Object.id,
        true,
        0,
        NULL
      );
      _Thread_Enable_dispatch();
      return _POSIX_Barrier_Translate_core_barrier_return_code(
                _Thread_Executing->Wait.return_code );

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

  return EINVAL;
}
Exemple #2
0
int pthread_barrier_wait(
  pthread_barrier_t *barrier
)
{
  POSIX_Barrier_Control *the_barrier;
  ISR_lock_Context       lock_context;
  Thread_Control        *executing;

  if ( barrier == NULL ) {
    return EINVAL;
  }

  the_barrier = _POSIX_Barrier_Get( barrier, &lock_context );

  if ( the_barrier == NULL ) {
    return EINVAL;
  }

  executing = _Thread_Executing;
  _CORE_barrier_Seize(
    &the_barrier->Barrier,
    executing,
    true,
    0,
    NULL,
    0,
    &lock_context
  );
  return _POSIX_Barrier_Translate_core_barrier_return_code(
    executing->Wait.return_code
  );
}