- /* Tell the interface to die */
- vlc_object_kill( p_intf );
- if( p_intf->pf_run )
- vlc_thread_join( p_intf );
+ intf_thread_t *p_first;
+
+ assert( !vlc_object_alive( p_libvlc ) );
+
+ vlc_mutex_lock( &lock );
+ p_first = libvlc_priv( p_libvlc )->p_intf;
+#ifndef NDEBUG
+ libvlc_priv( p_libvlc )->p_intf = NULL;
+#endif
+ vlc_mutex_unlock( &lock );
+
+ /* Tell the interfaces to die */
+ for( intf_thread_t *p_intf = p_first; p_intf; p_intf = p_intf->p_next )
+ vlc_object_kill( p_intf );
+
+ /* Cleanup the interfaces */
+ for( intf_thread_t *p_intf = p_first; p_intf != NULL; )
+ {
+ intf_thread_t *p_next = p_intf->p_next;
+
+ 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 );
+ vlc_object_release( p_intf );