[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