[gst-cvs] gst-plugins-bad: frei0r: Don't try to register/ load the same frei0r plugin at different locations twice
Sebastian Dröge
slomo at kemper.freedesktop.org
Sun Aug 8 02:58:18 PDT 2010
Module: gst-plugins-bad
Branch: master
Commit: 1e3ec9e3bd798c7d9c30e328702a293ff53ec344
URL: http://cgit.freedesktop.org/gstreamer/gst-plugins-bad/commit/?id=1e3ec9e3bd798c7d9c30e328702a293ff53ec344
Author: Sebastian Dröge <sebastian.droege at collabora.co.uk>
Date: Sun Aug 8 11:56:42 2010 +0200
frei0r: Don't try to register/load the same frei0r plugin at different locations twice
This could happen because for example /usr/lib is linked
to /usr/lib64 and both are loaded. The frei0r specification
says that the plugin init function must only be called once
and for some plugin weird things (including crashes) are
happening.
Fixes bug #623710.
---
gst/frei0r/gstfrei0r.c | 38 +++++++++++++++++++++++++++-----------
1 files changed, 27 insertions(+), 11 deletions(-)
diff --git a/gst/frei0r/gstfrei0r.c b/gst/frei0r/gstfrei0r.c
index 6d2c6fc..b783435 100644
--- a/gst/frei0r/gstfrei0r.c
+++ b/gst/frei0r/gstfrei0r.c
@@ -588,12 +588,13 @@ invalid_frei0r_plugin:
}
static gboolean
-register_plugins (GstPlugin * plugin, const gchar * path)
+register_plugins (GstPlugin * plugin, GHashTable * plugin_names,
+ const gchar * path)
{
GDir *dir;
gchar *filename;
const gchar *entry_name;
- gboolean ret = FALSE;
+ gboolean ret = FALSE, this_ret;
GST_DEBUG ("Scanning director '%s' for frei0r plugins", path);
@@ -602,16 +603,24 @@ register_plugins (GstPlugin * plugin, const gchar * path)
return FALSE;
while ((entry_name = g_dir_read_name (dir))) {
+ this_ret = FALSE;
+
+ if (g_hash_table_lookup_extended (plugin_names, entry_name, NULL, NULL))
+ continue;
+
filename = g_build_filename (path, entry_name, NULL);
if ((g_str_has_suffix (filename, G_MODULE_SUFFIX)
#ifdef GST_EXTRA_MODULE_SUFFIX
|| g_str_has_suffix (filename, GST_EXTRA_MODULE_SUFFIX)
#endif
) && g_file_test (filename, G_FILE_TEST_IS_REGULAR)) {
- ret |= register_plugin (plugin, filename);
+ this_ret = register_plugin (plugin, filename);
} else if (g_file_test (filename, G_FILE_TEST_IS_DIR)) {
- ret |= register_plugins (plugin, filename);
+ this_ret = register_plugins (plugin, plugin_names, filename);
}
+ if (this_ret)
+ g_hash_table_insert (plugin_names, g_strdup (entry_name), NULL);
+ ret = ret && this_ret;
g_free (filename);
}
g_dir_close (dir);
@@ -624,6 +633,7 @@ plugin_init (GstPlugin * plugin)
{
const gchar *homedir;
gchar *path;
+ GHashTable *plugin_names;
GST_DEBUG_CATEGORY_INIT (frei0r_debug, "frei0r", 0, "frei0r");
@@ -636,17 +646,23 @@ plugin_init (GstPlugin * plugin)
"/usr/lib64/frei0r-1:/usr/local/lib64/frei0r-1",
NULL, GST_PLUGIN_DEPENDENCY_FLAG_RECURSE);
+ plugin_names =
+ g_hash_table_new_full ((GHashFunc) g_str_hash, (GEqualFunc) g_str_equal,
+ (GDestroyNotify) g_free, NULL);
+
homedir = g_get_home_dir ();
path = g_build_filename (homedir, ".frei0r-1", NULL);
- register_plugins (plugin, path);
+ register_plugins (plugin, plugin_names, path);
g_free (path);
- register_plugins (plugin, "/usr/local/lib/frei0r-1");
- register_plugins (plugin, "/usr/lib/frei0r-1");
- register_plugins (plugin, "/usr/local/lib32/frei0r-1");
- register_plugins (plugin, "/usr/lib32/frei0r-1");
- register_plugins (plugin, "/usr/local/lib64/frei0r-1");
- register_plugins (plugin, "/usr/lib64/frei0r-1");
+ register_plugins (plugin, plugin_names, "/usr/local/lib/frei0r-1");
+ register_plugins (plugin, plugin_names, "/usr/lib/frei0r-1");
+ register_plugins (plugin, plugin_names, "/usr/local/lib32/frei0r-1");
+ register_plugins (plugin, plugin_names, "/usr/lib32/frei0r-1");
+ register_plugins (plugin, plugin_names, "/usr/local/lib64/frei0r-1");
+ register_plugins (plugin, plugin_names, "/usr/lib64/frei0r-1");
+
+ g_hash_table_unref (plugin_names);
return TRUE;
}
More information about the Gstreamer-commits
mailing list