gst/: only write out registry if it has changed, fixes #338339

Original commit message from CVS:
* gst/gst.c:
* gst/gstregistry.c: (gst_registry_scan_path_level),
(gst_registry_scan_path):
* gst/gstregistry.h:
only write out registry if it has changed, fixes #338339
This commit is contained in:
Stefan Kost 2006-04-28 20:47:23 +00:00
parent 1785b80792
commit 13c4169d9d
4 changed files with 34 additions and 14 deletions

View file

@ -29,7 +29,8 @@
* libs/gst/base/gstbasesink.c: (gst_base_sink_event): * libs/gst/base/gstbasesink.c: (gst_base_sink_event):
* libs/gst/base/gstcollectpads.c: (gst_collect_pads_base_init), * libs/gst/base/gstcollectpads.c: (gst_collect_pads_base_init),
(gst_collect_pads_is_collected), (gst_collect_pads_event): (gst_collect_pads_is_collected), (gst_collect_pads_event):
more detailed debug and formatting cleanup more detailed debug and formatting cleanup,
forward newsegments to src-pad (so that e.g. adder not eats them)
2006-04-28 Stefan Kost <ensonic@users.sf.net> 2006-04-28 Stefan Kost <ensonic@users.sf.net>

View file

@ -602,6 +602,7 @@ init_post (void)
char *registry_file; char *registry_file;
const char *plugin_path; const char *plugin_path;
GstRegistry *default_registry; GstRegistry *default_registry;
gboolean changed = FALSE;
default_registry = gst_registry_get_default (); default_registry = gst_registry_get_default ();
registry_file = g_strdup (g_getenv ("GST_REGISTRY")); registry_file = g_strdup (g_getenv ("GST_REGISTRY"));
@ -622,7 +623,7 @@ init_post (void)
GST_DEBUG ("GST_PLUGIN_PATH set to %s", plugin_path); GST_DEBUG ("GST_PLUGIN_PATH set to %s", plugin_path);
list = g_strsplit (plugin_path, G_SEARCHPATH_SEPARATOR_S, 0); list = g_strsplit (plugin_path, G_SEARCHPATH_SEPARATOR_S, 0);
for (i = 0; list[i]; i++) { for (i = 0; list[i]; i++) {
gst_registry_scan_path (default_registry, list[i]); changed |= gst_registry_scan_path (default_registry, list[i]);
} }
g_strfreev (list); g_strfreev (list);
} else { } else {
@ -642,11 +643,11 @@ init_post (void)
* system-installed ones */ * system-installed ones */
home_plugins = g_build_filename (g_get_home_dir (), home_plugins = g_build_filename (g_get_home_dir (),
".gstreamer-" GST_MAJORMINOR, "plugins", NULL); ".gstreamer-" GST_MAJORMINOR, "plugins", NULL);
gst_registry_scan_path (default_registry, home_plugins); changed |= gst_registry_scan_path (default_registry, home_plugins);
g_free (home_plugins); g_free (home_plugins);
/* add the main (installed) library path */ /* add the main (installed) library path */
gst_registry_scan_path (default_registry, PLUGINDIR); changed |= gst_registry_scan_path (default_registry, PLUGINDIR);
} else { } else {
char **list; char **list;
int i; int i;
@ -654,12 +655,15 @@ init_post (void)
GST_DEBUG ("GST_PLUGIN_SYSTEM_PATH set to %s", plugin_path); GST_DEBUG ("GST_PLUGIN_SYSTEM_PATH set to %s", plugin_path);
list = g_strsplit (plugin_path, G_SEARCHPATH_SEPARATOR_S, 0); list = g_strsplit (plugin_path, G_SEARCHPATH_SEPARATOR_S, 0);
for (i = 0; list[i]; i++) { for (i = 0; list[i]; i++) {
gst_registry_scan_path (default_registry, list[i]); changed |= gst_registry_scan_path (default_registry, list[i]);
} }
g_strfreev (list); g_strfreev (list);
} }
gst_registry_xml_write_cache (default_registry, registry_file); if (changed) {
GST_DEBUG ("writing registry cache");
gst_registry_xml_write_cache (default_registry, registry_file);
}
_gst_registry_remove_cache_plugins (default_registry); _gst_registry_remove_cache_plugins (default_registry);

View file

@ -736,7 +736,7 @@ gst_registry_lookup (GstRegistry * registry, const char *filename)
return plugin; return plugin;
} }
static void static gboolean
gst_registry_scan_path_level (GstRegistry * registry, const gchar * path, gst_registry_scan_path_level (GstRegistry * registry, const gchar * path,
int level) int level)
{ {
@ -745,10 +745,11 @@ gst_registry_scan_path_level (GstRegistry * registry, const gchar * path,
gchar *filename; gchar *filename;
GstPlugin *plugin; GstPlugin *plugin;
GstPlugin *newplugin; GstPlugin *newplugin;
gboolean changed = FALSE;
dir = g_dir_open (path, 0, NULL); dir = g_dir_open (path, 0, NULL);
if (!dir) if (!dir)
return; return FALSE;
while ((dirent = g_dir_read_name (dir))) { while ((dirent = g_dir_read_name (dir))) {
filename = g_strjoin ("/", path, dirent, NULL); filename = g_strjoin ("/", path, dirent, NULL);
@ -758,7 +759,7 @@ gst_registry_scan_path_level (GstRegistry * registry, const gchar * path,
if (g_file_test (filename, G_FILE_TEST_IS_DIR)) { if (g_file_test (filename, G_FILE_TEST_IS_DIR)) {
if (level > 0) { if (level > 0) {
GST_LOG_OBJECT (registry, "found directory, recursing"); GST_LOG_OBJECT (registry, "found directory, recursing");
gst_registry_scan_path_level (registry, filename, level - 1); changed |= gst_registry_scan_path_level (registry, filename, level - 1);
} else { } else {
GST_LOG_OBJECT (registry, GST_LOG_OBJECT (registry,
"found directory, but recursion level is too deep"); "found directory, but recursion level is too deep");
@ -819,6 +820,7 @@ gst_registry_scan_path_level (GstRegistry * registry, const gchar * path,
newplugin->registered = TRUE; newplugin->registered = TRUE;
gst_object_unref (newplugin); gst_object_unref (newplugin);
} }
changed = TRUE;
} }
gst_object_unref (plugin); gst_object_unref (plugin);
@ -828,6 +830,7 @@ gst_registry_scan_path_level (GstRegistry * registry, const gchar * path,
if (newplugin) { if (newplugin) {
newplugin->registered = TRUE; newplugin->registered = TRUE;
gst_object_unref (newplugin); gst_object_unref (newplugin);
changed = TRUE;
} }
} }
@ -835,6 +838,10 @@ gst_registry_scan_path_level (GstRegistry * registry, const gchar * path,
} }
g_dir_close (dir); g_dir_close (dir);
GST_DEBUG_OBJECT (registry, "registry changed? %d", changed);
return changed;
} }
/** /**
@ -845,15 +852,23 @@ gst_registry_scan_path_level (GstRegistry * registry, const gchar * path,
* Add the given path to the registry. The syntax of the * Add the given path to the registry. The syntax of the
* path is specific to the registry. If the path has already been * path is specific to the registry. If the path has already been
* added, do nothing. * added, do nothing.
*
* Returns: %TRUE if registry changed
*/ */
void gboolean
gst_registry_scan_path (GstRegistry * registry, const gchar * path) gst_registry_scan_path (GstRegistry * registry, const gchar * path)
{ {
g_return_if_fail (GST_IS_REGISTRY (registry)); gboolean changed;
g_return_if_fail (path != NULL);
g_return_val_if_fail (GST_IS_REGISTRY (registry), FALSE);
g_return_val_if_fail (path != NULL, FALSE);
GST_DEBUG_OBJECT (registry, "scanning path %s", path); GST_DEBUG_OBJECT (registry, "scanning path %s", path);
gst_registry_scan_path_level (registry, path, 10); changed = gst_registry_scan_path_level (registry, path, 10);
GST_DEBUG_OBJECT (registry, "registry changed? %d", changed);
return changed;
} }
void void

View file

@ -78,7 +78,7 @@ GType gst_registry_get_type (void);
GstRegistry * gst_registry_get_default (void); GstRegistry * gst_registry_get_default (void);
void gst_registry_scan_path (GstRegistry *registry, const gchar *path); gboolean gst_registry_scan_path (GstRegistry *registry, const gchar *path);
GList* gst_registry_get_path_list (GstRegistry *registry); GList* gst_registry_get_path_list (GstRegistry *registry);
gboolean gst_registry_add_plugin (GstRegistry *registry, GstPlugin *plugin); gboolean gst_registry_add_plugin (GstRegistry *registry, GstPlugin *plugin);