[vlc-commits] modules: move module handle and path to plugin structure

Rémi Denis-Courmont git at videolan.org
Thu Oct 27 09:51:34 CEST 2016


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Oct 27 10:45:13 2016 +0300| [b7de6c24fce9a4c34aae7cd751dc336515de5519] | committer: Rémi Denis-Courmont

modules: move module handle and path to plugin structure

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=b7de6c24fce9a4c34aae7cd751dc336515de5519
---

 src/modules/bank.c    | 37 +++++++++++++++++--------------------
 src/modules/cache.c   | 14 ++++++++------
 src/modules/entry.c   | 21 ++++++++++-----------
 src/modules/modules.h | 31 +++++++++++++------------------
 4 files changed, 48 insertions(+), 55 deletions(-)

diff --git a/src/modules/bank.c b/src/modules/bank.c
index 1bdbaf6..42463f1 100644
--- a/src/modules/bank.c
+++ b/src/modules/bank.c
@@ -73,8 +73,8 @@ static vlc_plugin_t *module_InitStatic(vlc_plugin_cb entry)
         return NULL;
 
     assert(lib->module != NULL);
-    lib->module->b_loaded = true;
-    lib->module->b_unloadable = false;
+    lib->loaded = true;
+    lib->unloadable = false;
     return lib;
 }
 
@@ -148,14 +148,14 @@ static vlc_plugin_t *module_InitDynamic(vlc_object_t *obj, const char *path,
 
     assert(plugin->module != NULL);
 
-    plugin->module->psz_filename = strdup (path);
-    if (unlikely(plugin->module->psz_filename == NULL))
+    plugin->abspath = strdup(path);
+    if (unlikely(plugin->abspath == NULL))
     {
         vlc_plugin_destroy(plugin);
         goto error;
     }
-    plugin->module->handle = handle;
-    plugin->module->b_loaded = true;
+    plugin->handle = handle;
+    plugin->loaded = true;
     return plugin;
 error:
     module_Unload( handle );
@@ -189,9 +189,8 @@ static int AllocatePluginFile (module_bank_t *bank, const char *abspath,
         vlc_plugin_t *cache = vlc_cache_lookup(&bank->cache, relpath, st);
         if (cache != NULL)
         {
-            assert(cache->module != NULL);
-            cache->module->psz_filename = strdup(abspath);
-            if (likely(cache->module->psz_filename != NULL))
+            cache->abspath = strdup(abspath);
+            if (likely(cache->abspath != NULL))
                 plugin = cache;
             else
                 vlc_plugin_destroy(cache);
@@ -213,7 +212,7 @@ static int AllocatePluginFile (module_bank_t *bank, const char *abspath,
     /* For now we force loading if the module's config contains callbacks.
      * Could be optimized by adding an API call.*/
     for (size_t i = 0; i < plugin->conf.size; i++)
-         if (!module->b_loaded
+         if (!plugin->loaded
           && plugin->conf.items[i].list_count == 0
           && (plugin->conf.items[i].list.psz_cb != NULL
            || plugin->conf.items[i].list.i_cb != NULL))
@@ -475,10 +474,10 @@ void module_EndBank (bool b_plugins)
         libs = lib->next;
 #ifdef HAVE_DYNAMIC_PLUGINS
         assert(lib->module != NULL);
-        if (lib->module->b_loaded && lib->module->b_unloadable)
+        if (lib->loaded && lib->unloadable)
         {
-            module_Unload(lib->module->handle);
-            lib->module->b_loaded = false;
+            module_Unload(lib->handle);
+            lib->loaded = false;
         }
 #endif
         vlc_plugin_destroy(lib);
@@ -632,27 +631,25 @@ int module_Map (vlc_object_t *obj, module_t *module)
     vlc_plugin_t *plugin = module->plugin;
 
     assert(plugin != NULL);
-    module = plugin->module;
-    assert(module != NULL);
 
     vlc_mutex_lock(&lock);
-    if (!module->b_loaded)
+    if (!plugin->loaded)
     {
         vlc_plugin_t *uncache;
 
-        assert (module->psz_filename != NULL);
+        assert(plugin->abspath != NULL);
 #ifdef HAVE_DYNAMIC_PLUGINS
-        uncache = module_InitDynamic (obj, module->psz_filename, false);
+        uncache = module_InitDynamic(obj, plugin->abspath, false);
         if (uncache != NULL)
         {
             assert(uncache->module != NULL);
-            CacheMerge(obj, module, uncache->module);
+            CacheMerge(obj, plugin->module, uncache->module);
             vlc_plugin_destroy(uncache);
         }
         else
 #endif
         {
-            msg_Err (obj, "corrupt module: %s", module->psz_filename);
+            msg_Err(obj, "corrupt module: %s", plugin->abspath);
             module = NULL;
         }
     }
diff --git a/src/modules/cache.c b/src/modules/cache.c
index bf6db35..b2163e0 100644
--- a/src/modules/cache.c
+++ b/src/modules/cache.c
@@ -57,7 +57,7 @@
 #ifdef HAVE_DYNAMIC_PLUGINS
 /* Sub-version number
  * (only used to avoid breakage in dev version when cache structure changes) */
-#define CACHE_SUBVERSION_NUM 28
+#define CACHE_SUBVERSION_NUM 29
 
 /* Cache filename */
 #define CACHE_NAME "plugins.dat"
@@ -312,7 +312,6 @@ static module_t *vlc_cache_load_module(vlc_plugin_t *plugin, block_t *file)
 
     LOAD_STRING(module->psz_capability);
     LOAD_IMMEDIATE(module->i_score);
-    LOAD_IMMEDIATE(module->b_unloadable);
 
     uint32_t submodules;
     LOAD_IMMEDIATE(submodules);
@@ -369,6 +368,7 @@ static vlc_plugin_t *vlc_cache_load_plugin(block_t *file)
     if (unlikely(plugin->path == NULL))
         goto error;
 
+    LOAD_FLAG(plugin->unloadable);
     LOAD_IMMEDIATE(plugin->mtime);
     LOAD_IMMEDIATE(plugin->size);
 
@@ -650,7 +650,6 @@ static int CacheSaveBank(FILE *file, vlc_plugin_t *const *cache, size_t n)
 
         SAVE_STRING(module->psz_capability);
         SAVE_IMMEDIATE(module->i_score);
-        SAVE_IMMEDIATE(module->b_unloadable);
 
         i_submodule = module->submodule_count;
         SAVE_IMMEDIATE( i_submodule );
@@ -664,6 +663,7 @@ static int CacheSaveBank(FILE *file, vlc_plugin_t *const *cache, size_t n)
         /* Save common info */
         SAVE_STRING(plugin->textdomain);
         SAVE_STRING(plugin->path);
+        SAVE_FLAG(plugin->unloadable);
         SAVE_IMMEDIATE(plugin->mtime);
         SAVE_IMMEDIATE(plugin->size);
     }
@@ -732,7 +732,6 @@ void CacheMerge( vlc_object_t *p_this, module_t *p_cache, module_t *p_module )
 
     p_cache->pf_activate = p_module->pf_activate;
     p_cache->pf_deactivate = p_module->pf_deactivate;
-    p_cache->handle = p_module->handle;
 
     /* FIXME: This looks too simplistic an algorithm to me. What if the module
      * file was altered such that the number of order of submodules was
@@ -747,8 +746,11 @@ void CacheMerge( vlc_object_t *p_this, module_t *p_cache, module_t *p_module )
         p_cchild = p_cchild->next;
     }
 
-    p_cache->b_loaded = true;
-    p_module->b_loaded = false;
+    p_cache->plugin->handle = p_module->plugin->handle;
+    assert(!p_cache->plugin->loaded);
+    p_cache->plugin->loaded = true;
+    assert(p_module->plugin->loaded);
+    p_module->plugin->loaded = false;
 }
 
 /**
diff --git a/src/modules/entry.c b/src/modules/entry.c
index d0e4795..21b4620 100644
--- a/src/modules/entry.c
+++ b/src/modules/entry.c
@@ -63,12 +63,8 @@ module_t *vlc_module_create(vlc_plugin_t *plugin)
     module->i_shortcuts = 0;
     module->psz_capability = NULL;
     module->i_score = (parent != NULL) ? parent->i_score : 1;
-    module->b_loaded = false;
-    module->b_unloadable = parent == NULL;
     module->pf_activate = NULL;
     module->pf_deactivate = NULL;
-    /*module->handle = garbage */
-    module->psz_filename = NULL;
     return module;
 }
 
@@ -77,15 +73,12 @@ module_t *vlc_module_create(vlc_plugin_t *plugin)
  */
 void vlc_module_destroy (module_t *module)
 {
-    assert (!module->b_loaded || !module->b_unloadable);
-
     for (module_t *m = module->submodule, *next; m != NULL; m = next)
     {
         next = m->next;
         vlc_module_destroy (m);
     }
 
-    free (module->psz_filename);
     free (module->pp_shortcuts);
     free (module);
 }
@@ -96,13 +89,18 @@ vlc_plugin_t *vlc_plugin_create(void)
     if (unlikely(plugin == NULL))
         return NULL;
 
-    plugin->path = NULL;
-    plugin->module = NULL;
     plugin->textdomain = NULL;
     plugin->conf.items = NULL;
     plugin->conf.size = 0;
     plugin->conf.count = 0;
     plugin->conf.booleans = 0;
+    plugin->abspath = NULL;
+    plugin->loaded = false;
+    plugin->unloadable = true;
+    plugin->handle = NULL;
+    plugin->abspath = NULL;
+    plugin->path = NULL;
+    plugin->module = NULL;
 
     return plugin;
 }
@@ -115,11 +113,13 @@ vlc_plugin_t *vlc_plugin_create(void)
 void vlc_plugin_destroy(vlc_plugin_t *plugin)
 {
     assert(plugin != NULL);
+    assert(!plugin->loaded || !plugin->unloadable);
 
     if (plugin->module != NULL)
         vlc_module_destroy(plugin->module);
 
     config_Free(plugin->conf.items, plugin->conf.size);
+    free(plugin->abspath);
     free(plugin->path);
     free(plugin);
 }
@@ -260,8 +260,7 @@ static int vlc_plugin_setter(void *ctx, void *tgt, int propid, ...)
             break;
 
         case VLC_MODULE_NO_UNLOAD:
-            assert(module->plugin->module == module);
-            module->b_unloadable = false;
+            plugin->unloadable = false;
             break;
 
         case VLC_MODULE_NAME:
diff --git a/src/modules/modules.h b/src/modules/modules.h
index 7cf89b8..1a0f5d3 100644
--- a/src/modules/modules.h
+++ b/src/modules/modules.h
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * modules.h : Module management functions.
  *****************************************************************************
- * Copyright (C) 2001 VLC authors and VideoLAN
+ * Copyright (C) 2001-2016 VLC authors and VideoLAN
  * $Id$
  *
  * Authors: Samuel Hocevar <sam at zoy.org>
@@ -24,15 +24,14 @@
 #ifndef LIBVLC_MODULES_H
 # define LIBVLC_MODULES_H 1
 
+/** The plugin handle type */
+typedef void *module_handle_t;
+
 /** VLC plugin */
 typedef struct vlc_plugin_t
 {
     struct vlc_plugin_t *next;
 
-    char *path; /**< Relative path */
-    time_t mtime; /**< Last modification time */
-    off_t size; /**< File size */
-
     module_t *module;
 
     const char *textdomain; /**< gettext domain (or NULL) */
@@ -47,6 +46,15 @@ typedef struct vlc_plugin_t
         size_t count; /**< Number of configuration items */
         size_t booleans; /**< Number of booleal config items */
     } conf;
+
+    bool loaded; /**< Whether the plug-in is mapped in memory */
+    bool unloadable; /**< Whether the plug-in can be unloaded safely */
+    module_handle_t handle; /**< Run-time linker handle (if loaded) */
+    char *abspath; /**< Absolute path */
+
+    char *path; /**< Relative path (within plug-in directory) */
+    time_t mtime; /**< Last modification time */
+    off_t size; /**< File size */
 } vlc_plugin_t;
 
 /**
@@ -56,9 +64,6 @@ extern struct vlc_plugin_t *vlc_plugins;
 
 #define MODULE_SHORTCUT_MAX 20
 
-/** The module handle type */
-typedef void *module_handle_t;
-
 /** Plugin entry point prototype */
 typedef int (*vlc_plugin_cb) (int (*)(void *, void *, int, ...), void *);
 
@@ -89,19 +94,9 @@ struct module_t
     const char *psz_capability;                              /**< Capability */
     int      i_score;                          /**< Score for the capability */
 
-    bool          b_loaded;        /* Set to true if the dll is loaded */
-    bool b_unloadable;                        /**< Can we be dlclosed? */
-
     /* Callbacks */
     void *pf_activate;
     void *pf_deactivate;
-
-    /*
-     * Variables used internally by the module manager
-     */
-    /* Plugin-specific stuff */
-    module_handle_t     handle;                             /* Unique handle */
-    char *              psz_filename;                     /* Module filename */
 };
 
 vlc_plugin_t *vlc_plugin_create(void);



More information about the vlc-commits mailing list