Commit d5d08334d4f18e98a4a47a6a747ddb540e1106e7
1 parent
6d1f1778
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
Showing
1 changed file
with
14 additions
and
12 deletions
vl.c
| @@ -822,7 +822,7 @@ struct qemu_alarm_timer { | @@ -822,7 +822,7 @@ struct qemu_alarm_timer { | ||
| 822 | }; | 822 | }; |
| 823 | 823 | ||
| 824 | #define ALARM_FLAG_DYNTICKS 0x1 | 824 | #define ALARM_FLAG_DYNTICKS 0x1 |
| 825 | -#define ALARM_FLAG_MODIFIED 0x2 | 825 | +#define ALARM_FLAG_EXPIRED 0x2 |
| 826 | 826 | ||
| 827 | static inline int alarm_has_dynticks(struct qemu_alarm_timer *t) | 827 | static inline int alarm_has_dynticks(struct qemu_alarm_timer *t) |
| 828 | { | 828 | { |
| @@ -834,11 +834,6 @@ static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t) | @@ -834,11 +834,6 @@ static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t) | ||
| 834 | if (!alarm_has_dynticks(t)) | 834 | if (!alarm_has_dynticks(t)) |
| 835 | return; | 835 | return; |
| 836 | 836 | ||
| 837 | - if (!(t->flags & ALARM_FLAG_MODIFIED)) | ||
| 838 | - return; | ||
| 839 | - | ||
| 840 | - t->flags &= ~(ALARM_FLAG_MODIFIED); | ||
| 841 | - | ||
| 842 | t->rearm(t); | 837 | t->rearm(t); |
| 843 | } | 838 | } |
| 844 | 839 | ||
| @@ -1001,8 +996,6 @@ void qemu_del_timer(QEMUTimer *ts) | @@ -1001,8 +996,6 @@ void qemu_del_timer(QEMUTimer *ts) | ||
| 1001 | { | 996 | { |
| 1002 | QEMUTimer **pt, *t; | 997 | QEMUTimer **pt, *t; |
| 1003 | 998 | ||
| 1004 | - alarm_timer->flags |= ALARM_FLAG_MODIFIED; | ||
| 1005 | - | ||
| 1006 | /* NOTE: this code must be signal safe because | 999 | /* NOTE: this code must be signal safe because |
| 1007 | qemu_timer_expired() can be called from a signal. */ | 1000 | qemu_timer_expired() can be called from a signal. */ |
| 1008 | pt = &active_timers[ts->clock->type]; | 1001 | pt = &active_timers[ts->clock->type]; |
| @@ -1041,6 +1034,11 @@ void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time) | @@ -1041,6 +1034,11 @@ void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time) | ||
| 1041 | ts->expire_time = expire_time; | 1034 | ts->expire_time = expire_time; |
| 1042 | ts->next = *pt; | 1035 | ts->next = *pt; |
| 1043 | *pt = ts; | 1036 | *pt = ts; |
| 1037 | + | ||
| 1038 | + /* Rearm if necessary */ | ||
| 1039 | + if ((alarm_timer->flags & ALARM_FLAG_EXPIRED) == 0 && | ||
| 1040 | + pt == &active_timers[ts->clock->type]) | ||
| 1041 | + qemu_rearm_alarm_timer(alarm_timer); | ||
| 1044 | } | 1042 | } |
| 1045 | 1043 | ||
| 1046 | int qemu_timer_pending(QEMUTimer *ts) | 1044 | int qemu_timer_pending(QEMUTimer *ts) |
| @@ -1193,8 +1191,9 @@ static void host_alarm_handler(int host_signum) | @@ -1193,8 +1191,9 @@ static void host_alarm_handler(int host_signum) | ||
| 1193 | #endif | 1191 | #endif |
| 1194 | CPUState *env = next_cpu; | 1192 | CPUState *env = next_cpu; |
| 1195 | 1193 | ||
| 1194 | + alarm_timer->flags |= ALARM_FLAG_EXPIRED; | ||
| 1195 | + | ||
| 1196 | if (env) { | 1196 | if (env) { |
| 1197 | - alarm_timer->flags |= ALARM_FLAG_MODIFIED; | ||
| 1198 | /* stop the currently executing cpu because a timer occured */ | 1197 | /* stop the currently executing cpu because a timer occured */ |
| 1199 | cpu_interrupt(env, CPU_INTERRUPT_EXIT); | 1198 | cpu_interrupt(env, CPU_INTERRUPT_EXIT); |
| 1200 | #ifdef USE_KQEMU | 1199 | #ifdef USE_KQEMU |
| @@ -1379,7 +1378,7 @@ static void dynticks_rearm_timer(struct qemu_alarm_timer *t) | @@ -1379,7 +1378,7 @@ static void dynticks_rearm_timer(struct qemu_alarm_timer *t) | ||
| 1379 | 1378 | ||
| 1380 | if (!active_timers[QEMU_TIMER_REALTIME] && | 1379 | if (!active_timers[QEMU_TIMER_REALTIME] && |
| 1381 | !active_timers[QEMU_TIMER_VIRTUAL]) | 1380 | !active_timers[QEMU_TIMER_VIRTUAL]) |
| 1382 | - return; | 1381 | + return; |
| 1383 | 1382 | ||
| 1384 | nearest_delta_us = qemu_next_deadline(); | 1383 | nearest_delta_us = qemu_next_deadline(); |
| 1385 | 1384 | ||
| @@ -1506,7 +1505,7 @@ static void win32_rearm_timer(struct qemu_alarm_timer *t) | @@ -1506,7 +1505,7 @@ static void win32_rearm_timer(struct qemu_alarm_timer *t) | ||
| 1506 | 1505 | ||
| 1507 | if (!active_timers[QEMU_TIMER_REALTIME] && | 1506 | if (!active_timers[QEMU_TIMER_REALTIME] && |
| 1508 | !active_timers[QEMU_TIMER_VIRTUAL]) | 1507 | !active_timers[QEMU_TIMER_VIRTUAL]) |
| 1509 | - return; | 1508 | + return; |
| 1510 | 1509 | ||
| 1511 | nearest_delta_us = qemu_next_deadline(); | 1510 | nearest_delta_us = qemu_next_deadline(); |
| 1512 | nearest_delta_us /= 1000; | 1511 | nearest_delta_us /= 1000; |
| @@ -7396,7 +7395,10 @@ void main_loop_wait(int timeout) | @@ -7396,7 +7395,10 @@ void main_loop_wait(int timeout) | ||
| 7396 | qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME], | 7395 | qemu_run_timers(&active_timers[QEMU_TIMER_REALTIME], |
| 7397 | qemu_get_clock(rt_clock)); | 7396 | qemu_get_clock(rt_clock)); |
| 7398 | 7397 | ||
| 7399 | - qemu_rearm_alarm_timer(alarm_timer); | 7398 | + if (alarm_timer->flags & ALARM_FLAG_EXPIRED) { |
| 7399 | + alarm_timer->flags &= ~(ALARM_FLAG_EXPIRED); | ||
| 7400 | + qemu_rearm_alarm_timer(alarm_timer); | ||
| 7401 | + } | ||
| 7400 | 7402 | ||
| 7401 | /* Check bottom-halves last in case any of the earlier events triggered | 7403 | /* Check bottom-halves last in case any of the earlier events triggered |
| 7402 | them. */ | 7404 | them. */ |