static int AddIntfCallback( vlc_object_t *, char const *,
vlc_value_t , vlc_value_t , void * );
+/**
+ * \brief Destroy the interface after the main loop endeed.
+ *
+ * \param p_intf the interface thread
+ * \return nothing
+ */
+static void intf_Destroy( vlc_object_t *obj )
+{
+ intf_thread_t *p_intf = (intf_thread_t *)obj;
+
+ /* Unlock module if present (a switch may have failed) */
+ if( p_intf->p_module )
+ module_Unneed( p_intf, p_intf->p_module );
+
+ free( p_intf->psz_intf );
+ vlc_mutex_destroy( &p_intf->change_lock );
+}
+
/*****************************************************************************
* intf_Create: prepare interface before main loop
*****************************************************************************
/* Attach interface to its parent object */
vlc_object_attach( p_intf, p_this );
+ vlc_object_set_destructor( p_intf, intf_Destroy );
return p_intf;
}
if( p_intf->b_should_run_on_first_thread )
{
RunInterface( p_intf );
+ vlc_object_detach( p_intf );
+ vlc_object_release( p_intf );
return VLC_SUCCESS;
}
}
}
-/**
- * \brief Destroy the interface after the main loop endeed.
- *
- * Destroys interfaces and closes output devices
- * \param p_intf the interface thread
- * \return nothing
- */
-void intf_Destroy( intf_thread_t *p_intf )
-{
- /* Unlock module if present (a switch may have failed) */
- if( p_intf->p_module )
- {
- module_Unneed( p_intf, p_intf->p_module );
- }
- free( p_intf->psz_intf );
-
- vlc_mutex_destroy( &p_intf->change_lock );
-
- /* Free structure */
- vlc_object_release( p_intf );
-}
-
-
/* Following functions are local */
/*****************************************************************************
if( intf_RunThread( p_intf ) != VLC_SUCCESS )
{
vlc_object_detach( p_intf );
- intf_Destroy( p_intf );
+ vlc_object_release( p_intf );
return VLC_EGENERIC;
}