Back to index

glibc  2.9
Functions
ppoll.c File Reference
#include <errno.h>
#include <limits.h>
#include <signal.h>
#include <stddef.h>
#include <sys/poll.h>
#include <sysdep-cancel.h>
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

int ppoll (struct pollfd *fds, nfds_t nfds, const struct timespec *timeout, const sigset_t *sigmask)
 LIBC_CANCEL_HANDLED ()

Function Documentation

int ppoll ( struct pollfd fds,
nfds_t  nfds,
const struct timespec timeout,
const sigset_t sigmask 
)

Definition at line 29 of file ppoll.c.

{
  int tval = -1;

  /* poll uses a simple millisecond value.  Convert it.  */
  if (timeout != NULL)
    {
      if (timeout->tv_sec < 0
         || timeout->tv_nsec < 0 || timeout->tv_nsec >= 1000000000)
       {
         __set_errno (EINVAL);
         return -1;
       }

      if (timeout->tv_sec > INT_MAX / 1000
         || (timeout->tv_sec == INT_MAX / 1000
             && ((timeout->tv_nsec + 999999) / 1000000 > INT_MAX % 1000)))
       /* We cannot represent the timeout in an int value.  Wait
          forever.  */
       tval = -1;
      else
       tval = (timeout->tv_sec * 1000
              + (timeout->tv_nsec + 999999) / 1000000);
    }

  /* The setting and restoring of the signal mask and the select call
     should be an atomic operation.  This can't be done without kernel
     help.  */
  sigset_t savemask;
  if (sigmask != NULL)
    __sigprocmask (SIG_SETMASK, sigmask, &savemask);

  /* Note the ppoll() is a cancellation point.  But since we call
     poll() which itself is a cancellation point we do not have
     to do anything here.  */
  int retval = __poll (fds, nfds, tval);

  if (sigmask != NULL)
    __sigprocmask (SIG_SETMASK, &savemask, NULL);

  return retval;
}

Here is the call graph for this function:

Here is the caller graph for this function: