vkdeviceprovider: Avoid deadlock on physical device
authorJan Schmidt <jan@centricular.com>
Mon, 2 Nov 2020 15:22:23 +0000 (02:22 +1100)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Tue, 3 Nov 2020 04:28:00 +0000 (04:28 +0000)
Don't hold the object lock on the vk physical device while
constructing a GstVulkanDevice around it, as
GstVulkanDevice can make calls on the physical device that
require the object lock.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1754>

ext/vulkan/vkdeviceprovider.c

index 7432e08..1f8888d 100644 (file)
@@ -397,17 +397,20 @@ device_context_probe (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
         device = g_object_dup_data (G_OBJECT (physical),
             "vkdeviceprovider.physical.device", (GDuplicateFunc) _ref_if_set,
             NULL);
+        GST_OBJECT_UNLOCK (physical);
         if (!device || !GST_IS_VULKAN_DEVICE (device)) {
           GWeakRef *ref = g_new0 (GWeakRef, 1);
           if (device)
             gst_object_unref (device);
           device = gst_vulkan_device_new (physical);
           g_weak_ref_init (ref, device);
+
+          GST_OBJECT_LOCK (physical);
           g_object_set_data_full (G_OBJECT (physical),
               "vkdeviceprovider.physical.device", ref,
               (GDestroyNotify) _ref_free);
+          GST_OBJECT_UNLOCK (physical);
         }
-        GST_OBJECT_UNLOCK (physical);
 
         if (gst_vulkan_device_handle_context_query (element, query, device)) {
           ret = GST_PAD_PROBE_HANDLED;