mirror of https://github.com/xemu-project/xemu.git
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>
This commit is contained in:
parent
cd758dd0ac
commit
f9a976b740
|
@ -92,8 +92,25 @@ bool timer_pending(QEMUTimer *ts);
|
||||||
bool timer_expired(QEMUTimer *timer_head, int64_t current_time);
|
bool timer_expired(QEMUTimer *timer_head, int64_t current_time);
|
||||||
uint64_t timer_expire_time_ns(QEMUTimer *ts);
|
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 configure_alarms(char const *opt);
|
||||||
void init_clocks(void);
|
void init_clocks(void);
|
||||||
int init_timer_alarm(void);
|
int init_timer_alarm(void);
|
||||||
|
|
18
qemu-timer.c
18
qemu-timer.c
|
@ -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);
|
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;
|
QEMUTimer *ts;
|
||||||
int64_t current_time;
|
int64_t current_time;
|
||||||
|
bool progress = false;
|
||||||
|
|
||||||
if (!clock->enabled)
|
if (!clock->enabled)
|
||||||
return;
|
return progress;
|
||||||
|
|
||||||
current_time = qemu_get_clock_ns(clock);
|
current_time = qemu_get_clock_ns(clock);
|
||||||
for(;;) {
|
for(;;) {
|
||||||
|
@ -466,7 +467,9 @@ void qemu_run_timers(QEMUClock *clock)
|
||||||
|
|
||||||
/* run the callback (the timer list can be modified) */
|
/* run the callback (the timer list can be modified) */
|
||||||
ts->cb(ts->opaque);
|
ts->cb(ts->opaque);
|
||||||
|
progress = true;
|
||||||
}
|
}
|
||||||
|
return progress;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t qemu_get_clock_ns(QEMUClock *clock)
|
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;
|
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;
|
alarm_timer->pending = false;
|
||||||
|
|
||||||
/* vm time timers */
|
/* vm time timers */
|
||||||
qemu_run_timers(vm_clock);
|
progress |= qemu_run_timers(vm_clock);
|
||||||
qemu_run_timers(rt_clock);
|
progress |= qemu_run_timers(rt_clock);
|
||||||
qemu_run_timers(host_clock);
|
progress |= qemu_run_timers(host_clock);
|
||||||
|
|
||||||
/* rearm timer, if not periodic */
|
/* rearm timer, if not periodic */
|
||||||
if (alarm_timer->expired) {
|
if (alarm_timer->expired) {
|
||||||
alarm_timer->expired = false;
|
alarm_timer->expired = false;
|
||||||
qemu_rearm_alarm_timer(alarm_timer);
|
qemu_rearm_alarm_timer(alarm_timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return progress;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
Loading…
Reference in New Issue