[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