[vlc-commits] lua: Simplify activated extension detection
Hugo Beauzée-Luyssen
git at videolan.org
Thu Mar 30 13:56:33 CEST 2017
vlc | branch: master | Hugo Beauzée-Luyssen <hugo at beauzee.fr> | Wed Mar 29 16:27:39 2017 +0200| [04da2f7345a60b2f061f8b3868a42b976476aa2d] | committer: Hugo Beauzée-Luyssen
lua: Simplify activated extension detection
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=04da2f7345a60b2f061f8b3868a42b976476aa2d
---
modules/lua/extension.c | 47 +++++++++--------------
modules/lua/extension.h | 14 +------
modules/lua/extension_thread.c | 87 ++++++------------------------------------
3 files changed, 29 insertions(+), 119 deletions(-)
diff --git a/modules/lua/extension.c b/modules/lua/extension.c
index bc9f76d..e6612e9 100644
--- a/modules/lua/extension.c
+++ b/modules/lua/extension.c
@@ -102,15 +102,8 @@ int Open_Extension( vlc_object_t *p_this )
p_mgr->pf_control = Control;
- extensions_manager_sys_t *p_sys = ( extensions_manager_sys_t* )
- calloc( 1, sizeof( extensions_manager_sys_t ) );
- if( !p_sys ) return VLC_ENOMEM;
-
- p_mgr->p_sys = p_sys;
- ARRAY_INIT( p_sys->activated_extensions );
- ARRAY_INIT( p_mgr->extensions );
+ p_mgr->p_sys = NULL;
vlc_mutex_init( &p_mgr->lock );
- vlc_mutex_init( &p_mgr->p_sys->lock );
/* Scan available Lua Extensions */
if( ScanExtensions( p_mgr ) != VLC_SUCCESS )
@@ -133,33 +126,26 @@ int Open_Extension( vlc_object_t *p_this )
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->lock );
- p_mgr->p_sys->b_killed = true;
- vlc_mutex_unlock( &p_mgr->lock );
var_DelCallback( p_this, "dialog-event",
vlclua_extension_dialog_callback, NULL );
var_Destroy( p_mgr, "dialog-event" );
extension_t *p_ext = NULL;
- FOREACH_ARRAY( p_ext, p_mgr->p_sys->activated_extensions )
- {
- if( !p_ext ) break;
- msg_Dbg( p_mgr, "Deactivating '%s'", p_ext->psz_title );
- Deactivate( p_mgr, p_ext );
- }
- FOREACH_END()
-
- msg_Dbg( p_mgr, "All extensions are now deactivated" );
- ARRAY_RESET( p_mgr->p_sys->activated_extensions );
/* Free extensions' memory */
FOREACH_ARRAY( p_ext, p_mgr->extensions )
{
if( !p_ext )
break;
+
+ vlc_mutex_lock( &p_ext->p_sys->command_lock );
+ bool b_activated = p_ext->p_sys->b_activated;
+ vlc_mutex_unlock( &p_ext->p_sys->command_lock );
+
+ if( b_activated == true )
+ Deactivate( p_mgr, p_ext );
+
if( p_ext->p_sys->b_thread_running == true )
vlc_join( p_ext->p_sys->thread, NULL );
@@ -190,9 +176,6 @@ void Close_Extension( vlc_object_t *p_this )
FOREACH_END()
vlc_mutex_destroy( &p_mgr->lock );
- vlc_mutex_destroy( &p_mgr->p_sys->lock );
- free( p_mgr->p_sys );
- p_mgr->p_sys = NULL;
ARRAY_RESET( p_mgr->extensions );
}
@@ -532,7 +515,9 @@ static int Control( extensions_manager_t *p_mgr, int i_control, va_list args )
case EXTENSION_IS_ACTIVATED:
p_ext = ( extension_t* ) va_arg( args, extension_t* );
pb = ( bool* ) va_arg( args, bool* );
- *pb = IsActivated( p_mgr, p_ext );
+ vlc_mutex_lock( &p_ext->p_sys->command_lock );
+ *pb = p_ext->p_sys->b_activated;
+ vlc_mutex_unlock( &p_ext->p_sys->command_lock );
break;
case EXTENSION_HAS_MENU:
@@ -651,8 +636,7 @@ int lua_ExtensionDeactivate( extensions_manager_t *p_mgr, extension_t *p_ext )
{
assert( p_mgr != NULL && p_ext != NULL );
- // b_exiting will be set to true once the entire tear down has been completed
- if( p_ext->p_sys->b_exiting == true )
+ if( p_ext->p_sys->b_activated == false )
return VLC_SUCCESS;
vlclua_fd_interrupt( &p_ext->p_sys->dtable );
@@ -703,11 +687,14 @@ static int GetMenuEntries( extensions_manager_t *p_mgr, extension_t *p_ext,
assert( *pppsz_titles == NULL );
assert( *ppi_ids == NULL );
- if( !IsActivated( p_mgr, p_ext ) )
+ vlc_mutex_lock( &p_ext->p_sys->command_lock );
+ if( p_ext->p_sys->b_activated == false )
{
+ vlc_mutex_unlock( &p_ext->p_sys->command_lock );
msg_Dbg( p_mgr, "Can't get menu before activating the extension!" );
return VLC_EGENERIC;
}
+ vlc_mutex_unlock( &p_ext->p_sys->command_lock );
if( !LockExtension( p_ext ) )
{
diff --git a/modules/lua/extension.h b/modules/lua/extension.h
index beaed15..5971ea7 100644
--- a/modules/lua/extension.h
+++ b/modules/lua/extension.h
@@ -51,18 +51,6 @@ typedef enum
LUA_TEXT
} lua_datatype_e;
-struct extensions_manager_sys_t
-{
- /* List of activated extensions */
- DECL_ARRAY( extension_t* ) activated_extensions;
-
- /* Lock for this list */
- vlc_mutex_t lock;
-
- /* Flag indicating that the module is about to be unloaded */
- bool b_killed;
-};
-
struct extension_sys_t
{
/* Extension general */
@@ -99,11 +87,11 @@ struct extension_sys_t
bool b_exiting;
bool b_thread_running; //< Only accessed out of the extension thread.
+ bool b_activated; ///< Protected by the command lock
};
/* Extensions: manager functions */
int Activate( extensions_manager_t *p_mgr, extension_t * );
-bool IsActivated( extensions_manager_t *p_mgr, extension_t * );
int Deactivate( extensions_manager_t *p_mgr, extension_t * );
void KillExtension( extensions_manager_t *p_mgr, extension_t *p_ext );
int PushCommand__( extension_t *ext, bool unique, command_type_e cmd, va_list options );
diff --git a/modules/lua/extension_thread.c b/modules/lua/extension_thread.c
index 13b4221..ef66edc 100644
--- a/modules/lua/extension_thread.c
+++ b/modules/lua/extension_thread.c
@@ -38,7 +38,6 @@ struct thread_sys_t
/** Thread Run */
static void* Run( void *data );
static void FreeCommands( struct command_t *command );
-static int RemoveActivated( extensions_manager_t *p_mgr, extension_t *p_ext );
/**
* Activate an extension
@@ -55,16 +54,8 @@ int Activate( extensions_manager_t *p_mgr, extension_t *p_ext )
msg_Dbg( p_mgr, "Activating extension '%s'", p_ext->psz_title );
- if( IsActivated( p_mgr, p_ext ) )
- {
- msg_Warn( p_mgr, "Extension is already activated!" );
- return VLC_EGENERIC;
- }
-
- /* 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 );
+ if (p_sys->b_thread_running == true)
+ return VLC_SUCCESS;
/* Prepare first command */
p_sys->command = calloc( 1, sizeof( struct command_t ) );
@@ -87,32 +78,6 @@ int Activate( extensions_manager_t *p_mgr, extension_t *p_ext )
return VLC_SUCCESS;
}
-/** Look for an extension in the activated extensions list
- * @todo FIXME Should be entered with the lock held
- **/
-bool IsActivated( extensions_manager_t *p_mgr, extension_t *p_ext )
-{
- assert( p_ext != NULL );
- vlc_mutex_lock( &p_mgr->p_sys->lock );
-
- extension_t *p_iter;
- FOREACH_ARRAY( p_iter, p_mgr->p_sys->activated_extensions )
- {
- if( !p_iter )
- break;
- assert( p_iter->psz_name != NULL );
- if( !strcmp( p_iter->psz_name, p_ext->psz_name ) )
- {
- vlc_mutex_unlock( &p_mgr->p_sys->lock );
- return true;
- }
- }
- FOREACH_END()
-
- vlc_mutex_unlock( &p_mgr->p_sys->lock );
- return false;
-}
-
/** Recursively drop and free commands starting from "command" */
static void FreeCommands( struct command_t *command )
{
@@ -176,52 +141,16 @@ int Deactivate( extensions_manager_t *p_mgr, extension_t *p_ext )
return VLC_SUCCESS;
}
-/** Remove an extension from the activated list */
-static int RemoveActivated( extensions_manager_t *p_mgr, extension_t *p_ext )
-{
- if( p_mgr->p_sys->b_killed )
- return VLC_SUCCESS;
- vlc_mutex_lock( &p_mgr->p_sys->lock );
-
- int i_idx = -1;
- extension_t *p_iter;
- FOREACH_ARRAY( p_iter, p_mgr->p_sys->activated_extensions )
- {
- i_idx++;
- if( !p_iter )
- {
- i_idx = -1;
- break;
- }
- assert( p_iter->psz_name != NULL );
- if( !strcmp( p_iter->psz_name, p_ext->psz_name ) )
- break;
- }
- FOREACH_END()
-
- if( i_idx >= 0 )
- {
- ARRAY_REMOVE( p_mgr->p_sys->activated_extensions, i_idx );
- }
- else
- {
- msg_Dbg( p_mgr, "Can't find extension '%s' in the activated list",
- p_ext->psz_title );
- }
-
- vlc_mutex_unlock( &p_mgr->p_sys->lock );
- return (i_idx >= 0) ? VLC_SUCCESS : VLC_EGENERIC;
-}
-
void KillExtension( extensions_manager_t *p_mgr, extension_t *p_ext )
{
msg_Dbg( p_mgr, "Killing extension now" );
lua_ExtensionDeactivate( p_mgr, p_ext );
+
vlc_mutex_lock( &p_ext->p_sys->command_lock );
+ p_ext->p_sys->b_activated = false;
p_ext->p_sys->b_exiting = true;
vlc_cond_signal( &p_ext->p_sys->wait );
vlc_mutex_unlock( &p_ext->p_sys->command_lock );
- RemoveActivated( p_mgr, p_ext );
}
/** Push a UI command */
@@ -347,7 +276,11 @@ static void* Run( void *data )
{
msg_Err( p_mgr, "Could not activate extension!" );
Deactivate( p_mgr, p_ext );
+ break;
}
+ vlc_mutex_lock( &p_ext->p_sys->command_lock );
+ p_ext->p_sys->b_activated = true;
+ vlc_mutex_unlock( &p_ext->p_sys->command_lock );
break;
}
@@ -359,8 +292,10 @@ static void* Run( void *data )
msg_Warn( p_mgr, "Extension '%s' did not deactivate properly",
p_ext->psz_title );
}
+ vlc_mutex_lock( &p_ext->p_sys->command_lock );
p_ext->p_sys->b_exiting = true;
- RemoveActivated( p_mgr, p_ext );
+ p_ext->p_sys->b_activated = false;
+ vlc_mutex_unlock( &p_ext->p_sys->command_lock );
break;
}
More information about the vlc-commits
mailing list