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

Fix deadlock in vlc_object_kill (should fix #1543)

parent 6059d32e
...@@ -606,16 +606,16 @@ void __vlc_object_signal_unlocked( vlc_object_t *obj ) ...@@ -606,16 +606,16 @@ void __vlc_object_signal_unlocked( vlc_object_t *obj )
*/ */
void __vlc_object_kill( vlc_object_t *p_this ) void __vlc_object_kill( vlc_object_t *p_this )
{ {
vlc_object_internals_t *internals = vlc_internals( p_this ); vlc_object_internals_t *priv = vlc_internals( p_this );
int fd; int fd;
vlc_object_lock( p_this ); vlc_object_lock( p_this );
p_this->b_die = true; p_this->b_die = true;
vlc_spin_lock (&internals->spin); vlc_spin_lock (&priv->spin);
fd = internals->pipes[1]; fd = priv->pipes[1];
internals->pipes[1] = -1; priv->pipes[1] = -1;
vlc_spin_unlock (&internals->spin); vlc_spin_unlock (&priv->spin);
if( fd != -1 ) if( fd != -1 )
{ {
...@@ -628,10 +628,14 @@ void __vlc_object_kill( vlc_object_t *p_this ) ...@@ -628,10 +628,14 @@ void __vlc_object_kill( vlc_object_t *p_this )
if (p_this->i_object_type == VLC_OBJECT_LIBVLC) if (p_this->i_object_type == VLC_OBJECT_LIBVLC)
{ {
vlc_list_t *children = vlc_list_children (p_this); /* Do not use vlc_list_children() here! We don't want to yield/release
for (int i = 0; i < children->i_count; i++) * all the children of LibVLC (-> dead lock). This is a hack anyway:
vlc_object_kill (children->p_values[i].p_object); * LibVLC should kill its children by itself as it sees fit, as any
vlc_list_release (children); * other object. */
vlc_mutex_lock (&structure_lock);
for (int i = 0; i < priv->i_children; i++)
vlc_object_kill (priv->pp_children[i]);
vlc_mutex_unlock (&structure_lock);
} }
} }
......
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