summaryrefslogtreecommitdiffstats
path: root/osdep
diff options
context:
space:
mode:
Diffstat (limited to 'osdep')
-rw-r--r--osdep/poll_wrapper.c11
-rw-r--r--osdep/poll_wrapper.h5
2 files changed, 16 insertions, 0 deletions
diff --git a/osdep/poll_wrapper.c b/osdep/poll_wrapper.c
index e4ad0f698a..48a66d2cd1 100644
--- a/osdep/poll_wrapper.c
+++ b/osdep/poll_wrapper.c
@@ -20,9 +20,20 @@
#include <sys/select.h>
#include <stdio.h>
+#include "config.h"
#include "poll_wrapper.h"
+#include "timer.h"
+int mp_poll(struct pollfd *fds, int nfds, int64_t timeout_ns)
+{
+#if HAVE_PPOLL
+ struct timespec ts = mp_time_ns_to_realtime(timeout_ns);
+ return ppoll(fds, nfds, &ts, NULL);
+#endif
+ return poll(fds, nfds, timeout_ns / 1e6);
+}
+
// poll shim that supports device files on macOS.
int polldev(struct pollfd fds[], nfds_t nfds, int timeout)
{
diff --git a/osdep/poll_wrapper.h b/osdep/poll_wrapper.h
index 8593c1e77c..b359ed39a0 100644
--- a/osdep/poll_wrapper.h
+++ b/osdep/poll_wrapper.h
@@ -1,7 +1,12 @@
#pragma once
#include <poll.h>
+#include <stdint.h>
// Behaves like poll(3) but works for device files on macOS.
// Only supports POLLIN and POLLOUT.
int polldev(struct pollfd fds[], nfds_t nfds, int timeout);
+
+// Generic polling wrapper. It will try and use higher resolution
+// polling (ppoll) if available.
+int mp_poll(struct pollfd *fds, int nfds, int64_t timeout_ns);