Commit f9a976b7 authored by Alex Bligh's avatar Alex Bligh Committed by Stefan Hajnoczi
Browse files

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: default avatarAlex Bligh <alex@alex.org.uk>
Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
parent cd758dd0
Loading
Loading
Loading
Loading
+19 −2
Original line number Diff line number Diff line
@@ -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);
+12 −6
Original line number Diff line number Diff line
@@ -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