gst/gstplugin.c: apply patch from #172526 to make register work on MacOSX
authorThomas Vander Stichele <thomas@apestaart.org>
Tue, 3 May 2005 12:46:47 +0000 (12:46 +0000)
committerThomas Vander Stichele <thomas@apestaart.org>
Tue, 3 May 2005 12:46:47 +0000 (12:46 +0000)
Original commit message from CVS:

* gst/gstplugin.c: (gst_plugin_check_module),
(gst_plugin_check_file), (gst_plugin_load_file):
apply patch from #172526 to make register work on MacOSX

ChangeLog
gst/gstplugin.c

index 498ad9d..9fb9bcb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,9 +1,8 @@
-2005-05-02  Thomas Vander Stichele  <thomas at apestaart dot org>
-
-       reviewed by: <delete if not using a buddy>
+2005-05-03  Thomas Vander Stichele  <thomas at apestaart dot org>
 
-       * testsuite/indexers/cache1.c: (lookup):
-       * testsuite/indexers/indexdump.c: (main):
+       * gst/gstplugin.c: (gst_plugin_check_module),
+       (gst_plugin_check_file), (gst_plugin_load_file):
+           apply patch from #172526 to make register work on MacOSX
 
 2005-05-02  Thomas Vander Stichele  <thomas at apestaart dot org>
 
index 26cdeb5..fd2798f 100644 (file)
@@ -301,6 +301,46 @@ _gst_plugin_fault_handler_setup (void)
 static void _gst_plugin_fault_handler_setup ();
 
 /**
+ * gst_plugin_check_module:
+ * @module: GModule handle to check for pluginness
+ * @error: pointer to a NULL-valued GError
+ * @pptr: pointer to a gpointer used to return the gst_plugin_desc symbol
+ *        (can be NULL)
+ *
+ * Checks if the given module is a GStreamer plugin
+ *
+ * Returns: TRUE if the given module is a GStreamer plugin
+ */
+static gboolean
+gst_plugin_check_module (GModule * module, const char *filename,
+    GError ** error, gpointer * pptr)
+{
+  gpointer ptr;
+
+  if (pptr == NULL)
+    pptr = &ptr;
+
+  if (module == NULL) {
+    GST_DEBUG ("Error loading plugin %s, reason: %s", filename,
+        g_module_error ());
+    g_set_error (error, GST_PLUGIN_ERROR, GST_PLUGIN_ERROR_MODULE,
+        "Error loading plugin %s, reason: %s", filename, g_module_error ());
+    return FALSE;
+  }
+
+  if (!g_module_symbol (module, "gst_plugin_desc", pptr)) {
+    GST_DEBUG ("Could not find plugin entry point in \"%s\"", filename);
+    g_set_error (error,
+        GST_PLUGIN_ERROR,
+        GST_PLUGIN_ERROR_MODULE,
+        "Could not find plugin entry point in \"%s\"", filename);
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
+/**
  * gst_plugin_check_file:
  * @filename: the plugin filename to check for pluginness
  * @error: pointer to a NULL-valued GError
@@ -314,7 +354,7 @@ gst_plugin_check_file (const gchar * filename, GError ** error)
 {
   GModule *module;
   struct stat file_status;
-  gpointer ptr;
+  gboolean check;
 
   g_return_val_if_fail (filename != NULL, FALSE);
 
@@ -334,28 +374,13 @@ gst_plugin_check_file (const gchar * filename, GError ** error)
   }
 
   module = g_module_open (filename, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
+  check = gst_plugin_check_module (module, filename, error, NULL);
+  g_module_close (module);
 
-  if (module == NULL) {
-    GST_DEBUG ("Error loading plugin %s, reason: %s\n", filename,
-        g_module_error ());
-    g_set_error (error, GST_PLUGIN_ERROR, GST_PLUGIN_ERROR_MODULE,
-        "Error loading plugin %s, reason: %s\n", filename, g_module_error ());
-    return FALSE;
-  }
+  GST_INFO ("file \"%s\" %s look like a gst plugin", filename,
+      check ? "does" : "doesn't");
+  return check;
 
-  if (!g_module_symbol (module, "gst_plugin_desc", &ptr)) {
-    GST_DEBUG ("Could not find plugin entry point in \"%s\"", filename);
-    g_set_error (error,
-        GST_PLUGIN_ERROR,
-        GST_PLUGIN_ERROR_MODULE,
-        "Could not find plugin entry point in \"%s\"", filename);
-    g_module_close (module);
-    return FALSE;
-  }
-  /* it's a plugin */
-  GST_INFO ("looks like a gst plugin \"%s\"", filename);
-  g_module_close (module);
-  return TRUE;
 }
 
 /**
@@ -381,16 +406,11 @@ gst_plugin_load_file (const gchar * filename, GError ** error)
   GST_CAT_DEBUG (GST_CAT_PLUGIN_LOADING, "attempt to load plugin \"%s\"",
       filename);
 
-  if (!gst_plugin_check_file (filename, error))
-    return NULL;
-
   module = g_module_open (filename, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL);
 
-  if (module == NULL)
-    goto load_error;
-
-  if (!g_module_symbol (module, "gst_plugin_desc", &ptr))
-    goto load_error;
+  /* handle module == NULL case */
+  if (!gst_plugin_check_module (module, filename, error, &ptr))
+    return NULL;
 
   desc = (GstPluginDesc *) ptr;
 
@@ -403,6 +423,7 @@ gst_plugin_load_file (const gchar * filename, GError ** error)
   } else {
     free_plugin = FALSE;
     if (gst_plugin_is_loaded (plugin)) {
+      g_module_close (module);
       if (plugin->filename && strcmp (plugin->filename, filename) != 0) {
         GST_WARNING
             ("plugin %p from file \"%s\" with same name %s is already "
@@ -455,15 +476,11 @@ gst_plugin_load_file (const gchar * filename, GError ** error)
         GST_PLUGIN_ERROR,
         GST_PLUGIN_ERROR_MODULE,
         "gst_plugin_register_func failed for plugin \"%s\"", filename);
+    g_module_close (module);
     if (free_plugin)
       g_free (plugin);
     return NULL;
   }
-load_error:
-  g_set_error (error,
-      GST_PLUGIN_ERROR,
-      GST_PLUGIN_ERROR_MODULE, "generic load error for \"%s\"", filename);
-  return NULL;
 }
 
 static void