Commit f645d20b authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Replace intf_StopThread() with intf_DestroyAll()

parent e509d7f8
...@@ -100,7 +100,6 @@ struct intf_dialog_args_t ...@@ -100,7 +100,6 @@ struct intf_dialog_args_t
*****************************************************************************/ *****************************************************************************/
VLC_EXPORT( int, intf_Create, ( vlc_object_t *, const char * ) ); VLC_EXPORT( int, intf_Create, ( vlc_object_t *, const char * ) );
#define intf_Create(a,b) intf_Create(VLC_OBJECT(a),b) #define intf_Create(a,b) intf_Create(VLC_OBJECT(a),b)
VLC_EXPORT( void, intf_StopThread, ( intf_thread_t * ) );
#define intf_Eject(a,b) __intf_Eject(VLC_OBJECT(a),b) #define intf_Eject(a,b) __intf_Eject(VLC_OBJECT(a),b)
VLC_EXPORT( int, __intf_Eject, ( vlc_object_t *, const char * ) ); VLC_EXPORT( int, __intf_Eject, ( vlc_object_t *, const char * ) );
......
...@@ -58,20 +58,6 @@ static void * MonitorLibVLCDeath( vlc_object_t *p_this ); ...@@ -58,20 +58,6 @@ static void * MonitorLibVLCDeath( vlc_object_t *p_this );
static int AddIntfCallback( vlc_object_t *, char const *, static int AddIntfCallback( vlc_object_t *, char const *,
vlc_value_t , vlc_value_t , void * ); vlc_value_t , vlc_value_t , void * );
/**
* Destroy the interface after the main loop endeed.
*
* @param p_obj: the interface thread
*/
static void intf_Destroy( vlc_object_t *obj )
{
intf_thread_t *p_intf = (intf_thread_t *)obj;
free( p_intf->psz_intf );
config_ChainDestroy( p_intf->p_cfg );
}
#undef intf_Create #undef intf_Create
/** /**
* Create and start an interface. * Create and start an interface.
...@@ -116,7 +102,6 @@ int intf_Create( vlc_object_t *p_this, const char *psz_module ) ...@@ -116,7 +102,6 @@ int intf_Create( vlc_object_t *p_this, const char *psz_module )
/* Attach interface to its parent object */ /* Attach interface to its parent object */
vlc_object_attach( p_intf, p_this ); vlc_object_attach( p_intf, p_this );
vlc_object_set_destructor( p_intf, intf_Destroy );
#if defined( __APPLE__ ) || defined( WIN32 ) #if defined( __APPLE__ ) || defined( WIN32 )
p_intf->b_should_run_on_first_thread = false; p_intf->b_should_run_on_first_thread = false;
#endif #endif
...@@ -134,8 +119,7 @@ int intf_Create( vlc_object_t *p_this, const char *psz_module ) ...@@ -134,8 +119,7 @@ int intf_Create( vlc_object_t *p_this, const char *psz_module )
if( p_intf->p_module == NULL ) if( p_intf->p_module == NULL )
{ {
msg_Err( p_intf, "no suitable interface module" ); msg_Err( p_intf, "no suitable interface module" );
vlc_object_release( p_intf ); goto error;
return VLC_EGENERIC;
} }
if( p_intf->pf_run == NULL ) if( p_intf->pf_run == NULL )
...@@ -150,19 +134,12 @@ int intf_Create( vlc_object_t *p_this, const char *psz_module ) ...@@ -150,19 +134,12 @@ int intf_Create( vlc_object_t *p_this, const char *psz_module )
VLC_THREAD_PRIORITY_LOW ) ) VLC_THREAD_PRIORITY_LOW ) )
{ {
msg_Err( p_intf, "cannot spawn libvlc death monitoring thread" ); msg_Err( p_intf, "cannot spawn libvlc death monitoring thread" );
vlc_object_release( p_intf ); goto error;
return VLC_ENOMEM;
} }
p_intf->pf_run( p_intf ); p_intf->pf_run( p_intf );
/* Make sure our MonitorLibVLCDeath thread exit */
vlc_object_kill( p_intf );
/* It is monitoring libvlc, not the p_intf */ /* It is monitoring libvlc, not the p_intf */
vlc_object_kill( p_intf->p_libvlc ); vlc_object_kill( p_intf->p_libvlc );
vlc_thread_join( p_intf );
vlc_object_detach( p_intf );
vlc_object_release( p_intf );
} }
else else
#endif #endif
...@@ -171,28 +148,49 @@ int intf_Create( vlc_object_t *p_this, const char *psz_module ) ...@@ -171,28 +148,49 @@ int intf_Create( vlc_object_t *p_this, const char *psz_module )
VLC_THREAD_PRIORITY_LOW ) ) VLC_THREAD_PRIORITY_LOW ) )
{ {
msg_Err( p_intf, "cannot spawn interface thread" ); msg_Err( p_intf, "cannot spawn interface thread" );
vlc_object_release( p_intf ); goto error;
return VLC_EGENERIC;
} }
return VLC_SUCCESS; return VLC_SUCCESS;
error:
if( p_intf->p_module )
module_unneed( p_intf, p_intf->p_module );
config_ChainDestroy( p_intf->p_cfg );
free( p_intf->psz_intf );
vlc_object_release( p_intf );
return VLC_EGENERIC;
} }
/** /**
* Stops the interface thread * Stops and destroys all interfaces
* * @param p_libvlc the LibVLC instance
* This function asks the interface thread to stop
* @param p_intf the interface thread
*/ */
void intf_StopThread( intf_thread_t *p_intf ) void intf_DestroyAll( libvlc_int_t *p_libvlc )
{ {
/* Tell the interface to die */ vlc_list_t *l = vlc_list_find( VLC_OBJECT(p_libvlc), VLC_OBJECT_INTF, FIND_CHILD );
vlc_object_kill( p_intf );
/* Tell the interfaces to die */
for( int i = 0; i < l->i_count; i++ )
vlc_object_kill( l->p_values[i].p_object );
/* Cleanup the interfaces */
for( int i = 0; i < l->i_count; i++ )
{
intf_thread_t *p_intf = (intf_thread_t *)l->p_values[i].p_object;
if( p_intf->pf_run ) if( p_intf->pf_run )
vlc_thread_join( p_intf ); vlc_thread_join( p_intf );
module_unneed( p_intf, p_intf->p_module ); module_unneed( p_intf, p_intf->p_module );
free( p_intf->psz_intf );
config_ChainDestroy( p_intf->p_cfg );
}
/* Destroy objects */
for( int i = 0; i < l->i_count; i++ )
vlc_object_release( l->p_values[i].p_object ); /* for intf_Create() */
vlc_list_release( l );
} }
/* Following functions are local */ /* Following functions are local */
......
...@@ -1032,14 +1032,7 @@ void libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) ...@@ -1032,14 +1032,7 @@ void libvlc_InternalCleanup( libvlc_int_t *p_libvlc )
/* Ask the interfaces to stop and destroy them */ /* Ask the interfaces to stop and destroy them */
msg_Dbg( p_libvlc, "removing all interfaces" ); msg_Dbg( p_libvlc, "removing all interfaces" );
intf_thread_t *p_intf; intf_DestroyAll( p_libvlc );
while( (p_intf = vlc_object_find( p_libvlc, VLC_OBJECT_INTF, FIND_CHILD )) )
{
intf_StopThread( p_intf );
vlc_object_detach( p_intf );
vlc_object_release( p_intf ); /* for intf_Create() */
vlc_object_release( p_intf ); /* for vlc_object_find() */
}
#ifdef ENABLE_VLM #ifdef ENABLE_VLM
/* Destroy VLM if created in libvlc_InternalInit */ /* Destroy VLM if created in libvlc_InternalInit */
......
...@@ -233,6 +233,7 @@ static inline libvlc_priv_t *libvlc_priv (libvlc_int_t *libvlc) ...@@ -233,6 +233,7 @@ static inline libvlc_priv_t *libvlc_priv (libvlc_int_t *libvlc)
} }
void playlist_ServicesDiscoveryKillAll( playlist_t *p_playlist ); void playlist_ServicesDiscoveryKillAll( playlist_t *p_playlist );
void intf_DestroyAll( libvlc_int_t * );
#define libvlc_stats( o ) (libvlc_priv((VLC_OBJECT(o))->p_libvlc)->b_stats) #define libvlc_stats( o ) (libvlc_priv((VLC_OBJECT(o))->p_libvlc)->b_stats)
......
...@@ -205,7 +205,6 @@ input_Stop ...@@ -205,7 +205,6 @@ input_Stop
input_vaControl input_vaControl
intf_Create intf_Create
__intf_Eject __intf_Eject
intf_StopThread
IsUTF8 IsUTF8
libvlc_InternalAddIntf libvlc_InternalAddIntf
libvlc_InternalCleanup libvlc_InternalCleanup
......
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