queue2: Refuse all serialized queries when posting buffering messages

When posting buffering messages there are no safe places or timing to avoid
deadlocks.

Previously the code was trying to be "smart" by only forwarding serialized
queries if the queue was empty ... but that could happen when queue2 hadn't yet
posted a 100% buffering message. Meaning the pipeline might be paused and
pushing a serialized query downstream might never complete.

Therefore let's completely disable forwarding of serialized queries when
`queue2` is used as a buffering element (meaning `ALLOCATION` and `DRAIN`
queries).

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/796>
This commit is contained in:
Edward Hervey 2021-04-16 11:36:33 +02:00 committed by Edward Hervey
parent b500ac31ab
commit 4eef67cc7e

View file

@ -2785,10 +2785,14 @@ gst_queue2_handle_sink_query (GstPad * pad, GstObject * parent,
* be pushed for sure) or we are not buffering. If we are buffering,
* the pipeline waits to unblock downstream until our queue fills up
* completely, which can not happen if we block on the query..
* Therefore we only potentially block when we are not buffering. */
* Therefore we only potentially block when we are not buffering.
*
* Update: Edward Hervey 2021: Realistically when posting buffering
* messages there are no safe places where we can block and forward a
* serialized query due to the potential of causing deadlocks. We
* therefore refuse any serialized queries in such cases. */
GST_QUEUE2_MUTEX_LOCK_CHECK (queue, queue->sinkresult, out_flushing);
if (QUEUE_IS_USING_QUEUE (queue) && (gst_queue2_is_empty (queue)
|| !queue->use_buffering)) {
if (QUEUE_IS_USING_QUEUE (queue) && !queue->use_buffering) {
if (!g_atomic_int_get (&queue->downstream_may_block)) {
gst_queue2_locked_enqueue (queue, query,
GST_QUEUE2_ITEM_TYPE_QUERY);
@ -2807,7 +2811,7 @@ gst_queue2_handle_sink_query (GstPad * pad, GstObject * parent,
}
} else {
GST_DEBUG_OBJECT (queue,
"refusing query, we are not using the queue");
"refusing query, we are not using the queue or we are posting buffering messages");
res = FALSE;
}
GST_QUEUE2_MUTEX_UNLOCK (queue);