aio / timers: add ppoll support with qemu_poll_ns
Add qemu_poll_ns which works like g_poll but takes a nanosecond timeout. Signed-off-by: Alex Bligh <alex@alex.org.uk> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
043a7e1f8f
commit
4e0c6529fc
19
configure
vendored
19
configure
vendored
@ -2818,6 +2818,22 @@ if compile_prog "" "" ; then
|
|||||||
dup3=yes
|
dup3=yes
|
||||||
fi
|
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
|
# check for epoll support
|
||||||
epoll=no
|
epoll=no
|
||||||
cat > $TMPC << EOF
|
cat > $TMPC << EOF
|
||||||
@ -3814,6 +3830,9 @@ fi
|
|||||||
if test "$dup3" = "yes" ; then
|
if test "$dup3" = "yes" ; then
|
||||||
echo "CONFIG_DUP3=y" >> $config_host_mak
|
echo "CONFIG_DUP3=y" >> $config_host_mak
|
||||||
fi
|
fi
|
||||||
|
if test "$ppoll" = "yes" ; then
|
||||||
|
echo "CONFIG_PPOLL=y" >> $config_host_mak
|
||||||
|
fi
|
||||||
if test "$epoll" = "yes" ; then
|
if test "$epoll" = "yes" ; then
|
||||||
echo "CONFIG_EPOLL=y" >> $config_host_mak
|
echo "CONFIG_EPOLL=y" >> $config_host_mak
|
||||||
fi
|
fi
|
||||||
|
@ -63,6 +63,18 @@ int64_t qemu_clock_deadline_ns(QEMUClock *clock);
|
|||||||
*/
|
*/
|
||||||
int qemu_timeout_ns_to_ms(int64_t ns);
|
int qemu_timeout_ns_to_ms(int64_t ns);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qemu_poll_ns:
|
||||||
|
* @fds: Array of file descriptors
|
||||||
|
* @nfds: number of file descriptors
|
||||||
|
* @timeout: timeout in nanoseconds
|
||||||
|
*
|
||||||
|
* Perform a poll like g_poll but with a timeout in nanoseconds.
|
||||||
|
* See g_poll documentation for further details.
|
||||||
|
*
|
||||||
|
* Returns: number of fds ready
|
||||||
|
*/
|
||||||
|
int qemu_poll_ns(GPollFD *fds, guint nfds, int64_t timeout);
|
||||||
void qemu_clock_enable(QEMUClock *clock, bool enabled);
|
void qemu_clock_enable(QEMUClock *clock, bool enabled);
|
||||||
void qemu_clock_warp(QEMUClock *clock);
|
void qemu_clock_warp(QEMUClock *clock);
|
||||||
|
|
||||||
|
24
qemu-timer.c
24
qemu-timer.c
@ -37,6 +37,10 @@
|
|||||||
#include <mmsystem.h>
|
#include <mmsystem.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_PPOLL
|
||||||
|
#include <poll.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
/***********************************************************/
|
/***********************************************************/
|
||||||
/* timers */
|
/* timers */
|
||||||
|
|
||||||
@ -323,6 +327,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, 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,
|
QEMUTimer *qemu_new_timer(QEMUClock *clock, int scale,
|
||||||
QEMUTimerCB *cb, void *opaque)
|
QEMUTimerCB *cb, void *opaque)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user