From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52166) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V2mu5-00036q-Hv for qemu-devel@nongnu.org; Fri, 26 Jul 2013 14:38:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V2mu2-0004Aa-O3 for qemu-devel@nongnu.org; Fri, 26 Jul 2013 14:38:13 -0400 Received: from mail.avalus.com ([2001:41c8:10:1dd::10]:48796) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V2mu2-000493-G4 for qemu-devel@nongnu.org; Fri, 26 Jul 2013 14:38:10 -0400 From: Alex Bligh Date: Fri, 26 Jul 2013 19:37:31 +0100 Message-Id: <1374863862-32517-3-git-send-email-alex@alex.org.uk> In-Reply-To: <1374863862-32517-1-git-send-email-alex@alex.org.uk> References: <34B083D4DB6D2988A571E420@nimrod.local> <1374863862-32517-1-git-send-email-alex@alex.org.uk> Subject: [Qemu-devel] [RFC] [PATCHv4 02/13] aio / timers: add ppoll support with qemu_poll_ns List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Anthony Liguori , Alex Bligh , Stefan Hajnoczi , Paolo Bonzini , rth@twiddle.net Add qemu_poll_ns which works like g_poll but takes a nanosecond timeout. Signed-off-by: Alex Bligh --- configure | 19 +++++++++++++++++++ include/qemu/timer.h | 1 + qemu-timer.c | 24 ++++++++++++++++++++++++ 3 files changed, 44 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 + +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/include/qemu/timer.h b/include/qemu/timer.h index 6171db3..f434ecb 100644 --- a/include/qemu/timer.h +++ b/include/qemu/timer.h @@ -44,6 +44,7 @@ int64_t qemu_clock_expired(QEMUClock *clock); int64_t qemu_clock_deadline(QEMUClock *clock); int64_t qemu_clock_deadline_ns(QEMUClock *clock); int qemu_timeout_ns_to_ms(int64_t ns); +int qemu_poll_ns(GPollFD *fds, uint nfds, int64_t timeout); void qemu_clock_enable(QEMUClock *clock, bool enabled); void qemu_clock_warp(QEMUClock *clock); diff --git a/qemu-timer.c b/qemu-timer.c index 3dfbdbf..b57bd78 100644 --- a/qemu-timer.c +++ b/qemu-timer.c @@ -37,6 +37,10 @@ #include #endif +#ifdef CONFIG_PPOLL +#include +#endif + /***********************************************************/ /* timers */ @@ -328,6 +332,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 + */ +int qemu_poll_ns(GPollFD *fds, uint 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