diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2011-04-18 16:00:05 +0400 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2011-04-18 16:00:05 +0400 |
commit | 20a0b8c8e6bd0ac540e5545de1d8185de01fd8bb (patch) | |
tree | 3409c50beb83b8aeadb4a4d9fca4f13939360aa6 /winsup/cygwin/poll.cc | |
parent | 0077cd1016c8414f6175f8e94f97be9ea4506bea (diff) |
* cygwin.din (ppoll): Export.
* poll.cc (ppoll): Implement.
* posix.sgml (std-gnu): Add ppoll.
* include/cygwin/version.h: Bump API minor number.
* include/sys/poll.h (ppoll): Declare.
Diffstat (limited to 'winsup/cygwin/poll.cc')
-rw-r--r-- | winsup/cygwin/poll.cc | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/winsup/cygwin/poll.cc b/winsup/cygwin/poll.cc index 2e68f3249..3c342adfd 100644 --- a/winsup/cygwin/poll.cc +++ b/winsup/cygwin/poll.cc @@ -21,6 +21,8 @@ #include "fhandler.h" #include "dtable.h" #include "cygheap.h" +#include "pinfo.h" +#include "sigproc.h" extern "C" int poll (struct pollfd *fds, nfds_t nfds, int timeout) @@ -124,3 +126,24 @@ poll (struct pollfd *fds, nfds_t nfds, int timeout) return ret; } + +extern "C" int +ppoll (struct pollfd *fds, nfds_t nfds, const struct timespec *timeout_ts, + const sigset_t *sigmask) +{ + int timeout; + sigset_t oldset = _my_tls.sigmask; + + myfault efault; + if (efault.faulted (EFAULT)) + return -1; + timeout = (timeout_ts == NULL) + ? -1 + : (timeout_ts->tv_sec * 1000 + timeout_ts->tv_nsec / 1000000); + if (sigmask) + set_signal_mask (*sigmask, _my_tls.sigmask); + int ret = poll (fds, nfds, timeout); + if (sigmask) + set_signal_mask (oldset, _my_tls.sigmask); + return ret; +} |