[Spice-devel] [PATCH spice-gtk 1/2] gstreamer: Fix leak using GstBus watch
Kasireddy, Vivek
vivek.kasireddy at intel.com
Sat Nov 4 16:21:42 UTC 2023
Hi Frediano,
>
> 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>
> ---
> src/channel-display-gst.c | 10 +++++++++-
> 1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/src/channel-display-gst.c b/src/channel-display-gst.c
> index 3b372dc0..6e126000 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;
> + }
Looks like the watch can be removed by returning FALSE from the bus
func (handle_pipeline_message) as well. Would it make sense to handle
it this way?
> +
> gst_element_set_state(decoder->pipeline, GST_STATE_NULL);
> gst_object_unref(decoder->appsrc);
> decoder->appsrc = NULL;
> @@ -534,7 +542,7 @@ 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);
But the docs say that it is ok to unref the bus as the watch will take an additional
reference on the bus.
Thanks,
Vivek
> + decoder->bus = bus;
>
> decoder->clock = gst_pipeline_get_clock(GST_PIPELINE(decoder-
> >pipeline));
>
> --
> 2.41.0
More information about the Spice-devel
mailing list