[pulseaudio-discuss] [PATCH v2 5/5] fix a call to pa_sink_suspend() from an incorrect thread
Georg Chini
georg at chini.tk
Fri Mar 16 10:47:15 UTC 2018
On 13.03.2018 18:40, Tanu Kaskinen wrote:
> The alsa sink calls pa_sink_suspend() from the set_port() callback.
> pa_sink_suspend() can only be called from the main thread, but the
> set_port() callback was often called from the IO thread. That caused an
> assertion to be hit in pa_sink_suspend() when switching ports.
>
> Another issue was that pa_sink_suspend() called the set_port() callback,
> and if the callback calls pa_sink_suspend() again recursively, nothing
> good can be expected from that, so the thread mismatch was not the only
> problem.
>
> This patch moves the mixer syncing logic out of pa_sink/source_suspend()
> to be handled internally by the alsa sink/source. This removes the
> recursive pa_sink_suspend() call. This also removes the need to have the
> mixer_dirty flag in pa_sink/source, so the flag and the
> pa_sink/source_set_mixer_dirty() functions can be removed.
>
> This patch also changes the threading rules of set_port(). Previously it
> was called sometimes from the main thread and sometimes from the IO
> thread. Now it's always called from the main thread. When deferred
> volumes are used, the alsa sink and source still have to update the
> mixer from the IO thread when switching ports, but the thread
> synchronization is now handled internally by the alsa sink and source.
> The SET_PORT messages are not needed any more and can be removed.
>
> BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=104761
> ---
> src/modules/alsa/alsa-sink.c | 94 +++++++++++++++++++++++++++++++++---------
> src/modules/alsa/alsa-source.c | 94 +++++++++++++++++++++++++++++++++---------
> src/pulsecore/sink.c | 52 +----------------------
> src/pulsecore/sink.h | 7 +---
> src/pulsecore/source.c | 52 +----------------------
> src/pulsecore/source.h | 7 +---
> 6 files changed, 156 insertions(+), 150 deletions(-)
>
LGTM
More information about the pulseaudio-discuss
mailing list