[pulseaudio-discuss] [PATCH] thread-mq: make pa_thread_mq_done() safe for subsequent calls

David Henningsson david.henningsson at canonical.com
Tue May 14 08:21:31 PDT 2013


On 05/14/2013 04:09 PM, Tanu Kaskinen wrote:
> From: Janos Kovacs <jankovac503 at gmail.com>
>
> ---
>   src/pulsecore/thread-mq.c | 8 ++++++++
>   1 file changed, 8 insertions(+)
>
> diff --git a/src/pulsecore/thread-mq.c b/src/pulsecore/thread-mq.c
> index b492793..9efcd8a 100644
> --- a/src/pulsecore/thread-mq.c
> +++ b/src/pulsecore/thread-mq.c
> @@ -97,6 +97,14 @@ void pa_thread_mq_init(pa_thread_mq *q, pa_mainloop_api *mainloop, pa_rtpoll *rt
>   void pa_thread_mq_done(pa_thread_mq *q) {
>       pa_assert(q);
>
> +    if (!q->mainloop && !q->inq && !q->outq &&
> +        !q->read_event && !q->write_event)
> +        return;
> +
> +    pa_assert(q->mainloop);
> +    pa_assert(q->inq && q->outq);
> +    pa_assert(q->read_event && q->write_event);
> +
>       /* Since we are called from main context we can be sure that the
>        * inq is empty. However, the outq might still contain messages
>        * for the main loop, which we need to dispatch (e.g. release
>

Looks a bit weird. There's no explanation if this fixes an existing bug 
or just some attempt to be safer for the future.

Anyway, feels like it would have been better to put if's around every 
call instead, because rest of PulseAudio is coded that way. E g:

if (q->mainloop && q->read_event) {
     q->mainloop->io_free(q->read_event);
     q->read_event = NULL;
}





-- 
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic


More information about the pulseaudio-discuss mailing list