Add qemu_g_poll_ns which works like g_poll but takes a nanosecond timeout. Signed-off-by: Alex Bligh <a...@alex.org.uk> --- 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