]> git.alsa-project.org Git - alsa-lib.git/commitdiff
pcm: direct: Fix deadlock in poll_descriptors
authorTakashi Iwai <tiwai@suse.de>
Mon, 16 Jan 2017 15:21:52 +0000 (16:21 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 16 Jan 2017 15:21:52 +0000 (16:21 +0100)
The recent change in PCM direct plugins to check XRUN in
poll_descriptors callback caused a regression; as consequence, the
whole playback hangs up.

The culprit is a mutex dead lock by the call in snd_pcm_state() inside
the new snd_pcm_direct_poll_descriptors().  The poll_descriptors code
path is protected with pcm mutex, thus an unlocked version
(__snd_pcm_state()) has to be used inside the callback instead.

Fixes: 789ee39727a1 ("pcm: direct: check state before enter poll on timer")
Signed-off-by: Takashi Iwai <tiwai@suse.de>
src/pcm/pcm_direct.c

index f4d7c3f2f284aa403fb4ccbb9756e7fe7e8d0730..e4bef7860d016b92f95efe228a0f8b5295302e0b 100644 (file)
@@ -676,7 +676,8 @@ int snd_pcm_direct_poll_descriptors(snd_pcm_t *pcm, struct pollfd *pfds,
        }
 
        /* this will also evaluate slave state and enter xrun if necessary */
-       switch (snd_pcm_state(pcm)) {
+       /* using __snd_pcm_state() since this function is called inside lock */
+       switch (__snd_pcm_state(pcm)) {
        case SND_PCM_STATE_XRUN:
                return -EPIPE;
        default: