[Spice-devel] [PATCH spice-gtk] gstreamer: Fix leak using GstBus watch (v2)
Kasireddy, Vivek
vivek.kasireddy at intel.com
Sun Nov 5 05:12:55 UTC 2023
Acked-by: Vivek Kasireddy <vivek.kasireddy at intel.com>
>
> This patch fixes a leak due to not freeing GstBus watch.
> The watch is attached (as GSource) to the main loop and retains
> a pointer to the bus so we need to remove it to release the bus
> when we release the pipeline.
> This was detected forcibly creating and destroying lot of streams.
> After a while the client program consumed all file descriptors
> and stopped working. This as GstBus retains a GPoll which,
> under Unix, uses 2 file descriptors.
> For some reasons using gst_pipeline_get_bus again in free_pipeline
> do not fix entirely the leak so keep a pointer to the exact
> bus we set our watch on.
>
> Signed-off-by: Frediano Ziglio <freddy77 at gmail.com>
> ---
> Changes since v1:
> - added comment.
> ---
> src/channel-display-gst.c | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
>
> diff --git a/src/channel-display-gst.c b/src/channel-display-gst.c
> index 3b372dc0..2734a546 100644
> --- a/src/channel-display-gst.c
> +++ b/src/channel-display-gst.c
> @@ -47,6 +47,7 @@ typedef struct SpiceGstDecoder {
> GstAppSink *appsink;
> GstElement *pipeline;
> GstClock *clock;
> + GstBus *bus;
>
> /* ---------- Decoding and display queues ---------- */
>
> @@ -352,6 +353,13 @@ static void free_pipeline(SpiceGstDecoder
> *decoder)
> return;
> }
>
> + GstBus *bus = decoder->bus;
> + if (bus) {
> + gst_bus_remove_watch(bus);
> + gst_object_unref(bus);
> + decoder->bus = NULL;
> + }
> +
> gst_element_set_state(decoder->pipeline, GST_STATE_NULL);
> gst_object_unref(decoder->appsrc);
> decoder->appsrc = NULL;
> @@ -534,7 +542,9 @@ static bool launch_pipeline(SpiceGstDecoder
> *decoder)
> }
> bus = gst_pipeline_get_bus(GST_PIPELINE(decoder->pipeline));
> gst_bus_add_watch(bus, handle_pipeline_message, decoder);
> - gst_object_unref(bus);
> + // Retains the bus object to be able to release the watch.
> + // We keep the reference to avoid a dangling pointer.
> + decoder->bus = bus;
>
> decoder->clock = gst_pipeline_get_clock(GST_PIPELINE(decoder-
> >pipeline));
>
> --
> 2.41.0
More information about the Spice-devel
mailing list