From: RĂ©mi Denis-Courmont Date: Sat, 23 May 2009 17:45:24 +0000 (+0300) Subject: Replace intf_StopThread() with intf_DestroyAll() X-Git-Tag: 1.1.0-ff~5800 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=f645d20b9fe57805ec3d217a2aeaaee9dfbb9b1f;p=vlc Replace intf_StopThread() with intf_DestroyAll() --- diff --git a/include/vlc_interface.h b/include/vlc_interface.h index e368d0bad9..62def64254 100644 --- a/include/vlc_interface.h +++ b/include/vlc_interface.h @@ -100,7 +100,6 @@ struct intf_dialog_args_t *****************************************************************************/ VLC_EXPORT( int, intf_Create, ( vlc_object_t *, const char * ) ); #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) VLC_EXPORT( int, __intf_Eject, ( vlc_object_t *, const char * ) ); diff --git a/src/interface/interface.c b/src/interface/interface.c index d2fb15426e..b492efb611 100644 --- a/src/interface/interface.c +++ b/src/interface/interface.c @@ -58,20 +58,6 @@ static void * MonitorLibVLCDeath( vlc_object_t *p_this ); static int AddIntfCallback( vlc_object_t *, char const *, 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 /** * Create and start an interface. @@ -116,7 +102,6 @@ int intf_Create( vlc_object_t *p_this, const char *psz_module ) /* Attach interface to its parent object */ vlc_object_attach( p_intf, p_this ); - vlc_object_set_destructor( p_intf, intf_Destroy ); #if defined( __APPLE__ ) || defined( WIN32 ) p_intf->b_should_run_on_first_thread = false; #endif @@ -134,8 +119,7 @@ int intf_Create( vlc_object_t *p_this, const char *psz_module ) if( p_intf->p_module == NULL ) { msg_Err( p_intf, "no suitable interface module" ); - vlc_object_release( p_intf ); - return VLC_EGENERIC; + goto error; } if( p_intf->pf_run == NULL ) @@ -150,19 +134,12 @@ int intf_Create( vlc_object_t *p_this, const char *psz_module ) VLC_THREAD_PRIORITY_LOW ) ) { msg_Err( p_intf, "cannot spawn libvlc death monitoring thread" ); - vlc_object_release( p_intf ); - return VLC_ENOMEM; + goto error; } 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 */ vlc_object_kill( p_intf->p_libvlc ); - vlc_thread_join( p_intf ); - - vlc_object_detach( p_intf ); - vlc_object_release( p_intf ); } else #endif @@ -171,28 +148,49 @@ int intf_Create( vlc_object_t *p_this, const char *psz_module ) VLC_THREAD_PRIORITY_LOW ) ) { msg_Err( p_intf, "cannot spawn interface thread" ); - vlc_object_release( p_intf ); - return VLC_EGENERIC; + goto error; } 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 - * - * This function asks the interface thread to stop - * @param p_intf the interface thread + * Stops and destroys all interfaces + * @param p_libvlc the LibVLC instance */ -void intf_StopThread( intf_thread_t *p_intf ) +void intf_DestroyAll( libvlc_int_t *p_libvlc ) { - /* Tell the interface to die */ - vlc_object_kill( p_intf ); - if( p_intf->pf_run ) - vlc_thread_join( p_intf ); + vlc_list_t *l = vlc_list_find( VLC_OBJECT(p_libvlc), VLC_OBJECT_INTF, FIND_CHILD ); + + /* 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 ) + vlc_thread_join( p_intf ); + module_unneed( p_intf, p_intf->p_module ); + free( p_intf->psz_intf ); + config_ChainDestroy( p_intf->p_cfg ); + } - module_unneed( p_intf, p_intf->p_module ); + /* 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 */ diff --git a/src/libvlc.c b/src/libvlc.c index e9e0b0435e..3d54372924 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -1032,14 +1032,7 @@ void libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) /* Ask the interfaces to stop and destroy them */ msg_Dbg( p_libvlc, "removing all interfaces" ); - intf_thread_t *p_intf; - 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() */ - } + intf_DestroyAll( p_libvlc ); #ifdef ENABLE_VLM /* Destroy VLM if created in libvlc_InternalInit */ diff --git a/src/libvlc.h b/src/libvlc.h index 6d9ead252d..f6d44026f3 100644 --- a/src/libvlc.h +++ b/src/libvlc.h @@ -233,6 +233,7 @@ static inline libvlc_priv_t *libvlc_priv (libvlc_int_t *libvlc) } 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) diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 0174274404..0b0f405ea3 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -205,7 +205,6 @@ input_Stop input_vaControl intf_Create __intf_Eject -intf_StopThread IsUTF8 libvlc_InternalAddIntf libvlc_InternalCleanup