]> git.sesse.net Git - vlc/commitdiff
playlist: release video outputs *once* - fixes #1593
authorRémi Denis-Courmont <rdenis@simphalempin.com>
Sat, 28 Jun 2008 19:22:00 +0000 (22:22 +0300)
committerRémi Denis-Courmont <rdenis@simphalempin.com>
Sat, 28 Jun 2008 19:22:00 +0000 (22:22 +0300)
Releasing other thread's references is not a very good idea...

src/playlist/engine.c

index 4cad1f8ebfa6ac44d80e661ae3722120b8134976..622f29eb7ea0e43a008927e2b89abad12a5d2591 100644 (file)
@@ -181,8 +181,6 @@ static void playlist_Destructor( vlc_object_t * p_this )
 /* Destroy remaining objects */
 static void ObjectGarbageCollector( playlist_t *p_playlist, bool b_force )
 {
-    vlc_object_t *p_obj;
-
     if( !b_force )
     {
         if( mdate() - p_playlist->gc_date < 1000000 )
@@ -195,15 +193,15 @@ static void ObjectGarbageCollector( playlist_t *p_playlist, bool b_force )
     }
 
     vlc_mutex_lock( &p_playlist->gc_lock );
-    while( ( p_obj = vlc_object_find( p_playlist->p_libvlc, VLC_OBJECT_VOUT,
-                                                  FIND_CHILD ) ) )
+    /* Remove video outputs when user presses stop: */
+    vlc_list_t *list = vlc_list_find( p_playlist->p_libvlc, VLC_OBJECT_VOUT,
+                                      FIND_CHILD );
+    if( list != NULL )
     {
-        vlc_object_release( p_obj );
-        if( p_obj->p_parent == VLC_OBJECT(p_playlist->p_libvlc) )
-        {
-            msg_Dbg( p_playlist, "garbage collector destroying 1 vout" );
-            vlc_object_release( p_obj ); /* Hmm, is this (thread-)safe?? */
-        }
+        msg_Dbg( p_playlist, "removing %u vout(s)", list->i_count );
+        for( int i = 0; i < list->i_count; i++)
+            vlc_object_release( list->p_values[i].p_object );
+        vlc_list_release( list );
     }
     p_playlist->b_cant_sleep = false;
     vlc_mutex_unlock( &p_playlist->gc_lock );