Back to index

glibc  2.9
pthread_barrier_wait.c File Reference
#include <errno.h>
#include <sysdep.h>
#include <lowlevellock.h>
#include <pthreadP.h>
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.


int pthread_barrier_wait (pthread_barrier_t *barrier)

Function Documentation

int pthread_barrier_wait ( pthread_barrier_t *  barrier)

Definition at line 27 of file pthread_barrier_wait.c.

  union sparc_pthread_barrier *ibarrier
    = (union sparc_pthread_barrier *) barrier;
  int result = 0;
  int private = ibarrier->s.pshared ? LLL_SHARED : LLL_PRIVATE;

  /* Make sure we are alone.  */
  lll_lock (ibarrier->b.lock, private);

  /* One more arrival.  */

  /* Are these all?  */
  if (ibarrier->b.left == 0)
      /* Yes. Increment the event counter to avoid invalid wake-ups and
        tell the current waiters that it is their turn.  */

      /* Wake up everybody.  */
      lll_futex_wake (&ibarrier->b.curr_event, INT_MAX, private);

      /* This is the thread which finished the serialization.  */
      /* The number of the event we are waiting for.  The barrier's event
        number must be bumped before we continue.  */
      unsigned int event = ibarrier->b.curr_event;

      /* Before suspending, make the barrier available to others.  */
      lll_unlock (ibarrier->b.lock, private);

      /* Wait for the event counter of the barrier to change.  */
       lll_futex_wait (&ibarrier->b.curr_event, event, private);
      while (event == ibarrier->b.curr_event);

  /* Make sure the init_count is stored locally or in a register.  */
  unsigned int init_count = ibarrier->b.init_count;

  /* If this was the last woken thread, unlock.  */
  if (atomic_increment_val (&ibarrier->b.left) == init_count)
    /* We are done.  */
    lll_unlock (ibarrier->b.lock, private);

  return result;