/* modify the current timer so that it will be fired when current_time >= expire_time. The corresponding callback will be called. */ static void qemu_mod_timer_ns(QEMUTimer *ts, int64_t expire_time) { QEMUTimer **pt, *t; qemu_del_timer(ts); /* add the timer in the sorted list */ /* NOTE: this code must be signal safe because qemu_timer_expired() can be called from a signal. */ pt = &active_timers[ts->clock->type]; for(;;) { t = *pt; if (!qemu_timer_expired_ns(t, expire_time)) { break; } pt = &t->next; } ts->expire_time = expire_time; ts->next = *pt; *pt = ts; /* Rearm if necessary */ if (pt == &active_timers[ts->clock->type]) { if (!alarm_timer->pending) { qemu_rearm_alarm_timer(alarm_timer); } /* Interrupt execution to force deadline recalculation. */ qemu_clock_warp(ts->clock); if (use_icount) { qemu_notify_event(); } } }
static void qemu_run_timers(QEMUClock *clock) { QEMUTimer **ptimer_head, *ts; int64_t current_time; DVERYDETAIL{ printf("in qemu_run_timers\n"); fflush(stdout); } if (!clock->enabled) return; current_time = qemu_get_clock_ns(clock); ptimer_head = &clock->active_timers; for(;;) { ts = *ptimer_head; if (!qemu_timer_expired_ns(ts, current_time)) { break; } DVERYDETAIL{ printf("in qemu_run_timers: in loop after chk expiration\n"); fflush(stdout); } /* remove timer from the list before calling the callback */ *ptimer_head = ts->next; ts->next = NULL; DVERYDETAIL{ printf("in qemu_run_timers: in loop about to call back\n"); fflush(stdout); } /* run the callback (the timer list can be modified) */ ts->cb(ts->opaque); } }
static void qemu_run_timers(QEMUClock *clock) { QEMUTimer **ptimer_head, *ts; int64_t current_time; if (!clock->enabled) return; current_time = qemu_get_clock_ns(clock); ptimer_head = &active_timers[clock->type]; for(;;) { ts = *ptimer_head; if (!qemu_timer_expired_ns(ts, current_time)) { break; } /* remove timer from the list before calling the callback */ *ptimer_head = ts->next; ts->next = NULL; /* run the callback (the timer list can be modified) */ ts->cb(ts->opaque); } }
int qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time) { return qemu_timer_expired_ns(timer_head, current_time * timer_head->scale); }