From a06213d7f406c886dba790418ef8cca43d7ad140 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Cl=C3=A9ment=20Stenac?= Date: Sun, 24 Sep 2006 09:34:57 +0000 Subject: [PATCH] * Get rid of the Manager thread by making blocking interfaces listen to p_libvlc->b_die Not implemented for OS X as I am not sure, please check if it is feasible. * Don't run the dummy interface --- include/vlc_interface.h | 4 +++ modules/control/corba/corba.c | 6 ++-- modules/control/gestures.c | 4 +-- modules/control/hotkeys.c | 2 +- modules/control/http/http.c | 2 +- modules/control/lirc.c | 4 +-- modules/control/motion.c | 2 +- modules/control/netsync.c | 2 +- modules/control/rc.c | 6 ++-- modules/control/showintf.c | 4 +-- modules/control/telnet.c | 2 +- modules/gui/beos/Interface.cpp | 2 +- modules/gui/macosx/intf.m | 2 +- modules/gui/ncurses.c | 2 +- modules/gui/pda/pda.c | 6 ++-- modules/gui/qt4/main_interface.cpp | 2 +- modules/gui/skins2/src/vlcproc.cpp | 2 +- modules/gui/wince/timer.cpp | 4 +-- modules/gui/wxwidgets/timer.cpp | 2 +- modules/misc/dummy/interface.c | 15 +------- src/interface/interface.c | 57 ++++++++++-------------------- 21 files changed, 52 insertions(+), 80 deletions(-) diff --git a/include/vlc_interface.h b/include/vlc_interface.h index 5b127089fd..b01d2356f4 100644 --- a/include/vlc_interface.h +++ b/include/vlc_interface.h @@ -119,6 +119,10 @@ VLC_EXPORT( int, intf_RunThread, ( intf_thread_t * ) ); VLC_EXPORT( void, intf_StopThread, ( intf_thread_t * ) ); VLC_EXPORT( void, intf_Destroy, ( intf_thread_t * ) ); +/* If the interface is in the main thread, it should listen both to + * p_intf->b_die and p_libvlc->b_die */ +#define intf_ShouldDie( p_intf ) (p_intf->b_die || (p_intf->b_block && p_intf->p_libvlc->b_die ) ) + /*@}*/ /***************************************************************************** diff --git a/modules/control/corba/corba.c b/modules/control/corba/corba.c index 604ff3f78f..bc063c8e38 100644 --- a/modules/control/corba/corba.c +++ b/modules/control/corba/corba.c @@ -757,13 +757,13 @@ static gboolean Manage( gpointer p_interface ) msg_Err( p_intf, "Exception in CORBA events check loop" ); return FALSE; } - + vlc_mutex_lock( &p_intf->change_lock ); if( b_work_pending ) CORBA_ORB_perform_work( p_intf->p_sys->orb, ev ); - - if( p_intf->b_die ) + + if( intf_ShouldDie( p_intf ) ) { vlc_mutex_unlock( &p_intf->change_lock ); CORBA_ORB_shutdown( p_intf->p_sys->orb, TRUE, ev ); diff --git a/modules/control/gestures.c b/modules/control/gestures.c index 16de437ce9..627e1bb1a5 100644 --- a/modules/control/gestures.c +++ b/modules/control/gestures.c @@ -155,7 +155,7 @@ static void RunIntf( intf_thread_t *p_intf ) msg_Dbg( p_intf, "interface thread initialized" ); /* Main loop */ - while( !p_intf->b_die ) + while( !intf_ShouldDie( p_intf ) ) { vlc_mutex_lock( &p_intf->change_lock ); @@ -261,7 +261,7 @@ static int InitThread( intf_thread_t * p_intf ) { char *psz_button; /* we might need some locking here */ - if( !p_intf->b_die ) + if( !intf_ShouldDie( p_intf ) ) { input_thread_t * p_input; diff --git a/modules/control/hotkeys.c b/modules/control/hotkeys.c index fd6c118990..fe0c9b6dc5 100644 --- a/modules/control/hotkeys.c +++ b/modules/control/hotkeys.c @@ -164,7 +164,7 @@ static void Run( intf_thread_t *p_intf ) var_Set( p_intf->p_libvlc, p_hotkeys[i].psz_action, val ); } - while( !p_intf->b_die ) + while( !intf_ShouldDie( p_intf ) ) { int i_key, i_action; int i_times = 0; diff --git a/modules/control/http/http.c b/modules/control/http/http.c index d8ea465450..094f9f4d5c 100644 --- a/modules/control/http/http.c +++ b/modules/control/http/http.c @@ -431,7 +431,7 @@ static void Run( intf_thread_t *p_intf ) { intf_sys_t *p_sys = p_intf->p_sys; - while( !p_intf->b_die ) + while( !intf_ShouldDie( p_intf ) ) { /* get the playlist */ if( p_sys->p_playlist == NULL ) diff --git a/modules/control/lirc.c b/modules/control/lirc.c index 3e2e71cc63..fae7fabc31 100644 --- a/modules/control/lirc.c +++ b/modules/control/lirc.c @@ -120,7 +120,7 @@ static void Run( intf_thread_t *p_intf ) { char *code, *c; - while( !p_intf->b_die ) + while( !intf_ShouldDie( p_intf ) ) { /* Sleep a bit */ msleep( INTF_IDLE_SLEEP ); @@ -136,7 +136,7 @@ static void Run( intf_thread_t *p_intf ) continue; } - while( !p_intf->b_die + while( !intf_ShouldDie( p_intf ) && lirc_code2char( p_intf->p_sys->config, code, &c ) == 0 && c != NULL ) { diff --git a/modules/control/motion.c b/modules/control/motion.c index d723b936d3..25856e6b1c 100644 --- a/modules/control/motion.c +++ b/modules/control/motion.c @@ -132,7 +132,7 @@ static void RunIntf( intf_thread_t *p_intf ) { int i_x, i_oldx = 0; - while( !p_intf->b_die ) + while( !intf_ShouldDie( p_intf ) ) { #define LOW_THRESHOLD 80 #define HIGH_THRESHOLD 100 diff --git a/modules/control/netsync.c b/modules/control/netsync.c index 5280814a4f..fbe56124f2 100644 --- a/modules/control/netsync.c +++ b/modules/control/netsync.c @@ -159,7 +159,7 @@ static void Run( intf_thread_t *p_intf ) /* High priority thread */ vlc_thread_set_priority( p_intf, VLC_THREAD_PRIORITY_INPUT ); - while( !p_intf->b_die ) + while( !intf_ShouldDie( p_intf ) ) { struct timeval timeout; fd_set fds_r; diff --git a/modules/control/rc.c b/modules/control/rc.c index 49b5d44f4f..7587a1b8bc 100644 --- a/modules/control/rc.c +++ b/modules/control/rc.c @@ -560,7 +560,7 @@ static void Run( intf_thread_t *p_intf ) } #endif - while( !p_intf->b_die ) + while( !intf_ShouldDie( p_intf ) ) { char *psz_cmd, *psz_arg; vlc_bool_t b_complete; @@ -2201,7 +2201,7 @@ vlc_bool_t ReadWin32( intf_thread_t *p_intf, char *p_buffer, int *pi_size ) while( WaitForSingleObject( p_intf->p_sys->hConsoleIn, INTF_IDLE_SLEEP/1000 ) == WAIT_OBJECT_0 ) { - while( !p_intf->b_die && *pi_size < MAX_LINE_LENGTH && + while( !intf_ShouldDie( p_intf ) && *pi_size < MAX_LINE_LENGTH && ReadConsoleInput( p_intf->p_sys->hConsoleIn, &input_record, 1, &i_dw ) ) { @@ -2271,7 +2271,7 @@ vlc_bool_t ReadCommand( intf_thread_t *p_intf, char *p_buffer, int *pi_size ) } #endif - while( !p_intf->b_die && *pi_size < MAX_LINE_LENGTH && + while( !intf_ShouldDie( p_intf ) && *pi_size < MAX_LINE_LENGTH && (i_read = net_ReadNonBlock( p_intf, p_intf->p_sys->i_socket == -1 ? 0 /*STDIN_FILENO*/ : p_intf->p_sys->i_socket, NULL, (uint8_t *)p_buffer + *pi_size, 1, INTF_IDLE_SLEEP ) ) > 0 ) diff --git a/modules/control/showintf.c b/modules/control/showintf.c index 55cc2713fa..801987e90f 100644 --- a/modules/control/showintf.c +++ b/modules/control/showintf.c @@ -116,7 +116,7 @@ static void RunIntf( intf_thread_t *p_intf ) } /* Main loop */ - while( !p_intf->b_die ) + while( !intf_ShouldDie( p_intf ) ) { vlc_mutex_lock( &p_intf->change_lock ); @@ -175,7 +175,7 @@ static void RunIntf( intf_thread_t *p_intf ) *****************************************************************************/ static int InitThread( intf_thread_t * p_intf ) { - if( !p_intf->b_die ) + if( !intf_ShouldDie( p_intf ) ) { vlc_mutex_lock( &p_intf->change_lock ); diff --git a/modules/control/telnet.c b/modules/control/telnet.c index 9bf7278b40..2bf5c024b4 100644 --- a/modules/control/telnet.c +++ b/modules/control/telnet.c @@ -245,7 +245,7 @@ static void Run( intf_thread_t *p_intf ) psz_password = config_GetPsz( p_intf, "telnet-password" ); - while( !p_intf->b_die ) + while( !intf_ShouldDie( p_intf ) ) { fd_set fds_read, fds_write; int i_handle_max = 0; diff --git a/modules/gui/beos/Interface.cpp b/modules/gui/beos/Interface.cpp index 2b817ea882..a480e9818b 100644 --- a/modules/gui/beos/Interface.cpp +++ b/modules/gui/beos/Interface.cpp @@ -119,7 +119,7 @@ void E_(CloseIntf) ( vlc_object_t *p_this ) *****************************************************************************/ static void Run( intf_thread_t *p_intf ) { - while( !p_intf->b_die ) + while( !intf_ShouldDie( p_intf ) ) { p_intf->p_sys->p_window->UpdateInterface(); msleep( INTF_IDLE_SLEEP ); diff --git a/modules/gui/macosx/intf.m b/modules/gui/macosx/intf.m index e89796e2ec..4c8161f039 100644 --- a/modules/gui/macosx/intf.m +++ b/modules/gui/macosx/intf.m @@ -1006,7 +1006,7 @@ static VLCMain *_o_sharedMainInstance = nil; vlc_object_release( p_playlist ); - while( !p_intf->b_die ) + while( !intf_ShouldDie( p_intf ) ) { vlc_mutex_lock( &p_intf->change_lock ); diff --git a/modules/gui/ncurses.c b/modules/gui/ncurses.c index a63d7ba312..0e7c541be2 100644 --- a/modules/gui/ncurses.c +++ b/modules/gui/ncurses.c @@ -336,7 +336,7 @@ static void Run( intf_thread_t *p_intf ) */ t_last_refresh = ( time( 0 ) - 1); - while( !p_intf->b_die ) + while( !intf_ShouldDie( p_intf ) ) { msleep( INTF_IDLE_SLEEP ); diff --git a/modules/gui/pda/pda.c b/modules/gui/pda/pda.c index 0f5be409b3..ae9fac907e 100644 --- a/modules/gui/pda/pda.c +++ b/modules/gui/pda/pda.c @@ -319,7 +319,7 @@ static void Run( intf_thread_t *p_intf ) #ifdef NEED_GTK2_MAIN msg_Dbg( p_intf, "Manage GTK keyboard events using threads" ); - while( !p_intf->b_die ) + while( !intf_ShouldDie( p_intf ) ) { Manage( p_intf ); @@ -518,14 +518,14 @@ static int Manage( intf_thread_t *p_intf ) } vlc_mutex_unlock( &p_input->object_lock ); } - else if( p_intf->p_sys->b_playing && !p_intf->b_die ) + else if( p_intf->p_sys->b_playing && !intf_ShouldDie( p_intf ) ) { E_(GtkModeManage)( p_intf ); p_intf->p_sys->b_playing = 0; } #ifndef NEED_GTK2_MAIN - if( p_intf->b_die ) + if( intf_ShouldDie( p_intf ) ) { vlc_mutex_unlock( &p_intf->change_lock ); diff --git a/modules/gui/qt4/main_interface.cpp b/modules/gui/qt4/main_interface.cpp index f6238520c6..7251d2e593 100644 --- a/modules/gui/qt4/main_interface.cpp +++ b/modules/gui/qt4/main_interface.cpp @@ -621,7 +621,7 @@ void MainInterface::updateOnTimer() advControls->enableInput( THEMIM->getIM()->hasInput() ); advControls->enableVideo( THEMIM->getIM()->hasVideo() ); - if( p_intf->b_die ) + if( intf_ShouldDie( p_intf ) ) { QApplication::closeAllWindows(); QApplication::quit(); diff --git a/modules/gui/skins2/src/vlcproc.cpp b/modules/gui/skins2/src/vlcproc.cpp index fc04626fc3..608a41cad8 100644 --- a/modules/gui/skins2/src/vlcproc.cpp +++ b/modules/gui/skins2/src/vlcproc.cpp @@ -230,7 +230,7 @@ void VlcProc::dropVout() void VlcProc::manage() { // Did the user request to quit vlc ? - if( getIntf()->b_die || getIntf()->p_libvlc->b_die ) + if( intf_ShouldDie( getIntf() ) ) { CmdQuit *pCmd = new CmdQuit( getIntf() ); AsyncQueue *pQueue = AsyncQueue::instance( getIntf() ); diff --git a/modules/gui/wince/timer.cpp b/modules/gui/wince/timer.cpp index a9a5c3a269..bcb8874062 100644 --- a/modules/gui/wince/timer.cpp +++ b/modules/gui/wince/timer.cpp @@ -210,14 +210,14 @@ void Timer::Notify( void ) } } } - else if( p_intf->p_sys->b_playing && !p_intf->b_die ) + else if( p_intf->p_sys->b_playing && !intf_ShouldDie( p_intf ) ) { p_intf->p_sys->b_playing = 0; p_main_interface->TogglePlayButton( PAUSE_S ); i_old_playing_status = PAUSE_S; } - if( p_intf->b_die ) + if( intf_ShouldDie( p_intf ) ) { vlc_mutex_unlock( &p_intf->change_lock ); diff --git a/modules/gui/wxwidgets/timer.cpp b/modules/gui/wxwidgets/timer.cpp index 4ba69a621b..9d77eccf30 100644 --- a/modules/gui/wxwidgets/timer.cpp +++ b/modules/gui/wxwidgets/timer.cpp @@ -107,7 +107,7 @@ void Timer::Notify() p_intf->p_sys->b_intf_show = VLC_FALSE; } - if( p_intf->b_die ) + if( intf_ShouldDie( p_intf ) ) { vlc_mutex_unlock( &p_intf->change_lock ); diff --git a/modules/misc/dummy/interface.c b/modules/misc/dummy/interface.c index 3b33c4f52f..2366bd272e 100644 --- a/modules/misc/dummy/interface.c +++ b/modules/misc/dummy/interface.c @@ -51,20 +51,7 @@ int E_(OpenIntf) ( vlc_object_t *p_this ) msg_Info( p_intf, "using the dummy interface module..." ); - p_intf->pf_run = Run; + p_intf->pf_run = NULL; return VLC_SUCCESS; } - -/***************************************************************************** - * Run: main loop - *****************************************************************************/ -static void Run( intf_thread_t *p_intf ) -{ - while( !p_intf->b_die ) - { - /* Wait a bit */ - msleep( INTF_IDLE_SLEEP ); - } -} - diff --git a/src/interface/interface.c b/src/interface/interface.c index fbf9686f58..6216136fc5 100644 --- a/src/interface/interface.c +++ b/src/interface/interface.c @@ -52,7 +52,6 @@ /***************************************************************************** * Local prototypes *****************************************************************************/ -static void Manager( intf_thread_t *p_intf ); static void RunInterface( intf_thread_t *p_intf ); static int SwitchIntfCallback( vlc_object_t *, char const *, @@ -61,6 +60,7 @@ static int AddIntfCallback( vlc_object_t *, char const *, vlc_value_t , vlc_value_t , void * ); #ifdef __APPLE__ +static void Manager( intf_thread_t *p_intf ); /***************************************************************************** * VLCApplication interface *****************************************************************************/ @@ -188,9 +188,8 @@ int intf_RunThread( intf_thread_t *p_intf ) { /* This interface doesn't need to be run */ if( !p_intf->pf_run ) - { return VLC_SUCCESS; - } + /* Run the interface in a separate thread */ if( !strcmp( p_intf->p_module->psz_object_name, "macosx" ) ) { @@ -216,16 +215,16 @@ int intf_RunThread( intf_thread_t *p_intf ) #else if( p_intf->b_block ) { - /* Run a manager thread, launch the interface, kill the manager */ - if( vlc_thread_create( p_intf, "manager", Manager, - VLC_THREAD_PRIORITY_LOW, VLC_FALSE ) ) + /* If the main interface does not have a run function, + * implement a waiting loop ourselves + */ + if( p_intf->pf_run ) + RunInterface( p_intf ); + else { - msg_Err( p_intf, "cannot spawn manager thread" ); - return VLC_EGENERIC; + while( !intf_ShouldDie( p_intf ) ) + msleep( INTF_IDLE_SLEEP * 2); } - - RunInterface( p_intf ); - p_intf->b_die = VLC_TRUE; /* Do not join the thread... intf_StopThread will do it for us */ } @@ -261,11 +260,9 @@ void intf_StopThread( intf_thread_t *p_intf ) if( !p_intf->b_block ) { p_intf->b_die = VLC_TRUE; + if( p_intf->pf_run ) + vlc_thread_join( p_intf ); } - - /* Wait for the thread to exit */ - if( p_intf->pf_run ) - vlc_thread_join( p_intf ); } /** @@ -293,24 +290,9 @@ void intf_Destroy( intf_thread_t *p_intf ) /* Following functions are local */ /***************************************************************************** - * Manager: helper thread for blocking interfaces - ***************************************************************************** - * If the interface is launched in the main thread, it will not listen to - * p_vlc->b_die events because it is only supposed to listen to p_intf->b_die. - * This thread takes care of the matter. + * Manager: helper thread for blocking OS X *****************************************************************************/ -/** - * \brief Helper thread for blocking interfaces. - * \ingroup vlc_interface - * - * This is a local function - * If the interface is launched in the main thread, it will not listen to - * p_vlc->b_die events because it is only supposed to listen to p_intf->b_die. - * This thread takes care of the matter. - * \see intf_RunThread - * \param p_intf an interface thread - * \return nothing - */ +#ifdef __APPLE__ static void Manager( intf_thread_t *p_intf ) { while( !p_intf->b_die ) @@ -320,16 +302,15 @@ static void Manager( intf_thread_t *p_intf ) if( p_intf->p_libvlc->b_die ) { p_intf->b_die = VLC_TRUE; -#ifdef __APPLE__ - if( strncmp( p_intf->p_libvlc->psz_object_name, "clivlc", 6 ) ) - { - [NSApp stop: NULL]; - } -#endif + if( strncmp( p_intf->p_libvlc->psz_object_name, "clivlc", 6 ) ) + { + [NSApp stop: NULL]; + } return; } } } +#endif /***************************************************************************** * RunInterface: setups necessary data and give control to the interface -- 2.39.2