#include "vlc_httpd.h"
#include "vlc_vlm.h"
#include "input/vlm_internal.h"
-#include "vlc_vod.h"
#include "vlc_tls.h"
#include "vlc_xml.h"
#include "vlc_osd.h"
p_priv->i_refcount = 1;
p_priv->pf_destructor = kVLCDestructor;
+ p_priv->b_thread = VLC_FALSE;
p_new->p_parent = NULL;
p_new->pp_children = NULL;
p_new->i_children = 0;
i_size = sizeof( vlm_t );
psz_type = "vlm dameon";
break;
- case VLC_OBJECT_VOD:
- i_size = sizeof( vod_t );
- psz_type = "vod server";
- break;
case VLC_OBJECT_XML:
i_size = sizeof( xml_t );
psz_type = "xml";
/* Automatically detach the object from its parents */
if( p_this->p_parent ) vlc_object_detach( p_this );
+
+ /* Send a kill to the object's thread if applicable */
+ vlc_object_kill( p_this );
+
+ /* If we are running on a thread, wait until it ends */
+ if( p_priv->b_thread )
+ vlc_thread_join( p_this );
+
+ /* Call the custom "subclass" destructor */
+ if( p_priv->pf_destructor )
+ p_priv->pf_destructor( p_this );
+
/* Sanity checks */
if( p_this->i_children )
{
abort();
}
-
- /* Send a kill to the object's thread if applicable */
- vlc_object_kill( p_this );
-
- /* Call the custom "subclass" destructor */
- if( p_priv->pf_destructor )
- p_priv->pf_destructor( p_this );
-
-
/* Destroy the associated variables, starting from the end so that
* no memmove calls have to be done. */
while( p_priv->i_vars )
else
{
/* This happens when there are only two remaining objects */
- if( pp_objects[i_middle+1]->i_object_id == i_id )
+ if( pp_objects[i_middle+1]->i_object_id == i_id
+ && pp_objects[i_middle+1]->p_internals->i_refcount > 0 )
{
vlc_object_yield_locked( pp_objects[i_middle+1] );
vlc_mutex_unlock( &structure_lock );
break;
}
}
- else
+ else if( pp_objects[i_middle]->p_internals->i_refcount > 0 )
{
vlc_object_yield_locked( pp_objects[i_middle] );
vlc_mutex_unlock( &structure_lock );
vlc_mutex_lock( &structure_lock );
- /* Avoid obvious freed object uses */
- assert( p_this->p_internals->i_refcount > 0 );
-
/* If we are of the requested type ourselves, don't look further */
- if( !(i_mode & FIND_STRICT) && p_this->i_object_type == i_type )
+ if( !(i_mode & FIND_STRICT) && p_this->i_object_type == i_type
+ && p_this->p_internals->i_refcount > 0 )
{
vlc_object_yield_locked( p_this );
vlc_mutex_unlock( &structure_lock );
/* If have the requested name ourselves, don't look further */
if( !(i_mode & FIND_STRICT)
&& p_this->psz_object_name
- && !strcmp( p_this->psz_object_name, psz_name ) )
+ && !strcmp( p_this->psz_object_name, psz_name )
+ && p_this->p_internals->i_refcount > 0 )
{
vlc_object_yield_locked( p_this );
vlc_mutex_unlock( &structure_lock );
vlc_mutex_lock( &structure_lock );
- /* Avoid obvious freed object uses */
- assert( p_this->p_internals->i_refcount > 0 );
-
/* Look for the objects */
switch( i_mode & 0x000f )
{
p_tmp = p_this->p_parent;
if( p_tmp )
{
- if( p_tmp->i_object_type == i_type )
+ if( p_tmp->i_object_type == i_type
+ && p_tmp->p_internals->i_refcount > 0 )
{
vlc_object_yield_locked( p_tmp );
return p_tmp;
for( i = p_this->i_children; i--; )
{
p_tmp = p_this->pp_children[i];
- if( p_tmp->i_object_type == i_type )
+ if( p_tmp->i_object_type == i_type
+ && p_tmp->p_internals->i_refcount > 0 )
{
vlc_object_yield_locked( p_tmp );
return p_tmp;
if( p_tmp )
{
if( p_tmp->psz_object_name
- && !strcmp( p_tmp->psz_object_name, psz_name ) )
+ && !strcmp( p_tmp->psz_object_name, psz_name )
+ && p_tmp->p_internals->i_refcount > 0 )
{
vlc_object_yield_locked( p_tmp );
return p_tmp;
{
p_tmp = p_this->pp_children[i];
if( p_tmp->psz_object_name
- && !strcmp( p_tmp->psz_object_name, psz_name ) )
+ && !strcmp( p_tmp->psz_object_name, psz_name )
+ && p_tmp->p_internals->i_refcount > 0 )
{
vlc_object_yield_locked( p_tmp );
return p_tmp;