osxvideosink: fix deadlock upon closing output window

Invoking gst_osx_video_sink_osxwindow_destroy() can currently cause a deadlock
because showFrame() keeps trying to get the same lock as well. Moving the lock
closer to where it's actually needed seems to be enough to fix the issue for now.

Reported-by: Alexande B <abobrikovich@gmail.com>
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4559>
This commit is contained in:
Piotr Brzeziński 2023-05-05 18:27:14 +02:00 committed by GStreamer Marge Bot
parent ad2d1ce393
commit 560d20a2c0

View file

@ -301,11 +301,9 @@ gst_osx_video_sink_osxwindow_destroy (GstOSXVideoSink * osxvideosink)
g_return_if_fail (GST_IS_OSX_VIDEO_SINK (osxvideosink));
pool = [[NSAutoreleasePool alloc] init];
GST_OBJECT_LOCK (osxvideosink);
gst_osx_video_sink_call_from_main_thread(osxvideosink,
osxvideosink->osxvideosinkobject,
@selector(destroy), (id) nil, YES);
GST_OBJECT_UNLOCK (osxvideosink);
#ifndef GSTREAMER_GLIB_COCOA_NSAPPLICATION
gst_osx_video_sink_stop_cocoa_loop (osxvideosink);
#endif
@ -914,6 +912,7 @@ no_texture_buffer:
pool = [[NSAutoreleasePool alloc] init];
GST_OBJECT_LOCK (osxvideosink);
osxwindow = osxvideosink->osxwindow;
osxvideosink->osxwindow = NULL;
@ -931,6 +930,8 @@ no_texture_buffer:
}
g_free (osxwindow);
}
GST_OBJECT_UNLOCK (osxvideosink);
[pool release];
}