osxvideosink: fix deadlock upon closing output window
authorPiotr Brzeziński <piotr@centricular.com>
Fri, 5 May 2023 16:27:14 +0000 (18:27 +0200)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 13 May 2023 17:41:33 +0000 (18:41 +0100)
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/4627>

subprojects/gst-plugins-good/sys/osxvideo/osxvideosink.m

index b2c905c..4d5d2b4 100644 (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];
 }