Commit a06213d7 authored by Clément Stenac's avatar Clément Stenac

* 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
parent ade29e26
...@@ -119,6 +119,10 @@ VLC_EXPORT( int, intf_RunThread, ( intf_thread_t * ) ); ...@@ -119,6 +119,10 @@ VLC_EXPORT( int, intf_RunThread, ( intf_thread_t * ) );
VLC_EXPORT( void, intf_StopThread, ( intf_thread_t * ) ); VLC_EXPORT( void, intf_StopThread, ( intf_thread_t * ) );
VLC_EXPORT( void, intf_Destroy, ( 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 ) )
/*@}*/ /*@}*/
/***************************************************************************** /*****************************************************************************
......
...@@ -763,7 +763,7 @@ static gboolean Manage( gpointer p_interface ) ...@@ -763,7 +763,7 @@ static gboolean Manage( gpointer p_interface )
if( b_work_pending ) if( b_work_pending )
CORBA_ORB_perform_work( p_intf->p_sys->orb, ev ); 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 ); vlc_mutex_unlock( &p_intf->change_lock );
CORBA_ORB_shutdown( p_intf->p_sys->orb, TRUE, ev ); CORBA_ORB_shutdown( p_intf->p_sys->orb, TRUE, ev );
......
...@@ -155,7 +155,7 @@ static void RunIntf( intf_thread_t *p_intf ) ...@@ -155,7 +155,7 @@ static void RunIntf( intf_thread_t *p_intf )
msg_Dbg( p_intf, "interface thread initialized" ); msg_Dbg( p_intf, "interface thread initialized" );
/* Main loop */ /* Main loop */
while( !p_intf->b_die ) while( !intf_ShouldDie( p_intf ) )
{ {
vlc_mutex_lock( &p_intf->change_lock ); vlc_mutex_lock( &p_intf->change_lock );
...@@ -261,7 +261,7 @@ static int InitThread( intf_thread_t * p_intf ) ...@@ -261,7 +261,7 @@ static int InitThread( intf_thread_t * p_intf )
{ {
char *psz_button; char *psz_button;
/* we might need some locking here */ /* we might need some locking here */
if( !p_intf->b_die ) if( !intf_ShouldDie( p_intf ) )
{ {
input_thread_t * p_input; input_thread_t * p_input;
......
...@@ -164,7 +164,7 @@ static void Run( intf_thread_t *p_intf ) ...@@ -164,7 +164,7 @@ static void Run( intf_thread_t *p_intf )
var_Set( p_intf->p_libvlc, p_hotkeys[i].psz_action, val ); 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_key, i_action;
int i_times = 0; int i_times = 0;
......
...@@ -431,7 +431,7 @@ static void Run( intf_thread_t *p_intf ) ...@@ -431,7 +431,7 @@ static void Run( intf_thread_t *p_intf )
{ {
intf_sys_t *p_sys = p_intf->p_sys; intf_sys_t *p_sys = p_intf->p_sys;
while( !p_intf->b_die ) while( !intf_ShouldDie( p_intf ) )
{ {
/* get the playlist */ /* get the playlist */
if( p_sys->p_playlist == NULL ) if( p_sys->p_playlist == NULL )
......
...@@ -120,7 +120,7 @@ static void Run( intf_thread_t *p_intf ) ...@@ -120,7 +120,7 @@ static void Run( intf_thread_t *p_intf )
{ {
char *code, *c; char *code, *c;
while( !p_intf->b_die ) while( !intf_ShouldDie( p_intf ) )
{ {
/* Sleep a bit */ /* Sleep a bit */
msleep( INTF_IDLE_SLEEP ); msleep( INTF_IDLE_SLEEP );
...@@ -136,7 +136,7 @@ static void Run( intf_thread_t *p_intf ) ...@@ -136,7 +136,7 @@ static void Run( intf_thread_t *p_intf )
continue; continue;
} }
while( !p_intf->b_die while( !intf_ShouldDie( p_intf )
&& lirc_code2char( p_intf->p_sys->config, code, &c ) == 0 && lirc_code2char( p_intf->p_sys->config, code, &c ) == 0
&& c != NULL ) && c != NULL )
{ {
......
...@@ -132,7 +132,7 @@ static void RunIntf( intf_thread_t *p_intf ) ...@@ -132,7 +132,7 @@ static void RunIntf( intf_thread_t *p_intf )
{ {
int i_x, i_oldx = 0; int i_x, i_oldx = 0;
while( !p_intf->b_die ) while( !intf_ShouldDie( p_intf ) )
{ {
#define LOW_THRESHOLD 80 #define LOW_THRESHOLD 80
#define HIGH_THRESHOLD 100 #define HIGH_THRESHOLD 100
......
...@@ -159,7 +159,7 @@ static void Run( intf_thread_t *p_intf ) ...@@ -159,7 +159,7 @@ static void Run( intf_thread_t *p_intf )
/* High priority thread */ /* High priority thread */
vlc_thread_set_priority( p_intf, VLC_THREAD_PRIORITY_INPUT ); vlc_thread_set_priority( p_intf, VLC_THREAD_PRIORITY_INPUT );
while( !p_intf->b_die ) while( !intf_ShouldDie( p_intf ) )
{ {
struct timeval timeout; struct timeval timeout;
fd_set fds_r; fd_set fds_r;
......
...@@ -560,7 +560,7 @@ static void Run( intf_thread_t *p_intf ) ...@@ -560,7 +560,7 @@ static void Run( intf_thread_t *p_intf )
} }
#endif #endif
while( !p_intf->b_die ) while( !intf_ShouldDie( p_intf ) )
{ {
char *psz_cmd, *psz_arg; char *psz_cmd, *psz_arg;
vlc_bool_t b_complete; vlc_bool_t b_complete;
...@@ -2201,7 +2201,7 @@ vlc_bool_t ReadWin32( intf_thread_t *p_intf, char *p_buffer, int *pi_size ) ...@@ -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, while( WaitForSingleObject( p_intf->p_sys->hConsoleIn,
INTF_IDLE_SLEEP/1000 ) == WAIT_OBJECT_0 ) 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, ReadConsoleInput( p_intf->p_sys->hConsoleIn, &input_record,
1, &i_dw ) ) 1, &i_dw ) )
{ {
...@@ -2271,7 +2271,7 @@ vlc_bool_t ReadCommand( intf_thread_t *p_intf, char *p_buffer, int *pi_size ) ...@@ -2271,7 +2271,7 @@ vlc_bool_t ReadCommand( intf_thread_t *p_intf, char *p_buffer, int *pi_size )
} }
#endif #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 ? (i_read = net_ReadNonBlock( p_intf, p_intf->p_sys->i_socket == -1 ?
0 /*STDIN_FILENO*/ : p_intf->p_sys->i_socket, NULL, 0 /*STDIN_FILENO*/ : p_intf->p_sys->i_socket, NULL,
(uint8_t *)p_buffer + *pi_size, 1, INTF_IDLE_SLEEP ) ) > 0 ) (uint8_t *)p_buffer + *pi_size, 1, INTF_IDLE_SLEEP ) ) > 0 )
......
...@@ -116,7 +116,7 @@ static void RunIntf( intf_thread_t *p_intf ) ...@@ -116,7 +116,7 @@ static void RunIntf( intf_thread_t *p_intf )
} }
/* Main loop */ /* Main loop */
while( !p_intf->b_die ) while( !intf_ShouldDie( p_intf ) )
{ {
vlc_mutex_lock( &p_intf->change_lock ); vlc_mutex_lock( &p_intf->change_lock );
...@@ -175,7 +175,7 @@ static void RunIntf( intf_thread_t *p_intf ) ...@@ -175,7 +175,7 @@ static void RunIntf( intf_thread_t *p_intf )
*****************************************************************************/ *****************************************************************************/
static int InitThread( 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 ); vlc_mutex_lock( &p_intf->change_lock );
......
...@@ -245,7 +245,7 @@ static void Run( intf_thread_t *p_intf ) ...@@ -245,7 +245,7 @@ static void Run( intf_thread_t *p_intf )
psz_password = config_GetPsz( p_intf, "telnet-password" ); psz_password = config_GetPsz( p_intf, "telnet-password" );
while( !p_intf->b_die ) while( !intf_ShouldDie( p_intf ) )
{ {
fd_set fds_read, fds_write; fd_set fds_read, fds_write;
int i_handle_max = 0; int i_handle_max = 0;
......
...@@ -119,7 +119,7 @@ void E_(CloseIntf) ( vlc_object_t *p_this ) ...@@ -119,7 +119,7 @@ void E_(CloseIntf) ( vlc_object_t *p_this )
*****************************************************************************/ *****************************************************************************/
static void Run( intf_thread_t *p_intf ) 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(); p_intf->p_sys->p_window->UpdateInterface();
msleep( INTF_IDLE_SLEEP ); msleep( INTF_IDLE_SLEEP );
......
...@@ -1006,7 +1006,7 @@ static VLCMain *_o_sharedMainInstance = nil; ...@@ -1006,7 +1006,7 @@ static VLCMain *_o_sharedMainInstance = nil;
vlc_object_release( p_playlist ); vlc_object_release( p_playlist );
while( !p_intf->b_die ) while( !intf_ShouldDie( p_intf ) )
{ {
vlc_mutex_lock( &p_intf->change_lock ); vlc_mutex_lock( &p_intf->change_lock );
......
...@@ -336,7 +336,7 @@ static void Run( intf_thread_t *p_intf ) ...@@ -336,7 +336,7 @@ static void Run( intf_thread_t *p_intf )
*/ */
t_last_refresh = ( time( 0 ) - 1); t_last_refresh = ( time( 0 ) - 1);
while( !p_intf->b_die ) while( !intf_ShouldDie( p_intf ) )
{ {
msleep( INTF_IDLE_SLEEP ); msleep( INTF_IDLE_SLEEP );
......
...@@ -319,7 +319,7 @@ static void Run( intf_thread_t *p_intf ) ...@@ -319,7 +319,7 @@ static void Run( intf_thread_t *p_intf )
#ifdef NEED_GTK2_MAIN #ifdef NEED_GTK2_MAIN
msg_Dbg( p_intf, "Manage GTK keyboard events using threads" ); msg_Dbg( p_intf, "Manage GTK keyboard events using threads" );
while( !p_intf->b_die ) while( !intf_ShouldDie( p_intf ) )
{ {
Manage( p_intf ); Manage( p_intf );
...@@ -518,14 +518,14 @@ static int Manage( intf_thread_t *p_intf ) ...@@ -518,14 +518,14 @@ static int Manage( intf_thread_t *p_intf )
} }
vlc_mutex_unlock( &p_input->object_lock ); 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 ); E_(GtkModeManage)( p_intf );
p_intf->p_sys->b_playing = 0; p_intf->p_sys->b_playing = 0;
} }
#ifndef NEED_GTK2_MAIN #ifndef NEED_GTK2_MAIN
if( p_intf->b_die ) if( intf_ShouldDie( p_intf ) )
{ {
vlc_mutex_unlock( &p_intf->change_lock ); vlc_mutex_unlock( &p_intf->change_lock );
......
...@@ -621,7 +621,7 @@ void MainInterface::updateOnTimer() ...@@ -621,7 +621,7 @@ void MainInterface::updateOnTimer()
advControls->enableInput( THEMIM->getIM()->hasInput() ); advControls->enableInput( THEMIM->getIM()->hasInput() );
advControls->enableVideo( THEMIM->getIM()->hasVideo() ); advControls->enableVideo( THEMIM->getIM()->hasVideo() );
if( p_intf->b_die ) if( intf_ShouldDie( p_intf ) )
{ {
QApplication::closeAllWindows(); QApplication::closeAllWindows();
QApplication::quit(); QApplication::quit();
......
...@@ -230,7 +230,7 @@ void VlcProc::dropVout() ...@@ -230,7 +230,7 @@ void VlcProc::dropVout()
void VlcProc::manage() void VlcProc::manage()
{ {
// Did the user request to quit vlc ? // 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() ); CmdQuit *pCmd = new CmdQuit( getIntf() );
AsyncQueue *pQueue = AsyncQueue::instance( getIntf() ); AsyncQueue *pQueue = AsyncQueue::instance( getIntf() );
......
...@@ -210,14 +210,14 @@ void Timer::Notify( void ) ...@@ -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_intf->p_sys->b_playing = 0;
p_main_interface->TogglePlayButton( PAUSE_S ); p_main_interface->TogglePlayButton( PAUSE_S );
i_old_playing_status = 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 ); vlc_mutex_unlock( &p_intf->change_lock );
......
...@@ -107,7 +107,7 @@ void Timer::Notify() ...@@ -107,7 +107,7 @@ void Timer::Notify()
p_intf->p_sys->b_intf_show = VLC_FALSE; 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 ); vlc_mutex_unlock( &p_intf->change_lock );
......
...@@ -51,20 +51,7 @@ int E_(OpenIntf) ( vlc_object_t *p_this ) ...@@ -51,20 +51,7 @@ int E_(OpenIntf) ( vlc_object_t *p_this )
msg_Info( p_intf, "using the dummy interface module..." ); msg_Info( p_intf, "using the dummy interface module..." );
p_intf->pf_run = Run; p_intf->pf_run = NULL;
return VLC_SUCCESS; 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 );
}
}
...@@ -52,7 +52,6 @@ ...@@ -52,7 +52,6 @@
/***************************************************************************** /*****************************************************************************
* Local prototypes * Local prototypes
*****************************************************************************/ *****************************************************************************/
static void Manager( intf_thread_t *p_intf );
static void RunInterface( intf_thread_t *p_intf ); static void RunInterface( intf_thread_t *p_intf );
static int SwitchIntfCallback( vlc_object_t *, char const *, static int SwitchIntfCallback( vlc_object_t *, char const *,
...@@ -61,6 +60,7 @@ static int AddIntfCallback( vlc_object_t *, char const *, ...@@ -61,6 +60,7 @@ static int AddIntfCallback( vlc_object_t *, char const *,
vlc_value_t , vlc_value_t , void * ); vlc_value_t , vlc_value_t , void * );
#ifdef __APPLE__ #ifdef __APPLE__
static void Manager( intf_thread_t *p_intf );
/***************************************************************************** /*****************************************************************************
* VLCApplication interface * VLCApplication interface
*****************************************************************************/ *****************************************************************************/
...@@ -188,9 +188,8 @@ int intf_RunThread( intf_thread_t *p_intf ) ...@@ -188,9 +188,8 @@ int intf_RunThread( intf_thread_t *p_intf )
{ {
/* This interface doesn't need to be run */ /* This interface doesn't need to be run */
if( !p_intf->pf_run ) if( !p_intf->pf_run )
{
return VLC_SUCCESS; return VLC_SUCCESS;
}
/* Run the interface in a separate thread */ /* Run the interface in a separate thread */
if( !strcmp( p_intf->p_module->psz_object_name, "macosx" ) ) if( !strcmp( p_intf->p_module->psz_object_name, "macosx" ) )
{ {
...@@ -216,16 +215,16 @@ int intf_RunThread( intf_thread_t *p_intf ) ...@@ -216,16 +215,16 @@ int intf_RunThread( intf_thread_t *p_intf )
#else #else
if( p_intf->b_block ) if( p_intf->b_block )
{ {
/* Run a manager thread, launch the interface, kill the manager */ /* If the main interface does not have a run function,
if( vlc_thread_create( p_intf, "manager", Manager, * implement a waiting loop ourselves
VLC_THREAD_PRIORITY_LOW, VLC_FALSE ) ) */
if( p_intf->pf_run )
RunInterface( p_intf );
else
{ {
msg_Err( p_intf, "cannot spawn manager thread" ); while( !intf_ShouldDie( p_intf ) )
return VLC_EGENERIC; msleep( INTF_IDLE_SLEEP * 2);
} }
RunInterface( p_intf );
p_intf->b_die = VLC_TRUE; p_intf->b_die = VLC_TRUE;
/* Do not join the thread... intf_StopThread will do it for us */ /* Do not join the thread... intf_StopThread will do it for us */
} }
...@@ -261,11 +260,9 @@ void intf_StopThread( intf_thread_t *p_intf ) ...@@ -261,11 +260,9 @@ void intf_StopThread( intf_thread_t *p_intf )
if( !p_intf->b_block ) if( !p_intf->b_block )
{ {
p_intf->b_die = VLC_TRUE; p_intf->b_die = VLC_TRUE;
}
/* Wait for the thread to exit */
if( p_intf->pf_run ) if( p_intf->pf_run )
vlc_thread_join( p_intf ); vlc_thread_join( p_intf );
}
} }
/** /**
...@@ -293,24 +290,9 @@ void intf_Destroy( intf_thread_t *p_intf ) ...@@ -293,24 +290,9 @@ void intf_Destroy( intf_thread_t *p_intf )
/* Following functions are local */ /* Following functions are local */
/***************************************************************************** /*****************************************************************************
* Manager: helper thread for blocking interfaces * Manager: helper thread for blocking OS X
*****************************************************************************
* 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.
*****************************************************************************/ *****************************************************************************/
/** #ifdef __APPLE__
* \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
*/
static void Manager( intf_thread_t *p_intf ) static void Manager( intf_thread_t *p_intf )
{ {
while( !p_intf->b_die ) while( !p_intf->b_die )
...@@ -320,16 +302,15 @@ static void Manager( intf_thread_t *p_intf ) ...@@ -320,16 +302,15 @@ static void Manager( intf_thread_t *p_intf )
if( p_intf->p_libvlc->b_die ) if( p_intf->p_libvlc->b_die )
{ {
p_intf->b_die = VLC_TRUE; p_intf->b_die = VLC_TRUE;
#ifdef __APPLE__
if( strncmp( p_intf->p_libvlc->psz_object_name, "clivlc", 6 ) ) if( strncmp( p_intf->p_libvlc->psz_object_name, "clivlc", 6 ) )
{ {
[NSApp stop: NULL]; [NSApp stop: NULL];
} }
#endif
return; return;
} }
} }
} }
#endif
/***************************************************************************** /*****************************************************************************
* RunInterface: setups necessary data and give control to the interface * RunInterface: setups necessary data and give control to the interface
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment