mirror of
https://github.com/mii443/qemu.git
synced 2025-12-07 21:18:22 +00:00
timer: add timer_mod_anticipate and timer_mod_anticipate_ns
These let a user anticipate the deadline of a timer, atomically with other sites that call the function. This helps avoiding complicated lock hierarchies. Reviewed-by: Alex Bligh <alex@alex.org.uk> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
29
qemu-timer.c
29
qemu-timer.c
@@ -410,11 +410,40 @@ void timer_mod_ns(QEMUTimer *ts, int64_t expire_time)
|
||||
}
|
||||
}
|
||||
|
||||
/* modify the current timer so that it will be fired when current_time
|
||||
>= expire_time or the current deadline, whichever comes earlier.
|
||||
The corresponding callback will be called. */
|
||||
void timer_mod_anticipate_ns(QEMUTimer *ts, int64_t expire_time)
|
||||
{
|
||||
QEMUTimerList *timer_list = ts->timer_list;
|
||||
bool rearm;
|
||||
|
||||
qemu_mutex_lock(&timer_list->active_timers_lock);
|
||||
if (ts->expire_time == -1 || ts->expire_time > expire_time) {
|
||||
if (ts->expire_time != -1) {
|
||||
timer_del_locked(timer_list, ts);
|
||||
}
|
||||
rearm = timer_mod_ns_locked(timer_list, ts, expire_time);
|
||||
} else {
|
||||
rearm = false;
|
||||
}
|
||||
qemu_mutex_unlock(&timer_list->active_timers_lock);
|
||||
|
||||
if (rearm) {
|
||||
timerlist_rearm(timer_list);
|
||||
}
|
||||
}
|
||||
|
||||
void timer_mod(QEMUTimer *ts, int64_t expire_time)
|
||||
{
|
||||
timer_mod_ns(ts, expire_time * ts->scale);
|
||||
}
|
||||
|
||||
void timer_mod_anticipate(QEMUTimer *ts, int64_t expire_time)
|
||||
{
|
||||
timer_mod_anticipate_ns(ts, expire_time * ts->scale);
|
||||
}
|
||||
|
||||
bool timer_pending(QEMUTimer *ts)
|
||||
{
|
||||
return ts->expire_time >= 0;
|
||||
|
||||
Reference in New Issue
Block a user