[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCHv2] [RFC 3/7] aio / timers: add ppoll support with qe
From: |
Alex Bligh |
Subject: |
[Qemu-devel] [PATCHv2] [RFC 3/7] aio / timers: add ppoll support with qemu_g_poll_ns |
Date: |
Sat, 20 Jul 2013 19:06:39 +0100 |
Add qemu_g_poll_ns which works like g_poll but takes a nanosecond
timeout.
Signed-off-by: Alex Bligh <address@hidden>
---
configure | 19 +++++++++++++++++++
qemu-timer.c | 24 ++++++++++++++++++++++++
2 files changed, 43 insertions(+)
diff --git a/configure b/configure
index 9e1cd19..b491c00 100755
--- a/configure
+++ b/configure
@@ -2801,6 +2801,22 @@ if compile_prog "" "" ; then
dup3=yes
fi
+# check for ppoll support
+ppoll=no
+cat > $TMPC << EOF
+#include <poll.h>
+
+int main(void)
+{
+ struct pollfd pfd = { .fd = 0, .events = 0, .revents = 0 };
+ ppoll(&pfd, 1, 0, 0);
+ return 0;
+}
+EOF
+if compile_prog "" "" ; then
+ ppoll=yes
+fi
+
# check for epoll support
epoll=no
cat > $TMPC << EOF
@@ -3792,6 +3808,9 @@ fi
if test "$dup3" = "yes" ; then
echo "CONFIG_DUP3=y" >> $config_host_mak
fi
+if test "$ppoll" = "yes" ; then
+ echo "CONFIG_PPOLL=y" >> $config_host_mak
+fi
if test "$epoll" = "yes" ; then
echo "CONFIG_EPOLL=y" >> $config_host_mak
fi
diff --git a/qemu-timer.c b/qemu-timer.c
index 2150782..5c576b4 100644
--- a/qemu-timer.c
+++ b/qemu-timer.c
@@ -33,6 +33,10 @@
#include <pthread.h>
#endif
+#ifdef CONFIG_PPOLL
+#include <poll.h>
+#endif
+
/***********************************************************/
/* timers */
@@ -181,6 +185,26 @@ int qemu_timeout_ns_to_ms(int64_t ns)
}
+/* qemu implementation of g_poll which uses a nanosecond timeout but is
+ * otherwise identical to g_poll
+ */
+gint qemu_g_poll_ns(GPollFD *fds, guint nfds, int64_t timeout)
+{
+#ifdef CONFIG_PPOLL
+ if (timeout < 0) {
+ return ppoll((struct pollfd *)fds, nfds, NULL, NULL);
+ } else {
+ struct timespec ts;
+ ts.tv_sec = timeout / 1000000000LL;
+ ts.tv_nsec = timeout % 1000000000LL;
+ return ppoll((struct pollfd *)fds, nfds, &ts, NULL);
+ }
+#else
+ return g_poll(fds, nfds, qemu_timeout_ns_to_ms(timeout));
+#endif
+}
+
+
QEMUTimer *qemu_new_timer(QEMUClock *clock, int scale,
QEMUTimerCB *cb, void *opaque)
{
--
1.7.9.5