[vlc-commits] Copy strings from plugin descriptor, remove (D|Und)upModules()
Rémi Denis-Courmont
git at videolan.org
Mon Aug 15 20:00:03 CEST 2011
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Mon Aug 15 20:11:28 2011 +0300| [21e31e34b5b3b070e0449ebd40794f2246fa54e3] | committer: Rémi Denis-Courmont
Copy strings from plugin descriptor, remove (D|Und)upModules()
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=21e31e34b5b3b070e0449ebd40794f2246fa54e3
---
src/modules/entry.c | 67 ++++++++++++++++++++++++++++++++++++------------
src/modules/modules.c | 56 -----------------------------------------
2 files changed, 50 insertions(+), 73 deletions(-)
diff --git a/src/modules/entry.c b/src/modules/entry.c
index 3f46a25..a6c38ce 100644
--- a/src/modules/entry.c
+++ b/src/modules/entry.c
@@ -34,6 +34,11 @@
#include "config/configuration.h"
#include "libvlc.h"
+static char *strdup_null (const char *str)
+{
+ return (str != NULL) ? strdup (str) : NULL;
+}
+
module_t *vlc_module_create (void)
{
module_t *module = malloc (sizeof (*module));
@@ -69,7 +74,13 @@ module_t *vlc_module_create (void)
void vlc_module_destroy (module_t *module)
{
+ for (unsigned i = 0; i < module->i_shortcuts; i++)
+ free (module->pp_shortcuts[i]);
free (module->pp_shortcuts);
+ free (module->psz_capability);
+ free (module->psz_help);
+ free (module->psz_longname);
+ free (module->psz_shortname);
free (module);
}
@@ -89,14 +100,13 @@ module_t *vlc_submodule_create (module_t *module)
submodule->submodule = NULL;
submodule->submodule_count = 0;
- submodule->pp_shortcuts = xmalloc (sizeof (char **));
- submodule->pp_shortcuts[0] = module->pp_shortcuts[0]; /* object name */
- submodule->i_shortcuts = 1;
+ submodule->pp_shortcuts = NULL;
+ submodule->i_shortcuts = 0;
- submodule->psz_shortname = module->psz_shortname;
- submodule->psz_longname = module->psz_longname;
+ submodule->psz_shortname = NULL;
+ submodule->psz_longname = NULL;
submodule->psz_help = NULL;
- submodule->psz_capability = module->psz_capability;
+ submodule->psz_capability = NULL;
submodule->i_score = module->i_score;
submodule->b_builtin = false;
submodule->b_loaded = false;
@@ -158,9 +168,23 @@ int vlc_plugin_set (module_t *module, module_config_t *item, int propid, ...)
case VLC_SUBMODULE_CREATE:
{
module_t **pp = va_arg (ap, module_t **);
- *pp = vlc_submodule_create (module);
- if (*pp == NULL)
+ module_t *submodule = vlc_submodule_create (module);
+
+ if (unlikely(submodule == NULL))
+ {
ret = -1;
+ break;
+ }
+
+ /* Inheritance. Ugly!! */
+ submodule->pp_shortcuts = xmalloc (sizeof (char **));
+ submodule->pp_shortcuts[0] = strdup_null (module->pp_shortcuts[0]);
+ submodule->i_shortcuts = 1; /* object name */
+
+ submodule->psz_shortname = strdup_null (module->psz_shortname);
+ submodule->psz_longname = strdup_null (module->psz_longname);
+ submodule->psz_capability = strdup_null (module->psz_capability);
+ *pp = submodule;
break;
}
@@ -191,12 +215,15 @@ int vlc_plugin_set (module_t *module, module_config_t *item, int propid, ...)
}
module->pp_shortcuts = pp;
module->i_shortcuts = index + i_shortcuts;
- memcpy (pp + index, tab, sizeof (pp[0]) * i_shortcuts);
+ pp += index;
+ for (unsigned i = 0; i < i_shortcuts; i++)
+ pp[i] = strdup (tab[i]);
break;
}
case VLC_MODULE_CAPABILITY:
- module->psz_capability = va_arg (ap, char *);
+ free (module->psz_capability);
+ module->psz_capability = strdup (va_arg (ap, char *));
break;
case VLC_MODULE_SCORE:
@@ -222,30 +249,36 @@ int vlc_plugin_set (module_t *module, module_config_t *item, int propid, ...)
assert (module->i_shortcuts == 0);
module->pp_shortcuts = malloc( sizeof( char ** ) );
- module->pp_shortcuts[0] = (char*)value; /* dooh! */
+ module->pp_shortcuts[0] = strdup (value);
module->i_shortcuts = 1;
- if (module->psz_longname == NULL)
- module->psz_longname = (char*)value; /* dooh! */
+ assert (module->psz_longname == NULL);
+ module->psz_longname = strdup (value);
break;
}
case VLC_MODULE_SHORTNAME:
- module->psz_shortname = va_arg (ap, char *);
+ assert (module->psz_shortname == NULL || module->parent != NULL);
+ free (module->psz_shortname);
+ module->psz_shortname = strdup (va_arg (ap, char *));
break;
case VLC_MODULE_DESCRIPTION:
- module->psz_longname = va_arg (ap, char *);
+ // TODO: do not set this in VLC_MODULE_NAME
+ free (module->psz_longname);
+ module->psz_longname = strdup (va_arg (ap, char *));
break;
case VLC_MODULE_HELP:
assert (module->parent == NULL);
assert (module->psz_help == NULL);
- module->psz_help = va_arg (ap, char *);
+ module->psz_help = strdup (va_arg (ap, char *));
break;
case VLC_MODULE_TEXTDOMAIN:
- module->domain = va_arg (ap, char *);
+ assert (module->parent == NULL);
+ assert (module->domain == NULL);
+ module->domain = strdup (va_arg (ap, char *));
break;
case VLC_CONFIG_NAME:
diff --git a/src/modules/modules.c b/src/modules/modules.c
index 22bdda4..f63a27b 100644
--- a/src/modules/modules.c
+++ b/src/modules/modules.c
@@ -84,10 +84,6 @@ static module_t * AllocatePlugin( vlc_object_t *, const char *, bool );
#endif
static int AllocateBuiltinModule( vlc_object_t *, int ( * ) ( module_t * ) );
static void DeleteModule (module_t **, module_t *);
-#ifdef HAVE_DYNAMIC_PLUGINS
-static void DupModule ( module_t * );
-static void UndupModule ( module_t * );
-#endif
#undef module_InitBank
/**
@@ -1017,7 +1013,6 @@ static module_t *AllocatePlugin( vlc_object_t * p_this, const char *psz_file,
goto error;
}
- DupModule( p_module );
assert( !p_module->b_builtin );
return p_module;
error:
@@ -1026,56 +1021,6 @@ error:
module_Unload( handle );
return NULL;
}
-
-/*****************************************************************************
- * DupModule: make a plugin module standalone.
- *****************************************************************************
- * This function duplicates all strings in the module, so that the dynamic
- * object can be unloaded. It acts recursively on submodules.
- *****************************************************************************/
-static void DupModule( module_t *p_module )
-{
- char **pp_shortcuts = p_module->pp_shortcuts;
- for( unsigned i = 0; i < p_module->i_shortcuts; i++ )
- pp_shortcuts[i] = strdup( p_module->pp_shortcuts[i] );
-
- /* We strdup() these entries so that they are still valid when the
- * module is unloaded. */
- p_module->psz_capability =
- p_module->psz_capability ? strdup( p_module->psz_capability ) : NULL;
- p_module->psz_shortname = p_module->psz_shortname ?
- strdup( p_module->psz_shortname ) : NULL;
- p_module->psz_longname = strdup( p_module->psz_longname );
- p_module->psz_help = p_module->psz_help ? strdup( p_module->psz_help )
- : NULL;
- p_module->domain = p_module->domain ? strdup( p_module->domain ) : NULL;
-
- for (module_t *subm = p_module->submodule; subm; subm = subm->next)
- DupModule (subm);
-}
-
-/*****************************************************************************
- * UndupModule: free a duplicated module.
- *****************************************************************************
- * This function frees the allocations done in DupModule().
- *****************************************************************************/
-static void UndupModule( module_t *p_module )
-{
- char **pp_shortcuts = p_module->pp_shortcuts;
-
- for (module_t *subm = p_module->submodule; subm; subm = subm->next)
- UndupModule (subm);
-
- for( unsigned i = 0; i < p_module->i_shortcuts; i++ )
- free( pp_shortcuts[i] );
-
- free( p_module->psz_capability );
- FREENULL( p_module->psz_shortname );
- free( p_module->psz_longname );
- FREENULL( p_module->psz_help );
- free( p_module->domain );
-}
-
#endif /* HAVE_DYNAMIC_PLUGINS */
/*****************************************************************************
@@ -1140,7 +1085,6 @@ static void DeleteModule (module_t **head, module_t *p_module)
{
module_Unload( p_module->handle );
}
- UndupModule( p_module );
free( p_module->psz_filename );
}
#endif
More information about the vlc-commits
mailing list