aboutsummaryrefslogtreecommitdiff
path: root/vl.c
diff options
context:
space:
mode:
authorbalrog <balrog@c046a42c-6fe2-441c-8c8c-71466251a162>2008-01-05 19:41:47 +0000
committerbalrog <balrog@c046a42c-6fe2-441c-8c8c-71466251a162>2008-01-05 19:41:47 +0000
commitd5d08334d4f18e98a4a47a6a747ddb540e1106e7 (patch)
treec11f3708d60825f92d8be733ce6dfd0f6412986e /vl.c
parent6d1f1778319aa03e57f80dd1aed88f80abb9b03b (diff)
downloadqemu-d5d08334d4f18e98a4a47a6a747ddb540e1106e7.zip
qemu-d5d08334d4f18e98a4a47a6a747ddb540e1106e7.tar.gz
qemu-d5d08334d4f18e98a4a47a6a747ddb540e1106e7.tar.bz2
Rearm timers in qemu_mod_timer when needed (Anders Melchiorsen).
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3890 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'vl.c')
-rw-r--r--vl.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/vl.c b/vl.c
index 129166d..f1c139e 100644
--- a/vl.c
+++ b/vl.c
@@ -822,7 +822,7 @@ struct qemu_alarm_timer {
};
#define ALARM_FLAG_DYNTICKS 0x1
-#define ALARM_FLAG_MODIFIED 0x2
+#define ALARM_FLAG_EXPIRED 0x2
static inline int alarm_has_dynticks(struct qemu_alarm_timer *t)
{
@@ -834,11 +834,6 @@ static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t)
if (!alarm_has_dynticks(t))
return;
- if (!(t->flags & ALARM_FLAG_MODIFIED))
- return;
-
- t->flags &= ~(ALARM_FLAG_MODIFIED);
-
t->rearm(t);
}
@@ -1001,8 +996,6 @@ void qemu_del_timer(QEMUTimer *ts)
{
QEMUTimer **pt, *t;
- alarm_timer->flags |= ALARM_FLAG_MODIFIED;
-
/* NOTE: this code must be signal safe because
qemu_timer_expired() can be called from a signal. */
pt = &active_timers[ts->clock->type];
@@ -1041,6 +1034,11 @@ void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
ts->expire_time = expire_time;
ts->next = *pt;
*pt = ts;
+
+ /* Rearm if necessary */
+ if ((alarm_timer->flags & ALARM_FLAG_EXPIRED) == 0 &&
+ pt == &active_timers[ts->clock->type])
+ qemu_rearm_alarm_timer(alarm_timer);
}
int qemu_timer_pending(QEMUTimer *ts)
@@ -1193,8 +1191,9 @@ static void host_alarm_handler(int host_signum)
#endif
CPUState *env = next_cpu;
+ alarm_timer->flags |= ALARM_FLAG_EXPIRED;
+
if (env) {
- alarm_timer->flags |= ALARM_FLAG_MODIFIED;
/* stop the currently executing cpu because a timer occured */
cpu_interrupt(env, CPU_INTERRUPT_EXIT);
#ifdef USE_KQEMU
@@ -1379,7 +1378,7 @@ static void dynticks_rearm_timer(struct qemu_alarm_timer *t)
if (!active_timers[QEMU_TIMER_REALTIME] &&
!active_timers[QEMU_TIMER_VIRTUAL])
- return;
+ return;
nearest_delta_us = qemu_next_deadline();
@@ -1506,7 +1505,7 @@ static void win32_rearm_timer(struct qemu_alarm_timer *t)
if (!active_timers[QEMU_TIMER_REALTIME] &&
!active_timers[QEMU_TIMER_VIRTUAL])
- return;
+ return;
nearest_delta_us = qemu_next_deadline();
nearest_delta_us /= 1000;
@@ -7396,7 +7395,10 @@ void main_loop_wait(int timeout)
qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME],
qemu_get_clock(rt_clock));
- qemu_rearm_alarm_timer(alarm_timer);
+ if (alarm_timer->flags & ALARM_FLAG_EXPIRED) {
+ alarm_timer->flags &= ~(ALARM_FLAG_EXPIRED);
+ qemu_rearm_alarm_timer(alarm_timer);
+ }
/* Check bottom-halves last in case any of the earlier events triggered
them. */