From: Sebastian Dröge Date: Sun, 15 Mar 2015 14:19:17 +0000 (+0000) Subject: multiqueue: Don't grow queue infinitely if only one pad is linked X-Git-Tag: 1.6.1~472 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5fc2a3fd6683541aae2ac9a6053d2f71b232db69;p=platform%2Fupstream%2Fgstreamer.git multiqueue: Don't grow queue infinitely if only one pad is linked This was introduced by https://bugzilla.gnome.org/show_bug.cgi?id=719893 https://bugzilla.gnome.org/show_bug.cgi?id=722891 but it doesn't make any sense at all and causes huge memory leaks. https://bugzilla.gnome.org/show_bug.cgi?id=744253 --- diff --git a/plugins/elements/gstmultiqueue.c b/plugins/elements/gstmultiqueue.c index aef27ad374..37fa6f037b 100644 --- a/plugins/elements/gstmultiqueue.c +++ b/plugins/elements/gstmultiqueue.c @@ -1413,8 +1413,8 @@ next: /* If we're not-linked, we do some extra work because we might need to * wait before pushing. If we're linked but there's a gap in the IDs, - * or it's the first loop, or we just passed the previous highid, - * we might need to wake some sleeping pad up, so there's extra work + * or it's the first loop, or we just passed the previous highid, + * we might need to wake some sleeping pad up, so there's extra work * there too */ GST_MULTI_QUEUE_MUTEX_LOCK (mq); if (sq->srcresult == GST_FLOW_NOT_LINKED @@ -2161,7 +2161,6 @@ single_queue_overrun_cb (GstDataQueue * dq, GstSingleQueue * sq) GList *tmp; GstDataQueueSize size; gboolean filled = TRUE; - gboolean all_not_linked = TRUE; gboolean empty_found = FALSE; gst_data_queue_get_level (sq->queue, &size); @@ -2180,7 +2179,7 @@ single_queue_overrun_cb (GstDataQueue * dq, GstSingleQueue * sq) goto done; } - /* Search for empty or unlinked queues */ + /* Search for empty queues */ for (tmp = mq->queues; tmp; tmp = g_list_next (tmp)) { GstSingleQueue *oq = (GstSingleQueue *) tmp->data; @@ -2192,7 +2191,6 @@ single_queue_overrun_cb (GstDataQueue * dq, GstSingleQueue * sq) continue; } - all_not_linked = FALSE; GST_LOG_OBJECT (mq, "Checking Queue %d", oq->id); if (gst_data_queue_is_empty (oq->queue)) { GST_LOG_OBJECT (mq, "Queue %d is empty", oq->id); @@ -2201,16 +2199,9 @@ single_queue_overrun_cb (GstDataQueue * dq, GstSingleQueue * sq) } } - if (!mq->queues || !mq->queues->next) - all_not_linked = FALSE; - /* if hard limits are not reached then we allow one more buffer in the full - * queue, but only if any of the other singelqueues are empty or all are - * not linked */ - if (all_not_linked || empty_found) { - if (all_not_linked) { - GST_LOG_OBJECT (mq, "All other queues are not linked"); - } + * queue, but only if any of the other singelqueues are empty */ + if (empty_found) { if (IS_FILLED (sq, visible, size.visible)) { sq->max_size.visible = size.visible + 1; GST_DEBUG_OBJECT (mq,