Also remove the volatile qualifier.
No, volatile does not magically solve threading bugs, sorry
I too have tried this "easy" path, it does REALLY NOT WORK.
volatile only solves signals concurrency, not threads concurrency.
volatile vlc_bool_t b_error; /**< set by the object */ \
volatile vlc_bool_t b_die; /**< set by the outside */ \
volatile vlc_bool_t b_dead; /**< set by the object */ \
volatile vlc_bool_t b_error; /**< set by the object */ \
volatile vlc_bool_t b_die; /**< set by the outside */ \
volatile vlc_bool_t b_dead; /**< set by the object */ \
- volatile vlc_bool_t b_attached; /**< set by the object */ \
vlc_bool_t b_force; /**< set by the outside (eg. module_Need()) */ \
\
/* Stuff related to the libvlc structure */ \
vlc_bool_t b_force; /**< set by the outside (eg. module_Need()) */ \
\
/* Stuff related to the libvlc structure */ \
vlc_mutex_init( p_libvlc, &p_libvlc->quicktime_lock );
vlc_thread_set_priority( p_libvlc, VLC_THREAD_PRIORITY_LOW );
#endif
vlc_mutex_init( p_libvlc, &p_libvlc->quicktime_lock );
vlc_thread_set_priority( p_libvlc, VLC_THREAD_PRIORITY_LOW );
#endif
- /* Fake attachment */
- p_libvlc->b_attached = VLC_TRUE;
/* Store data for the non-reentrant API */
p_static_vlc = p_libvlc;
/* Store data for the non-reentrant API */
p_static_vlc = p_libvlc;
/* Thread properties, if any */
vlc_thread_t thread_id;
vlc_bool_t b_thread;
/* Thread properties, if any */
vlc_thread_t thread_id;
vlc_bool_t b_thread;
+
+ /* Objects management */
+ vlc_bool_t b_attached;
p_new->b_die = VLC_FALSE;
p_new->b_error = VLC_FALSE;
p_new->b_dead = VLC_FALSE;
p_new->b_die = VLC_FALSE;
p_new->b_error = VLC_FALSE;
p_new->b_dead = VLC_FALSE;
- p_new->b_attached = VLC_FALSE;
+ p_priv->b_attached = VLC_FALSE;
p_new->b_force = VLC_FALSE;
p_new->psz_header = NULL;
p_new->b_force = VLC_FALSE;
p_new->psz_header = NULL;
p_libvlc_global->i_objects = 1;
p_libvlc_global->pp_objects = malloc( sizeof(vlc_object_t *) );
p_libvlc_global->pp_objects[0] = p_new;
p_libvlc_global->i_objects = 1;
p_libvlc_global->pp_objects = malloc( sizeof(vlc_object_t *) );
p_libvlc_global->pp_objects[0] = p_new;
- p_new->b_attached = VLC_TRUE;
+ p_priv->b_attached = VLC_TRUE;
}
else
{
libvlc_global_data_t *p_libvlc_global = vlc_global();
}
else
{
libvlc_global_data_t *p_libvlc_global = vlc_global();
- p_new->p_libvlc = ( i_type == VLC_OBJECT_LIBVLC ) ? (libvlc_int_t*)p_new
- : p_this->p_libvlc;
+ if( i_type == VLC_OBJECT_LIBVLC )
+ {
+ p_new->p_libvlc = (libvlc_int_t*)p_new;
+ p_priv->b_attached = VLC_TRUE;
+ }
+ else
+ {
+ p_new->p_libvlc = p_this->p_libvlc;
+ }
vlc_mutex_lock( &structure_lock );
vlc_mutex_lock( &structure_lock );
p_parent->i_children, p_this );
/* Climb up the tree to see whether we are connected with the root */
p_parent->i_children, p_this );
/* Climb up the tree to see whether we are connected with the root */
- if( p_parent->b_attached )
+ if( p_parent->p_internals->b_attached )
{
SetAttachment( p_this, VLC_TRUE );
}
{
SetAttachment( p_this, VLC_TRUE );
}
}
/* Climb up the tree to see whether we are connected with the root */
}
/* Climb up the tree to see whether we are connected with the root */
- if( p_this->p_parent->b_attached )
+ if( p_this->p_parent->p_internals->b_attached )
{
SetAttachment( p_this, VLC_FALSE );
}
{
SetAttachment( p_this, VLC_FALSE );
}
for( ; pp_current < pp_end ; pp_current++ )
{
for( ; pp_current < pp_end ; pp_current++ )
{
- if( (*pp_current)->b_attached
+ if( (*pp_current)->p_internals->b_attached
&& (*pp_current)->i_object_type == i_type )
{
i_count++;
&& (*pp_current)->i_object_type == i_type )
{
i_count++;
for( ; pp_current < pp_end ; pp_current++ )
{
for( ; pp_current < pp_end ; pp_current++ )
{
- if( (*pp_current)->b_attached
+ if( (*pp_current)->p_internals->b_attached
&& (*pp_current)->i_object_type == i_type )
{
ListReplace( p_list, *pp_current, i_index );
&& (*pp_current)->i_object_type == i_type )
{
ListReplace( p_list, *pp_current, i_index );
for( ; pp_current < pp_end ; pp_current++ )
{
for( ; pp_current < pp_end ; pp_current++ )
{
- if( (*pp_current)->b_attached )
+ if( (*pp_current)->p_internals->b_attached )
{
PrintObject( *pp_current, "" );
}
{
PrintObject( *pp_current, "" );
}
SetAttachment( p_this->pp_children[i_index], b_attached );
}
SetAttachment( p_this->pp_children[i_index], b_attached );
}
- p_this->b_attached = b_attached;
+ p_this->p_internals->b_attached = b_attached;
}
static void PrintObject( vlc_object_t *p_this, const char *psz_prefix )
}
static void PrintObject( vlc_object_t *p_this, const char *psz_prefix )