qemu-timer: remove active_timers array

Embed the list in the QEMUClock instead.

Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2011-09-13 11:42:26 +02:00
parent 0abc2712b8
commit 688eb3896b

View File

@ -134,6 +134,7 @@ struct QEMUClock {
int enabled; int enabled;
QEMUTimer *warp_timer; QEMUTimer *warp_timer;
QEMUTimer *active_timers;
NotifierList reset_notifiers; NotifierList reset_notifiers;
int64_t last; int64_t last;
@ -352,14 +353,10 @@ next:
} }
} }
#define QEMU_NUM_CLOCKS 3
QEMUClock *rt_clock; QEMUClock *rt_clock;
QEMUClock *vm_clock; QEMUClock *vm_clock;
QEMUClock *host_clock; QEMUClock *host_clock;
static QEMUTimer *active_timers[QEMU_NUM_CLOCKS];
static QEMUClock *qemu_new_clock(int type) static QEMUClock *qemu_new_clock(int type)
{ {
QEMUClock *clock; QEMUClock *clock;
@ -403,7 +400,7 @@ static void icount_warp_rt(void *opaque)
int64_t delta = cur_time - cur_icount; int64_t delta = cur_time - cur_icount;
qemu_icount_bias += MIN(warp_delta, delta); qemu_icount_bias += MIN(warp_delta, delta);
} }
if (qemu_timer_expired(active_timers[QEMU_CLOCK_VIRTUAL], if (qemu_timer_expired(vm_clock->active_timers,
qemu_get_clock_ns(vm_clock))) { qemu_get_clock_ns(vm_clock))) {
qemu_notify_event(); qemu_notify_event();
} }
@ -434,7 +431,7 @@ void qemu_clock_warp(QEMUClock *clock)
* the earliest vm_clock timer. * the earliest vm_clock timer.
*/ */
icount_warp_rt(NULL); icount_warp_rt(NULL);
if (!all_cpu_threads_idle() || !active_timers[clock->type]) { if (!all_cpu_threads_idle() || !clock->active_timers) {
qemu_del_timer(clock->warp_timer); qemu_del_timer(clock->warp_timer);
return; return;
} }
@ -489,7 +486,7 @@ void qemu_del_timer(QEMUTimer *ts)
/* NOTE: this code must be signal safe because /* NOTE: this code must be signal safe because
qemu_timer_expired() can be called from a signal. */ qemu_timer_expired() can be called from a signal. */
pt = &active_timers[ts->clock->type]; pt = &ts->clock->active_timers;
for(;;) { for(;;) {
t = *pt; t = *pt;
if (!t) if (!t)
@ -513,7 +510,7 @@ static void qemu_mod_timer_ns(QEMUTimer *ts, int64_t expire_time)
/* add the timer in the sorted list */ /* add the timer in the sorted list */
/* NOTE: this code must be signal safe because /* NOTE: this code must be signal safe because
qemu_timer_expired() can be called from a signal. */ qemu_timer_expired() can be called from a signal. */
pt = &active_timers[ts->clock->type]; pt = &ts->clock->active_timers;
for(;;) { for(;;) {
t = *pt; t = *pt;
if (!qemu_timer_expired_ns(t, expire_time)) { if (!qemu_timer_expired_ns(t, expire_time)) {
@ -526,7 +523,7 @@ static void qemu_mod_timer_ns(QEMUTimer *ts, int64_t expire_time)
*pt = ts; *pt = ts;
/* Rearm if necessary */ /* Rearm if necessary */
if (pt == &active_timers[ts->clock->type]) { if (pt == &ts->clock->active_timers) {
if (!alarm_timer->pending) { if (!alarm_timer->pending) {
qemu_rearm_alarm_timer(alarm_timer); qemu_rearm_alarm_timer(alarm_timer);
} }
@ -548,7 +545,7 @@ void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
int qemu_timer_pending(QEMUTimer *ts) int qemu_timer_pending(QEMUTimer *ts)
{ {
QEMUTimer *t; QEMUTimer *t;
for(t = active_timers[ts->clock->type]; t != NULL; t = t->next) { for (t = ts->clock->active_timers; t != NULL; t = t->next) {
if (t == ts) if (t == ts)
return 1; return 1;
} }
@ -569,7 +566,7 @@ static void qemu_run_timers(QEMUClock *clock)
return; return;
current_time = qemu_get_clock_ns(clock); current_time = qemu_get_clock_ns(clock);
ptimer_head = &active_timers[clock->type]; ptimer_head = &clock->active_timers;
for(;;) { for(;;) {
ts = *ptimer_head; ts = *ptimer_head;
if (!qemu_timer_expired_ns(ts, current_time)) { if (!qemu_timer_expired_ns(ts, current_time)) {
@ -773,8 +770,8 @@ int64_t qemu_next_icount_deadline(void)
int64_t delta = INT32_MAX; int64_t delta = INT32_MAX;
assert(use_icount); assert(use_icount);
if (active_timers[QEMU_CLOCK_VIRTUAL]) { if (vm_clock->active_timers) {
delta = active_timers[QEMU_CLOCK_VIRTUAL]->expire_time - delta = vm_clock->active_timers->expire_time -
qemu_get_clock_ns(vm_clock); qemu_get_clock_ns(vm_clock);
} }
@ -789,20 +786,20 @@ static int64_t qemu_next_alarm_deadline(void)
int64_t delta; int64_t delta;
int64_t rtdelta; int64_t rtdelta;
if (!use_icount && active_timers[QEMU_CLOCK_VIRTUAL]) { if (!use_icount && vm_clock->active_timers) {
delta = active_timers[QEMU_CLOCK_VIRTUAL]->expire_time - delta = vm_clock->active_timers->expire_time -
qemu_get_clock_ns(vm_clock); qemu_get_clock_ns(vm_clock);
} else { } else {
delta = INT32_MAX; delta = INT32_MAX;
} }
if (active_timers[QEMU_CLOCK_HOST]) { if (host_clock->active_timers) {
int64_t hdelta = active_timers[QEMU_CLOCK_HOST]->expire_time - int64_t hdelta = host_clock->active_timers->expire_time -
qemu_get_clock_ns(host_clock); qemu_get_clock_ns(host_clock);
if (hdelta < delta) if (hdelta < delta)
delta = hdelta; delta = hdelta;
} }
if (active_timers[QEMU_CLOCK_REALTIME]) { if (rt_clock->active_timers) {
rtdelta = (active_timers[QEMU_CLOCK_REALTIME]->expire_time - rtdelta = (rt_clock->active_timers->expire_time -
qemu_get_clock_ns(rt_clock)); qemu_get_clock_ns(rt_clock));
if (rtdelta < delta) if (rtdelta < delta)
delta = rtdelta; delta = rtdelta;
@ -871,9 +868,9 @@ static void dynticks_rearm_timer(struct qemu_alarm_timer *t)
int64_t current_ns; int64_t current_ns;
assert(alarm_has_dynticks(t)); assert(alarm_has_dynticks(t));
if (!active_timers[QEMU_CLOCK_REALTIME] && if (!rt_clock->active_timers &&
!active_timers[QEMU_CLOCK_VIRTUAL] && !vm_clock->active_timers &&
!active_timers[QEMU_CLOCK_HOST]) !host_clock->active_timers)
return; return;
nearest_delta_ns = qemu_next_alarm_deadline(); nearest_delta_ns = qemu_next_alarm_deadline();
@ -925,9 +922,9 @@ static void unix_rearm_timer(struct qemu_alarm_timer *t)
int err; int err;
assert(alarm_has_dynticks(t)); assert(alarm_has_dynticks(t));
if (!active_timers[QEMU_CLOCK_REALTIME] && if (!rt_clock->active_timers &&
!active_timers[QEMU_CLOCK_VIRTUAL] && !vm_clock->active_timers &&
!active_timers[QEMU_CLOCK_HOST]) !host_clock->active_timers)
return; return;
nearest_delta_ns = qemu_next_alarm_deadline(); nearest_delta_ns = qemu_next_alarm_deadline();
@ -1022,9 +1019,9 @@ static void mm_rearm_timer(struct qemu_alarm_timer *t)
int nearest_delta_ms; int nearest_delta_ms;
assert(alarm_has_dynticks(t)); assert(alarm_has_dynticks(t));
if (!active_timers[QEMU_CLOCK_REALTIME] && if (!rt_clock->active_timers &&
!active_timers[QEMU_CLOCK_VIRTUAL] && !vm_clock->active_timers &&
!active_timers[QEMU_CLOCK_HOST]) { !host_clock->active_timers) {
return; return;
} }
@ -1092,9 +1089,9 @@ static void win32_rearm_timer(struct qemu_alarm_timer *t)
BOOLEAN success; BOOLEAN success;
assert(alarm_has_dynticks(t)); assert(alarm_has_dynticks(t));
if (!active_timers[QEMU_CLOCK_REALTIME] && if (!rt_clock->active_timers &&
!active_timers[QEMU_CLOCK_VIRTUAL] && !vm_clock->active_timers &&
!active_timers[QEMU_CLOCK_HOST]) !host_clock->active_timers)
return; return;
nearest_delta_ms = (qemu_next_alarm_deadline() + 999999) / 1000000; nearest_delta_ms = (qemu_next_alarm_deadline() + 999999) / 1000000;