static void ListChildren ( vlc_list_t *, vlc_object_t *, int );
static void vlc_object_destroy( vlc_object_t *p_this );
+static void vlc_object_yield_locked( vlc_object_t *p_this );
/*****************************************************************************
* Local structure lock
/* This happens when there are only two remaining objects */
if( pp_objects[i_middle+1]->i_object_id == i_id )
{
+ vlc_object_yield_locked( pp_objects[i_middle+1] );
vlc_mutex_unlock( &structure_lock );
- pp_objects[i_middle+1]->p_internals->i_refcount++;
return pp_objects[i_middle+1];
}
break;
}
else
{
+ vlc_object_yield_locked( pp_objects[i_middle] );
vlc_mutex_unlock( &structure_lock );
- pp_objects[i_middle]->p_internals->i_refcount++;
return pp_objects[i_middle];
}
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 )
{
- p_this->p_internals->i_refcount++;
+ vlc_object_yield_locked( p_this );
vlc_mutex_unlock( &structure_lock );
return p_this;
}
vlc_mutex_lock( &structure_lock );
+ /* Avoid obvious freed object uses */
+ assert( p_this->p_internals->i_refcount > 0 );
+
/* 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 ) )
{
- p_this->p_internals->i_refcount++;
+ vlc_object_yield_locked( p_this );
vlc_mutex_unlock( &structure_lock );
return p_this;
}
****************************************************************************
* increment an object refcount
*****************************************************************************/
+
+/* When the structure_lock is locked */
+static void vlc_object_yield_locked( vlc_object_t *p_this )
+{
+ /* Avoid obvious freed object uses */
+ assert( p_this->p_internals->i_refcount > 0 );
+
+ /* Increment the counter */
+ p_this->p_internals->i_refcount++;
+}
+
+/* Public function */
void __vlc_object_yield( vlc_object_t *p_this )
{
vlc_mutex_lock( &structure_lock );
- p_this->p_internals->i_refcount++;
+ vlc_object_yield_locked( p_this );
vlc_mutex_unlock( &structure_lock );
}
+
/*****************************************************************************
* decrement an object refcount
* And destroy the object if its refcount reach zero.
vlc_mutex_lock( &structure_lock );
+ /* Avoid obvious freed object uses */
+ assert( p_this->p_internals->i_refcount > 0 );
+
/* Attach the parent to its child */
p_this->p_parent = p_parent;
if( !p_this ) return;
vlc_mutex_lock( &structure_lock );
+
+ /* Avoid obvious freed object uses */
+ assert( p_this->p_internals->i_refcount > 0 );
+
if( !p_this->p_parent )
{
msg_Err( p_this, "object is not attached" );
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 )
{
{
if( p_tmp->i_object_type == i_type )
{
- p_tmp->p_internals->i_refcount++;
+ vlc_object_yield_locked( p_tmp );
return p_tmp;
}
else
p_tmp = p_this->pp_children[i];
if( p_tmp->i_object_type == i_type )
{
- p_tmp->p_internals->i_refcount++;
+ vlc_object_yield_locked( p_tmp );
return p_tmp;
}
else if( p_tmp->i_children )
if( p_tmp->psz_object_name
&& !strcmp( p_tmp->psz_object_name, psz_name ) )
{
- p_tmp->p_internals->i_refcount++;
+ vlc_object_yield_locked( p_tmp );
return p_tmp;
}
else
if( p_tmp->psz_object_name
&& !strcmp( p_tmp->psz_object_name, psz_name ) )
{
- p_tmp->p_internals->i_refcount++;
+ vlc_object_yield_locked( p_tmp );
return p_tmp;
}
else if( p_tmp->i_children )
return;
}
- p_object->p_internals->i_refcount++;
+ vlc_object_yield_locked( p_object );
p_list->p_values[i_index].p_object = p_object;
return;
}
- p_object->p_internals->i_refcount++;
+ vlc_object_yield_locked( p_object );
p_list->p_values[p_list->i_count].p_object = p_object;
p_list->i_count++;