adaptivedemux: remove some deadlocks using webkitwebsrc.
authorCharlie Turner <cturner@igalia.com>
Tue, 2 Jul 2019 11:27:40 +0000 (12:27 +0100)
committerCharlie Turner <cturner@igalia.com>
Mon, 29 Jul 2019 12:19:41 +0000 (13:19 +0100)
commit659d76a633641292be68459f5e4496c04059622d
tree8738cefd12c3a1d4d8175201333696f8b98e01b1
parente898f1565d5e90f03adfd68558ccb004a41341f2
adaptivedemux: remove some deadlocks using webkitwebsrc.

WebKit's websrc depends on the main-thread for download completion
rendezvous. This exposed a number of deadlocks in adaptivedemux due to
it holding the MANIFEST_LOCK during network requests, and also needing
to hold it to change_state and resolve queries, which frequently occur
during these download windows.

Make demux->running MT-safe so that it can be accessed without using the
MANIFEST_LOCK. In case a source is downloading and requires a MT-thread
notification for completion of the fragment download, a state change
during this download window will deadlock unless we cancel the downloads
and ensure they are not restarted before we finish the state-change.

Also make demux->priv->have_manifest MT-safe. A duration query happening
in the window described above can deadlock for the same reason. Other
src queries (like SEEKING) that happen in this window also could
deadlock, but I haven't hit this scenario.

Increase granularity of API_LOCK'ing in change_state as well. We need to
cancel downloads before trying to take this lock, since sink events
(EOS) will hold it before starting a fragment download.
ext/hls/gsthlsdemux.c
gst-libs/gst/adaptivedemux/gstadaptivedemux.c
gst-libs/gst/adaptivedemux/gstadaptivedemux.h