Enable/disable scan_and_update_registry() based on commandline switch or environment variable. Fixes #520468.

Original commit message from CVS:
patch by: Jason Zhao <e3423c@motorola.com>
* docs/gst/running.xml:
* gst/gst.c:
Enable/disable scan_and_update_registry() based on commandline switch
or environment variable. Fixes #520468.
* ChangeLog:
Fix typo in my previous commit.
This commit is contained in:
Jason Zhao 2008-04-24 15:14:54 +00:00 committed by Stefan Kost
parent c7acfbaf43
commit d9c9c264e2
3 changed files with 77 additions and 33 deletions

View file

@ -1,7 +1,19 @@
2008-04-24 Stefan Kost <ensonic@users.sf.net>
patch by: Jason Zhao <e3423c@motorola.com>
* docs/gst/running.xml:
* gst/gst.c:
Enable/disable scan_and_update_registry() based on commandline switch
or environment variable. Fixes #520468.
* ChangeLog:
Fix typo in my previous commit.
2008-04-24 Stefan Kost <ensonic@users.sf.net>
* gst/gstregistrybinary.c:
Add a warning of we hit unhandled factories when saving.
Add a warning if we hit unhandled factories when saving.
More debug logging detail, but move to LOG category.
2008-04-24 Stefan Kost <ensonic@users.sf.net>

View file

@ -204,6 +204,17 @@ application.
</formalpara>
<formalpara id="GST_REGISTRY_UPDATE">
<title><envar>GST_REGISTRY_UPDATE</envar></title>
<para>
Set this environment variable to "no" to prevent GStreamer from updating the
plugin registry. This is useful for embedded device which is not updating the
plugins frequently, it will save time when doing gst_init().
</para>
</formalpara>
</refsect2>
</refsect1>

View file

@ -151,6 +151,9 @@ static gboolean _gst_disable_segtrap = FALSE;
/* control the behaviour of registry rebuild */
static gboolean _gst_enable_registry_fork = DEFAULT_FORK;
/*set to TRUE when registry needn't to be updated */
static gboolean _gst_disable_registry_update = FALSE;
static void load_plugin_func (gpointer data, gpointer user_data);
static gboolean init_pre (GOptionContext * context, GOptionGroup * group,
gpointer data, GError ** error);
@ -190,6 +193,7 @@ enum
ARG_PLUGIN_PATH,
ARG_PLUGIN_LOAD,
ARG_SEGTRAP_DISABLE,
ARG_REGISTRY_UPDATE_DISABLE,
ARG_REGISTRY_FORK_DISABLE
};
@ -340,6 +344,11 @@ gst_init_get_option_group (void)
(gpointer) parse_goption_arg,
N_("Disable trapping of segmentation faults during plugin loading"),
NULL},
{"gst-disable-registry-update", 0, G_OPTION_FLAG_NO_ARG,
G_OPTION_ARG_CALLBACK,
(gpointer) parse_goption_arg,
N_("Disable updating the registry"),
NULL},
{"gst-disable-registry-fork", 0, G_OPTION_FLAG_NO_ARG,
G_OPTION_ARG_CALLBACK,
(gpointer) parse_goption_arg,
@ -754,12 +763,6 @@ ensure_current_registry_nonforking (GstRegistry * default_registry,
const gchar * registry_file, GError ** error)
{
/* fork() not available */
GST_INFO ("reading registry cache: %s", registry_file);
#ifdef USE_BINARY_REGISTRY
gst_registry_binary_read_cache (default_registry, registry_file);
#else
gst_registry_xml_read_cache (default_registry, registry_file);
#endif
GST_DEBUG ("Updating registry cache in-process");
scan_and_update_registry (default_registry, registry_file, TRUE, error);
return TRUE;
@ -787,13 +790,6 @@ ensure_current_registry_forking (GstRegistry * default_registry,
return FALSE;
}
GST_INFO ("reading registry cache: %s", registry_file);
#ifdef USE_BINARY_REGISTRY
gst_registry_binary_read_cache (default_registry, registry_file);
#else
gst_registry_xml_read_cache (default_registry, registry_file);
#endif
pid = fork ();
if (pid == -1) {
GST_ERROR ("Failed to fork()");
@ -882,10 +878,11 @@ ensure_current_registry_forking (GstRegistry * default_registry,
static gboolean
ensure_current_registry (GError ** error)
{
char *registry_file;
gchar *registry_file;
GstRegistry *default_registry;
gboolean ret;
gboolean ret = TRUE;
gboolean do_fork;
gboolean do_update;
default_registry = gst_registry_get_default ();
registry_file = g_strdup (g_getenv ("GST_REGISTRY"));
@ -899,30 +896,50 @@ ensure_current_registry (GError ** error)
#endif
}
/* first see if forking is enabled */
do_fork = _gst_enable_registry_fork;
if (do_fork) {
const gchar *fork_env;
GST_INFO ("reading registry cache: %s", registry_file);
#ifdef USE_BINARY_REGISTRY
gst_registry_binary_read_cache (default_registry, registry_file);
#else
gst_registry_xml_read_cache (default_registry, registry_file);
#endif
/* forking enabled, see if it is disabled with an env var */
if ((fork_env = g_getenv ("GST_REGISTRY_FORK"))) {
/* fork enabled for any value different from "no" */
do_fork = strcmp (fork_env, "no") != 0;
do_update = !_gst_disable_registry_update;
if (do_update) {
const gchar *update_env;
if ((update_env = g_getenv ("GST_REGISTRY_UPDATE"))) {
/* do update for any value different from "no" */
do_update = (strcmp (update_env, "no") != 0);
}
}
/* now check registry with or without forking */
if (do_fork) {
GST_DEBUG ("forking for registry rebuild");
ret = ensure_current_registry_forking (default_registry, registry_file,
error);
} else {
GST_DEBUG ("requested not to fork for registry rebuild");
ret = ensure_current_registry_nonforking (default_registry, registry_file,
error);
if (do_update) {
/* first see if forking is enabled */
do_fork = _gst_enable_registry_fork;
if (do_fork) {
const gchar *fork_env;
/* forking enabled, see if it is disabled with an env var */
if ((fork_env = g_getenv ("GST_REGISTRY_FORK"))) {
/* fork enabled for any value different from "no" */
do_fork = strcmp (fork_env, "no") != 0;
}
}
/* now check registry with or without forking */
if (do_fork) {
GST_DEBUG ("forking for registry rebuild");
ret = ensure_current_registry_forking (default_registry, registry_file,
error);
} else {
GST_DEBUG ("requested not to fork for registry rebuild");
ret = ensure_current_registry_nonforking (default_registry, registry_file,
error);
}
}
g_free (registry_file);
GST_INFO ("registry reading and updating done, result = %d", ret);
return ret;
}
@ -1203,6 +1220,9 @@ parse_one_option (gint opt, const gchar * arg, GError ** err)
case ARG_SEGTRAP_DISABLE:
_gst_disable_segtrap = TRUE;
break;
case ARG_REGISTRY_UPDATE_DISABLE:
_gst_disable_registry_update = TRUE;
break;
case ARG_REGISTRY_FORK_DISABLE:
_gst_enable_registry_fork = FALSE;
break;
@ -1240,6 +1260,7 @@ parse_goption_arg (const gchar * opt,
"--gst-plugin-path", ARG_PLUGIN_PATH}, {
"--gst-plugin-load", ARG_PLUGIN_LOAD}, {
"--gst-disable-segtrap", ARG_SEGTRAP_DISABLE}, {
"--gst-disable-registry-update", ARG_REGISTRY_UPDATE_DISABLE}, {
"--gst-disable-registry-fork", ARG_REGISTRY_FORK_DISABLE}, {
NULL}
};