Back to index

glibc  2.9
Functions
sem_wait.c File Reference
#include <errno.h>
#include <sysdep.h>
#include <lowlevellock.h>
#include <internaltypes.h>
#include <semaphore.h>
#include <pthreadP.h>
#include <shlib-compat.h>
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

void attribute_hidden __sem_wait_cleanup (void *arg)
int __new_sem_wait (sem_t *sem)
 versioned_symbol (libpthread, __new_sem_wait, sem_wait, GLIBC_2_1)

Function Documentation

int __new_sem_wait ( sem_t sem)

Definition at line 42 of file sem_wait.c.

{
  struct sparc_new_sem *isem = (struct sparc_new_sem *) sem;
  int err;

  if (atomic_decrement_if_positive (&isem->value) > 0)
    return 0;

  atomic_increment (&isem->nwaiters);

  pthread_cleanup_push (__sem_wait_cleanup, isem);

  while (1)
    {
      /* Enable asynchronous cancellation.  Required by the standard.  */
      int oldtype = __pthread_enable_asynccancel ();

      err = lll_futex_wait (&isem->value, 0,
                         isem->private ^ FUTEX_PRIVATE_FLAG);

      /* Disable asynchronous cancellation.  */
      __pthread_disable_asynccancel (oldtype);

      if (err != 0 && err != -EWOULDBLOCK)
       {
         __set_errno (-err);
         err = -1;
         break;
       }

      if (atomic_decrement_if_positive (&isem->value) > 0)
       {
         err = 0;
         break;
       }
    }

  pthread_cleanup_pop (0);

  atomic_decrement (&isem->nwaiters);

  return err;
}

Here is the call graph for this function:

void attribute_hidden __sem_wait_cleanup ( void *  arg)

Definition at line 33 of file sem_wait.c.

{
  struct sparc_new_sem *isem = (struct sparc_new_sem *) arg;

  atomic_decrement (&isem->nwaiters);
}
versioned_symbol ( libpthread  ,
__new_sem_wait  ,
sem_wait  ,
GLIBC_2_1   
)