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

intf_Destroy(): use vlc_object_release() and a destructor instead

While reading this, you will find a bunch of:
  while (find (VLC_OBJECT_INTERFACE))
     release; release;

These are of course plain BUGS (which are neither introduced nor fixed
by this commit). Imagine, for instance, what happens if two threads run
the code above at the same time... they end up releasing the interface
once too many.
parent 2e7d3d7d
......@@ -120,7 +120,6 @@ struct intf_dialog_args_t
VLC_EXPORT( intf_thread_t *, __intf_Create, ( vlc_object_t *, const char *, int, const char *const * ) );
VLC_EXPORT( int, intf_RunThread, ( intf_thread_t * ) );
VLC_EXPORT( void, intf_StopThread, ( intf_thread_t * ) );
VLC_EXPORT( void, intf_Destroy, ( intf_thread_t * ) );
/* If the interface is in the main thread, it should listen both to
* p_intf->b_die and p_libvlc->b_die */
......
......@@ -129,7 +129,7 @@ void VCDEnd ( vlc_object_t *p_this )
intf_StopThread( p_intf );
vlc_object_detach( p_intf );
vlc_object_release( p_intf );
intf_Destroy( p_intf );
vlc_object_release( p_intf );
}
p_vcd->p_intf = NULL;
......
......@@ -189,7 +189,7 @@ static void CloseDecoder( vlc_object_t *p_this )
intf_StopThread( p_intf );
vlc_object_detach( p_intf );
vlc_object_release( p_intf );
intf_Destroy( p_intf );
vlc_object_release( p_intf );
}
p_sys->p_intf = NULL;
......
......@@ -164,7 +164,7 @@ static void Run( intf_thread_t *p_intf )
intf_StopThread( p_extraintf );
vlc_object_detach( p_extraintf );
vlc_object_release( p_extraintf );
intf_Destroy( p_extraintf );
vlc_object_release( p_extraintf );
}
/* Make sure we exit (In case other interfaces have been spawned) */
......@@ -332,7 +332,7 @@ static void WINAPI ServiceDispatch( DWORD numArgs, char **args )
if( intf_RunThread( p_new_intf ) )
{
vlc_object_detach( p_new_intf );
intf_Destroy( p_new_intf );
vlc_object_release( p_new_intf );
msg_Err( p_intf, "interface \"%s\" cannot run", psz_temp );
}
......
......@@ -1543,7 +1543,7 @@ static int Intf( vlc_object_t *p_this, char const *psz_cmd,
if( intf_RunThread( p_newintf ) )
{
vlc_object_detach( p_newintf );
intf_Destroy( p_newintf );
vlc_object_release( p_newintf );
}
}
......
......@@ -54,6 +54,24 @@ static void RunInterface( intf_thread_t *p_intf );
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
*****************************************************************************
......@@ -114,6 +132,7 @@ intf_thread_t* __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 );
return p_intf;
}
......@@ -140,6 +159,8 @@ int intf_RunThread( intf_thread_t *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;
}
......@@ -172,29 +193,6 @@ void intf_StopThread( intf_thread_t *p_intf )
}
}
/**
* \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 */
/*****************************************************************************
......@@ -283,7 +281,7 @@ static int AddIntfCallback( vlc_object_t *p_this, char const *psz_cmd,
if( intf_RunThread( p_intf ) != VLC_SUCCESS )
{
vlc_object_detach( p_intf );
intf_Destroy( p_intf );
vlc_object_release( p_intf );
return VLC_EGENERIC;
}
......
......@@ -936,9 +936,8 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc )
{
intf_StopThread( p_intf );
vlc_object_detach( p_intf );
vlc_object_release( p_intf );
intf_Destroy( p_intf );
p_intf = NULL;
vlc_object_release( p_intf ); /* for intf_Create() */
vlc_object_release( p_intf ); /* for vlc_object_find() */
}
/* Free video outputs */
......@@ -1144,11 +1143,10 @@ int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc,
/* Try to run the interface */
p_intf->b_play = b_play;
i_err = intf_RunThread( p_intf );
if( i_err || p_intf->b_should_run_on_first_thread )
if( i_err )
{
vlc_object_detach( p_intf );
intf_Destroy( p_intf );
p_intf = NULL;
vlc_object_release( p_intf );
return i_err;
}
......@@ -1161,7 +1159,7 @@ int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc,
while( vlc_object_lock_and_wait( p_intf ) == 0 );
vlc_object_detach( p_intf );
intf_Destroy( p_intf );
vlc_object_release( p_intf );
}
return VLC_SUCCESS;
......
......@@ -147,7 +147,6 @@ __input_Read
input_StopThread
input_vaControl
__intf_Create
intf_Destroy
__intf_Eject
__intf_Progress
__intf_ProgressUpdate
......
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