[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 3/3] Restores record/replay behavior related to
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH 3/3] Restores record/replay behavior related to special virtual clock processing for timers used in external subsystems. |
Date: |
Mon, 15 Oct 2018 10:51:40 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.0 |
On 14/10/2018 16:55, Artem Pisarenko wrote:
> + qemu_mutex_lock(&timer_list->active_timers_lock);
> + ts = timer_list->active_timers;
> + while (timer_expired_ns(ts, current_time)) {
> + if (!(ts->attributes & QEMU_TIMER_ATTR(EXTERNAL))) {
> + need_replay_checkpoint = true;
> + break;
> + }
> + ts = ts->next;
> + }
> + qemu_mutex_unlock(&timer_list->active_timers_lock);
This can be applied to all the timerlists, it doesn't have to be limited
to the "virtual" clock, something like (untested):
qemu_mutex_lock(&timer_list->active_timers_lock);
current_time = qemu_clock_get_ns(timer_list->clock->type);
ts = timer_list->active_timers;
if (replay_mode != REPLAY_MODE_NONE) {
while (timer_expired_ns(ts, current_time)) {
if (!(ts->attributes & QEMU_TIMER_ATTR(EXTERNAL))) {
qemu_mutex_unlock(&timer_list->active_timers_lock);
timerlist_checkpoint(timer_list);
qemu_mutex_lock(&timer_list->active_timers_lock);
break;
}
ts = ts->next;
}
ts = timer_list->active_timers;
}
while (timer_expired_ns(ts, current_time)) {
/* remove timer from the list before calling the callback */
timer_list->active_timers = ts->next;
ts->next = NULL;
ts->expire_time = -1;
cb = ts->cb;
opaque = ts->opaque;
/* run the callback (the timer list can be modified) */
qemu_mutex_unlock(&timer_list->active_timers_lock);
cb(opaque);
qemu_mutex_lock(&timer_list->active_timers_lock);
progress = true;
ts = timer_list->active_timers;
}
qemu_mutex_unlock(&timer_list->active_timers_lock);
Thanks,
Paolo