mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-29 05:40:23 -04:00
mainloop, glib-mainloop: time_restart could cause incorrect event ordering
This fixes a bug where calling time_restart can leave the current event in the cache, even though the restart scheduled the event in the future. This would cause the event to get executed more frequently than it should.
This commit is contained in:
parent
81f0eb626e
commit
68156d3f79
2 changed files with 8 additions and 4 deletions
|
|
@ -328,13 +328,15 @@ static void glib_time_restart(pa_time_event*e, const struct timeval *tv) {
|
|||
if ((e->enabled = !!tv))
|
||||
e->timeval = *tv;
|
||||
|
||||
if (e->mainloop->cached_next_time_event == e)
|
||||
e->mainloop->cached_next_time_event = NULL;
|
||||
|
||||
if (e->mainloop->cached_next_time_event && e->enabled) {
|
||||
g_assert(e->mainloop->cached_next_time_event->enabled);
|
||||
|
||||
if (pa_timeval_cmp(tv, &e->mainloop->cached_next_time_event->timeval) < 0)
|
||||
e->mainloop->cached_next_time_event = e;
|
||||
} else if (e->mainloop->cached_next_time_event == e)
|
||||
e->mainloop->cached_next_time_event = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void glib_time_free(pa_time_event *e) {
|
||||
|
|
|
|||
|
|
@ -379,13 +379,15 @@ static void mainloop_time_restart(pa_time_event *e, const struct timeval *tv) {
|
|||
pa_mainloop_wakeup(e->mainloop);
|
||||
}
|
||||
|
||||
if (e->mainloop->cached_next_time_event == e)
|
||||
e->mainloop->cached_next_time_event = NULL;
|
||||
|
||||
if (e->mainloop->cached_next_time_event && e->enabled) {
|
||||
pa_assert(e->mainloop->cached_next_time_event->enabled);
|
||||
|
||||
if (t < e->mainloop->cached_next_time_event->time)
|
||||
e->mainloop->cached_next_time_event = e;
|
||||
} else if (e->mainloop->cached_next_time_event == e)
|
||||
e->mainloop->cached_next_time_event = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void mainloop_time_free(pa_time_event *e) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue