aio / timers: Make qemu_run_timers and qemu_run_all_timers return progress

Make qemu_run_timers and qemu_run_all_timers return progress
so that aio_poll etc. can determine whether a timer has been
run.

Signed-off-by: Alex Bligh <alex@alex.org.uk>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
master
Alex Bligh 2013-08-21 16:02:45 +01:00 committed by Stefan Hajnoczi
parent cd758dd0ac
commit f9a976b740
2 changed files with 31 additions and 8 deletions

View File

@ -92,8 +92,25 @@ bool timer_pending(QEMUTimer *ts);
bool timer_expired(QEMUTimer *timer_head, int64_t current_time);
uint64_t timer_expire_time_ns(QEMUTimer *ts);
void qemu_run_timers(QEMUClock *clock);
void qemu_run_all_timers(void);
/**
* qemu_run_timers:
* @clock: clock on which to operate
*
* Run all the timers associated with a clock.
*
* Returns: true if any timer ran.
*/
bool qemu_run_timers(QEMUClock *clock);
/**
* qemu_run_all_timers:
*
* Run all the timers associated with every clock.
*
* Returns: true if any timer ran.
*/
bool qemu_run_all_timers(void);
void configure_alarms(char const *opt);
void init_clocks(void);
int init_timer_alarm(void);

View File

@ -446,13 +446,14 @@ bool timer_expired(QEMUTimer *timer_head, int64_t current_time)
return timer_expired_ns(timer_head, current_time * timer_head->scale);
}
void qemu_run_timers(QEMUClock *clock)
bool qemu_run_timers(QEMUClock *clock)
{
QEMUTimer *ts;
int64_t current_time;
bool progress = false;
if (!clock->enabled)
return;
return progress;
current_time = qemu_get_clock_ns(clock);
for(;;) {
@ -466,7 +467,9 @@ void qemu_run_timers(QEMUClock *clock)
/* run the callback (the timer list can be modified) */
ts->cb(ts->opaque);
progress = true;
}
return progress;
}
int64_t qemu_get_clock_ns(QEMUClock *clock)
@ -521,20 +524,23 @@ uint64_t timer_expire_time_ns(QEMUTimer *ts)
return timer_pending(ts) ? ts->expire_time : -1;
}
void qemu_run_all_timers(void)
bool qemu_run_all_timers(void)
{
bool progress = false;
alarm_timer->pending = false;
/* vm time timers */
qemu_run_timers(vm_clock);
qemu_run_timers(rt_clock);
qemu_run_timers(host_clock);
progress |= qemu_run_timers(vm_clock);
progress |= qemu_run_timers(rt_clock);
progress |= qemu_run_timers(host_clock);
/* rearm timer, if not periodic */
if (alarm_timer->expired) {
alarm_timer->expired = false;
qemu_rearm_alarm_timer(alarm_timer);
}
return progress;
}
#ifdef _WIN32