[pulseaudio-discuss] [PATCH] mainloop, glib-mainloop: time_restart could cause incorrect event ordering
Ben Brewer
ben.brewer at codethink.co.uk
Fri Oct 25 16:25:32 CEST 2013
Hey,
I sent this patch a few months ago, could someone take a look at it?
Thanks,
Ben
On 25/07/13 13:44, Ben Brewer wrote:
> From: Ben Brewer <benbrewer at codethink.co.uk>
>
> 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.
> ---
> src/pulse/glib-mainloop.c | 6 ++++--
> src/pulse/mainloop.c | 6 ++++--
> 2 files changed, 8 insertions(+), 4 deletions(-)
>
> diff --git a/src/pulse/glib-mainloop.c b/src/pulse/glib-mainloop.c
> index bd24913..34f3556 100644
> --- a/src/pulse/glib-mainloop.c
> +++ b/src/pulse/glib-mainloop.c
> @@ -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) {
> diff --git a/src/pulse/mainloop.c b/src/pulse/mainloop.c
> index 60fbbb9..0e1fba0 100644
> --- a/src/pulse/mainloop.c
> +++ b/src/pulse/mainloop.c
> @@ -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) {
More information about the pulseaudio-discuss
mailing list