[vlc-devel] commit: Fix deadlock in vlc_object_kill (should fix #1543) ( Rémi Denis-Courmont )

git version control git at videolan.org
Sun Jun 22 15:37:25 CEST 2008


vlc | branch: master | Rémi Denis-Courmont <rdenis at simphalempin.com> | Sun Jun 22 16:39:25 2008 +0300| [cc2f0cb637a9e56fec65241fdcd27fd40ac3d6bc]

Fix deadlock in vlc_object_kill (should fix #1543)

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=cc2f0cb637a9e56fec65241fdcd27fd40ac3d6bc
---

 src/misc/objects.c |   22 +++++++++++++---------
 1 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/src/misc/objects.c b/src/misc/objects.c
index 85aef36..325c557 100644
--- a/src/misc/objects.c
+++ b/src/misc/objects.c
@@ -606,16 +606,16 @@ void __vlc_object_signal_unlocked( vlc_object_t *obj )
  */
 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;
 
     vlc_object_lock( p_this );
     p_this->b_die = true;
 
-    vlc_spin_lock (&internals->spin);
-    fd = internals->pipes[1];
-    internals->pipes[1] = -1;
-    vlc_spin_unlock (&internals->spin);
+    vlc_spin_lock (&priv->spin);
+    fd = priv->pipes[1];
+    priv->pipes[1] = -1;
+    vlc_spin_unlock (&priv->spin);
 
     if( fd != -1 )
     {
@@ -628,10 +628,14 @@ void __vlc_object_kill( vlc_object_t *p_this )
 
     if (p_this->i_object_type == VLC_OBJECT_LIBVLC)
     {
-        vlc_list_t *children = vlc_list_children (p_this);
-        for (int i = 0; i < children->i_count; i++)
-            vlc_object_kill (children->p_values[i].p_object);
-        vlc_list_release (children);
+        /* Do not use vlc_list_children() here! We don't want to yield/release
+         * all the children of LibVLC (-> dead lock). This is a hack anyway:
+         * LibVLC should kill its children by itself as it sees fit, as any
+         * 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);
     }
 }
 




More information about the vlc-devel mailing list