decodebin: possible fix for deadlock when spamming "next song"
authorVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Tue, 3 Feb 2015 17:06:43 +0000 (17:06 +0000)
committerVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Thu, 19 Feb 2015 13:38:29 +0000 (13:38 +0000)
commit9036dc85940c1decb5c12ee253a6657b9cf70a2b
tree3a034f0f2cd0c836fcb7a4bbc4632d9bff2c2e6a
parentcd071014209d167ca8664a47249bdc4a9cb89866
decodebin: possible fix for deadlock when spamming "next song"

There was a deadlock between a thread changing decodebin/demuxer
state from PAUSED to READY, and another thread pushing data
when starting.

From the stack trace at
https://bug741355.bugzilla-attachments.gnome.org/attachment.cgi?id=292471,
I deduce the following is happening, though I did not reproduce the
problem so I'm not sure this patch fixes it.

The streaming thread (thread 2 in that stack trace) takes the demuxer's
sink pad's stream lock in gst_ogg_demux_perform_seek_pull and will
activate a new chain. This ends up causing the expose lock being taken
in _pad_added_cb in decodebin.

Meanwhile, a state changed is triggered on thread 1, which takes the
expose lock in decodebin in gst_decode_bin_change_state, then frees
the previous chain, which ends up calling gst_pad_stop_task on the
demuxer's task, which in turn takes the demuxer's sink pad's stream
lock, deadlocking as both threads are now waiting for each other.

https://bugzilla.gnome.org/show_bug.cgi?id=741355
gst/playback/gstdecodebin2.c