]> git.sesse.net Git - vlc/commitdiff
Extensions: fix extensions manager's locking scheme
authorJean-Philippe André <jpeg@videolan.org>
Thu, 28 Jan 2010 11:07:15 +0000 (12:07 +0100)
committerJean-Philippe André <jpeg@videolan.org>
Thu, 28 Jan 2010 15:17:35 +0000 (16:17 +0100)
include/vlc_extensions.h
modules/misc/lua/extension.c
modules/misc/lua/extension.h
modules/misc/lua/extension_thread.c

index c86098f0a197ad625bb2efd49f748cc2dde15bf2..7f294fc7b2be6b2bdd800bb928ba06eb50044a65 100644 (file)
@@ -48,6 +48,7 @@ struct extensions_manager_t
     extensions_manager_sys_t *p_sys;   /**< Reserved for the module */
 
     DECL_ARRAY(extension_t*) extensions; /**< Array of extension descriptors */
+    vlc_mutex_t lock;                  /**< A lock for the extensions array */
 
     /** Control, see extension_Control */
     int ( *pf_control ) ( extensions_manager_t*, int, va_list );
index 04931c98386b14c5d793cd725e43ba4c92185efe..2e69f4c46dffd869aab63c408f8212f1bf4d2d06 100644 (file)
@@ -85,6 +85,7 @@ int Open_Extension( vlc_object_t *p_this )
     p_mgr->p_sys = p_sys;
     ARRAY_INIT( p_sys->activated_extensions );
     ARRAY_INIT( p_mgr->extensions );
+    vlc_mutex_init( &p_mgr->lock );
     vlc_mutex_init( &p_mgr->p_sys->lock );
 
     /* Initialise Lua state structure */
@@ -106,8 +107,6 @@ int Open_Extension( vlc_object_t *p_this )
     lua_close( L );
     p_sys->L = NULL;
 
-    vlc_mutex_init( &p_sys->lock );
-
     // Create the dialog-event variable
     var_Create( p_this, "dialog-event", VLC_VAR_ADDRESS );
     var_AddCallback( p_this, "dialog-event",
@@ -124,9 +123,11 @@ void Close_Extension( vlc_object_t *p_this )
     extensions_manager_t *p_mgr = ( extensions_manager_t* ) p_this;
     msg_Dbg( p_mgr, "Deactivating all loaded extensions" );
 
-    vlc_mutex_lock( &p_mgr->p_sys->lock );
+    vlc_mutex_lock( &p_mgr->lock );
     p_mgr->p_sys->b_killed = true;
-    vlc_mutex_unlock( &p_mgr->p_sys->lock );
+    vlc_mutex_unlock( &p_mgr->lock );
+
+    var_Destroy( p_mgr, "dialog-event" );
 
     extension_t *p_ext = NULL;
     FOREACH_ARRAY( p_ext, p_mgr->p_sys->activated_extensions )
@@ -143,6 +144,7 @@ void Close_Extension( vlc_object_t *p_this )
     if( p_mgr->p_sys && p_mgr->p_sys->L )
         lua_close( p_mgr->p_sys->L );
 
+    vlc_mutex_destroy( &p_mgr->lock );
     vlc_mutex_destroy( &p_mgr->p_sys->lock );
     free( p_mgr->p_sys );
     p_mgr->p_sys = NULL;
@@ -167,8 +169,6 @@ void Close_Extension( vlc_object_t *p_this )
     FOREACH_END()
 
     ARRAY_RESET( p_mgr->extensions );
-
-    var_Destroy( p_mgr, "dialog-event" );
 }
 
 /**
@@ -205,13 +205,13 @@ int ScanLuaCallback( vlc_object_t *p_this, const char *psz_script,
 
     msg_Dbg( p_mgr, "Scanning Lua script %s", psz_script );
 
-    vlc_mutex_lock( &p_mgr->p_sys->lock );
+    vlc_mutex_lock( &p_mgr->lock );
 
     /* Create new script descriptor */
     extension_t *p_ext = ( extension_t* ) calloc( 1, sizeof( extension_t ) );
     if( !p_ext )
     {
-        vlc_mutex_unlock( &p_mgr->p_sys->lock );
+        vlc_mutex_unlock( &p_mgr->lock );
         return 0;
     }
 
@@ -222,7 +222,7 @@ int ScanLuaCallback( vlc_object_t *p_this, const char *psz_script,
         free( p_ext->psz_name );
         free( p_ext->p_sys );
         free( p_ext );
-        vlc_mutex_unlock( &p_mgr->p_sys->lock );
+        vlc_mutex_unlock( &p_mgr->lock );
         return 0;
     }
     p_ext->p_sys->p_mgr = p_mgr;
@@ -350,7 +350,7 @@ exit:
         ARRAY_APPEND( p_mgr->extensions, p_ext );
     }
 
-    vlc_mutex_unlock( &p_mgr->p_sys->lock );
+    vlc_mutex_unlock( &p_mgr->lock );
     /* Continue batch execution */
     return pb_continue ? ( (* (bool*)pb_continue) ? -1 : 0 ) : -1;
 }
index 99b850a081b27699181a9b5b7f8bbfe92e70f488..bf15b704848cc5d205b20e4cb5a76143e5f518f6 100644 (file)
@@ -42,10 +42,13 @@ struct extensions_manager_sys_t
     /* List of activated extensions */
     DECL_ARRAY( extension_t* ) activated_extensions;
 
+    /* Lock for this list */
+    vlc_mutex_t lock;
+
     /* Lua specific */
     lua_State *L;
 
-    vlc_mutex_t lock;
+    /* Flag indicating that the module is about to be unloaded */
     bool b_killed;
 };
 
index 56612112444ef28e65218dbad4b71c16e13d7385..1d569e93db7b8d1ba3740fd4c1bed31b80cc4582 100644 (file)
@@ -60,7 +60,9 @@ int Activate( extensions_manager_t *p_mgr, extension_t *p_ext )
     }
 
     /* Add this script to the activated extensions list */
+    vlc_mutex_lock( &p_mgr->p_sys->lock );
     ARRAY_APPEND( p_mgr->p_sys->activated_extensions, p_ext );
+    vlc_mutex_unlock( &p_mgr->p_sys->lock );
 
     /* Prepare first command */
     p_sys->command = calloc( 1, sizeof( struct command_t ) );