gstplugin: Handle static plugins in gst_plugin_load_by_name()
authorJan Schmidt <jan@centricular.com>
Fri, 9 Dec 2022 16:54:23 +0000 (03:54 +1100)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Sat, 10 Dec 2022 11:01:35 +0000 (11:01 +0000)
gst_plugin_load_by_name() assumed a plugin has a filename,
which isn't true for static plugins, leading to criticals.

If a plugin is already loaded, just return the loaded plugin,
which makes it work for static plugins as well as saving a
moment for already-loaded dynamic plugins.

Add locking in gst_plugin_is_loaded(), as a plugin may be
still being loaded in another thread.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3552>

subprojects/gstreamer/gst/gstplugin.c

index ab2d708..ced754c 100644 (file)
@@ -1183,8 +1183,16 @@ gboolean
 gst_plugin_is_loaded (GstPlugin * plugin)
 {
   g_return_val_if_fail (plugin != NULL, FALSE);
+  gboolean ret;
+
+  if (plugin->filename == NULL)
+    return TRUE;                /* Static plugin */
+
+  g_mutex_lock (&gst_plugin_loading_mutex);
+  ret = (plugin->module != NULL);
+  g_mutex_unlock (&gst_plugin_loading_mutex);
 
-  return (plugin->module != NULL || plugin->filename == NULL);
+  return ret;
 }
 
 /**
@@ -1406,22 +1414,27 @@ gst_plugin_load_by_name (const gchar * name)
 
   GST_DEBUG ("looking up plugin %s in default registry", name);
   plugin = gst_registry_find_plugin (gst_registry_get (), name);
-  if (plugin) {
-    GST_DEBUG ("loading plugin %s from file %s", name, plugin->filename);
-    newplugin = gst_plugin_load_file (plugin->filename, &error);
-    gst_object_unref (plugin);
+  if (plugin == NULL) {
+    GST_DEBUG ("Could not find plugin %s in registry", name);
+    return NULL;
+  }
 
-    if (!newplugin) {
-      GST_WARNING ("load_plugin error: %s", error->message);
-      g_error_free (error);
-      return NULL;
-    }
-    /* newplugin was reffed by load_file */
-    return newplugin;
+  if (gst_plugin_is_loaded (plugin)) {
+    GST_DEBUG ("plugin %s already loaded", name);
+    return plugin;
   }
 
-  GST_DEBUG ("Could not find plugin %s in registry", name);
-  return NULL;
+  GST_DEBUG ("loading plugin %s from file %s", name, plugin->filename);
+  newplugin = gst_plugin_load_file (plugin->filename, &error);
+  gst_object_unref (plugin);
+
+  if (!newplugin) {
+    GST_WARNING ("load_plugin error: %s", error->message);
+    g_error_free (error);
+    return NULL;
+  }
+  /* newplugin was reffed by load_file */
+  return newplugin;
 }
 
 /**