summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/poll.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2011-04-18 12:00:05 +0000
committerCorinna Vinschen <corinna@vinschen.de>2011-04-18 12:00:05 +0000
commit20a0b8c8e6bd0ac540e5545de1d8185de01fd8bb (patch)
tree3409c50beb83b8aeadb4a4d9fca4f13939360aa6 /winsup/cygwin/poll.cc
parent0077cd1016c8414f6175f8e94f97be9ea4506bea (diff)
downloadcygnal-20a0b8c8e6bd0ac540e5545de1d8185de01fd8bb.tar.gz
cygnal-20a0b8c8e6bd0ac540e5545de1d8185de01fd8bb.tar.bz2
cygnal-20a0b8c8e6bd0ac540e5545de1d8185de01fd8bb.zip
* 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.cc23
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;
+}