Module really does not need to be an object
authorRémi Denis-Courmont <rdenis@simphalempin.com>
Sun, 21 Sep 2008 13:11:24 +0000 (16:11 +0300)
committerRémi Denis-Courmont <rdenis@simphalempin.com>
Sun, 21 Sep 2008 13:59:23 +0000 (16:59 +0300)
src/libvlc.c
src/modules/modules.c
src/modules/modules.h

index 07b3ed1..a4f4dcb 100644 (file)
@@ -491,8 +491,10 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
         b_exit = true;
     }
 
-    msg_Dbg( p_libvlc, "module bank initialized, found %i modules",
-             vlc_internals( p_module_bank )->i_children );
+    size_t module_count;
+    module_t **list = module_list_get( &module_count );
+    module_list_free( list );
+    msg_Dbg( p_libvlc, "module bank initialized (%u modules)", module_count );
 
     /* Check for help on modules */
     if( (p_tmp = config_GetPsz( p_libvlc, "module" )) )
index be9eb61..1c3001f 100644 (file)
@@ -124,8 +124,7 @@ void __module_InitBank( vlc_object_t *p_this )
 
     if( p_module_bank == NULL )
     {
-        p_bank = vlc_custom_create( p_this, sizeof(module_bank_t),
-                                    VLC_OBJECT_GENERIC, "module bank");
+        p_bank = calloc (1, sizeof(*p_bank));
         p_bank->i_usage = 1;
         p_bank->i_cache = p_bank->i_loaded_cache = 0;
         p_bank->pp_cache = p_bank->pp_loaded_cache = NULL;
@@ -160,26 +159,24 @@ void __module_InitBank( vlc_object_t *p_this )
  */
 void __module_EndBank( vlc_object_t *p_this )
 {
-    module_t * p_next = NULL;
+    module_bank_t *p_bank;
 
     vlc_mutex_t *lock = var_AcquireMutex( "libvlc" );
-    if( !p_module_bank )
-    {
-        vlc_mutex_unlock( lock );
-        return;
-    }
-    if( --p_module_bank->i_usage )
+    p_bank = p_module_bank;
+    assert (p_bank != NULL);
+    if( --p_bank->i_usage > 0 )
     {
         vlc_mutex_unlock( lock );
         return;
     }
+    /*FIXME: For thread safety, we need to:
+    p_module_bank = NULL; - immediately, but that will crash the cache */
     vlc_mutex_unlock( lock );
 
     /* Save the configuration */
     config_AutoSaveConfigFile( p_this );
 
 #ifdef HAVE_DYNAMIC_PLUGINS
-# define p_bank p_module_bank
     if( p_bank->b_cache ) CacheSave( p_this );
     while( p_bank->i_loaded_cache-- )
     {
@@ -209,17 +206,13 @@ void __module_EndBank( vlc_object_t *p_this )
         free( p_bank->pp_cache );
         p_bank->pp_cache = NULL;
     }
-# undef p_bank
 #endif
 
-    while( vlc_internals( p_module_bank )->i_children )
-    {
-        p_next = (module_t *)vlc_internals( p_module_bank )->pp_children[0];
-        DeleteModule( p_next, true );
-    }
+    while( p_bank->head != NULL )
+        DeleteModule( p_bank->head, true );
 
-    vlc_object_release( p_module_bank );
-    p_module_bank = NULL;
+    p_module_bank = NULL; /* FIXME: do this inside the lock */
+    free( p_bank );
 }
 
 /**
@@ -1413,6 +1406,13 @@ static void DeleteModule( module_t * p_module, bool b_detach )
 {
     assert( p_module );
 
+    /* Unlist the module (if it is in the list) */
+    module_t **pp_self = &p_module_bank->head;
+    while (*pp_self != NULL && *pp_self != p_module)
+        pp_self = &((*pp_self)->next);
+    if (*pp_self)
+        *pp_self = p_module->next;
+
     /* We free the structures that we strdup()ed in Allocate*Module(). */
 #ifdef HAVE_DYNAMIC_PLUGINS
     if( !p_module->b_builtin )
index baafe45..2516c7c 100644 (file)
@@ -39,9 +39,7 @@
  *****************************************************************************/
 struct module_bank_t
 {
-    VLC_COMMON_MEMBERS
-
-    int              i_usage;
+    unsigned         i_usage;
 
     bool             b_builtins;
     bool             b_plugins;