glimagesink: avoid a possible critical on shutdown

It is possible that the close callback can be called after glimagesink
is changing state to NULL.  Protect against that by taking the glimagesink
lock and some NULL checking.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6524>
This commit is contained in:
Matthew Waters 2024-04-02 12:27:13 +11:00 committed by Tim-Philipp Müller
parent 0bf962dbdf
commit 651ccd0175

View file

@ -2485,25 +2485,30 @@ gst_glimage_sink_on_draw (GstGLImageSink * gl_sink)
static void
gst_glimage_sink_on_close (GstGLImageSink * gl_sink)
{
GstGLWindow *window;
GstGLWindow *window = NULL;
GST_WARNING_OBJECT (gl_sink, "Output window was closed");
window = gst_gl_context_get_window (gl_sink->context);
GST_GLIMAGE_SINK_LOCK (gl_sink);
if (gl_sink->context)
window = gst_gl_context_get_window (gl_sink->context);
GST_GLIMAGE_SINK_UNLOCK (gl_sink);
if (gl_sink->key_sig_id)
g_signal_handler_disconnect (window, gl_sink->key_sig_id);
gl_sink->key_sig_id = 0;
if (gl_sink->mouse_sig_id)
g_signal_handler_disconnect (window, gl_sink->mouse_sig_id);
gl_sink->mouse_sig_id = 0;
if (gl_sink->mouse_scroll_sig_id)
g_signal_handler_disconnect (window, gl_sink->mouse_scroll_sig_id);
gl_sink->mouse_scroll_sig_id = 0;
if (window) {
if (gl_sink->key_sig_id)
g_signal_handler_disconnect (window, gl_sink->key_sig_id);
gl_sink->key_sig_id = 0;
if (gl_sink->mouse_sig_id)
g_signal_handler_disconnect (window, gl_sink->mouse_sig_id);
gl_sink->mouse_sig_id = 0;
if (gl_sink->mouse_scroll_sig_id)
g_signal_handler_disconnect (window, gl_sink->mouse_scroll_sig_id);
gl_sink->mouse_scroll_sig_id = 0;
gst_object_unref (window);
}
g_atomic_int_set (&gl_sink->to_quit, 1);
gst_object_unref (window);
}
static gboolean