mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-11 09:55:36 +00:00
playbin2: release the shutdown lock
Release the shutdown lock when we wait for other groups to complete or else we have a deadlock when the other group completes and tries to grab the shutdown lock. Fixes #575550.
This commit is contained in:
parent
ce9360b9fd
commit
ba6d3b5aca
1 changed files with 11 additions and 0 deletions
|
@ -1959,8 +1959,13 @@ no_more_pads_cb (GstElement * decodebin, GstSourceGroup * group)
|
||||||
while (group->pending) {
|
while (group->pending) {
|
||||||
GST_DEBUG_OBJECT (playbin, "%d pending in group %p, waiting",
|
GST_DEBUG_OBJECT (playbin, "%d pending in group %p, waiting",
|
||||||
group->pending, group);
|
group->pending, group);
|
||||||
|
|
||||||
|
GST_PLAY_BIN_SHUTDOWN_UNLOCK (playbin);
|
||||||
|
|
||||||
/* FIXME, unlock when shutting down */
|
/* FIXME, unlock when shutting down */
|
||||||
GST_SOURCE_GROUP_WAIT (group);
|
GST_SOURCE_GROUP_WAIT (group);
|
||||||
|
|
||||||
|
GST_PLAY_BIN_SHUTDOWN_LOCK (playbin, shutdown2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GST_SOURCE_GROUP_UNLOCK (group);
|
GST_SOURCE_GROUP_UNLOCK (group);
|
||||||
|
@ -1992,6 +1997,11 @@ no_more_pads_cb (GstElement * decodebin, GstSourceGroup * group)
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
shutdown2:
|
||||||
|
{
|
||||||
|
GST_SOURCE_GROUP_UNLOCK (group);
|
||||||
|
goto shutdown;
|
||||||
|
}
|
||||||
shutdown:
|
shutdown:
|
||||||
{
|
{
|
||||||
GST_DEBUG ("ignoring, we are shutting down");
|
GST_DEBUG ("ignoring, we are shutting down");
|
||||||
|
@ -2498,6 +2508,7 @@ gst_play_bin_change_state (GstElement * element, GstStateChange transition)
|
||||||
/* FIXME unlock our waiting groups */
|
/* FIXME unlock our waiting groups */
|
||||||
GST_LOG_OBJECT (playbin, "setting shutdown flag");
|
GST_LOG_OBJECT (playbin, "setting shutdown flag");
|
||||||
g_atomic_int_set (&playbin->shutdown, 1);
|
g_atomic_int_set (&playbin->shutdown, 1);
|
||||||
|
|
||||||
/* wait for all callbacks to end by taking the lock.
|
/* wait for all callbacks to end by taking the lock.
|
||||||
* No dynamic (critical) new callbacks will
|
* No dynamic (critical) new callbacks will
|
||||||
* be able to happen as we set the shutdown flag. */
|
* be able to happen as we set the shutdown flag. */
|
||||||
|
|
Loading…
Reference in a new issue