[vlc-devel] commit: Replace intf_StopThread() with intf_DestroyAll() ( Rémi Denis-Courmont )
git version control
git at videolan.org
Sat May 23 20:18:17 CEST 2009
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat May 23 20:45:24 2009 +0300| [f645d20b9fe57805ec3d217a2aeaaee9dfbb9b1f] | committer: Rémi Denis-Courmont
Replace intf_StopThread() with intf_DestroyAll()
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f645d20b9fe57805ec3d217a2aeaaee9dfbb9b1f
---
include/vlc_interface.h | 1 -
src/interface/interface.c | 72 ++++++++++++++++++++++-----------------------
src/libvlc.c | 9 +-----
src/libvlc.h | 1 +
src/libvlccore.sym | 1 -
5 files changed, 37 insertions(+), 47 deletions(-)
diff --git a/include/vlc_interface.h b/include/vlc_interface.h
index e368d0b..62def64 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 d2fb154..b492efb 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 e9e0b04..3d54372 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 6d9ead2..f6d4402 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 0174274..0b0f405 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
More information about the vlc-devel
mailing list