[vlc-commits] playlist: fix callback leak

Rémi Denis-Courmont git at videolan.org
Sat Aug 16 12:48:27 CEST 2014


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Aug 16 12:51:41 2014 +0300| [9501e5253932c9a7f40d31c0f4fea2c6d26cfdd2] | committer: Rémi Denis-Courmont

playlist: fix callback leak

Note that we cannot hold the playlist lock while removing the callback,
since the callback function takes the playlist lock.

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

 src/playlist/thread.c |   23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/src/playlist/thread.c b/src/playlist/thread.c
index 0e51f60..ea96549 100644
--- a/src/playlist/thread.c
+++ b/src/playlist/thread.c
@@ -207,20 +207,24 @@ static void PlayItem( playlist_t *p_playlist, playlist_item_t *p_item )
     p_sys->status.i_status = PLAYLIST_RUNNING;
 
     assert( p_sys->p_input == NULL );
+    PL_UNLOCK;
 
-    input_thread_t *p_input_thread = input_Create( p_playlist, p_input, NULL, p_sys->p_input_resource );
-    if( p_input_thread )
+    input_thread_t *p_input_thread = input_Create( p_playlist, p_input, NULL,
+                                                   p_sys->p_input_resource );
+    if( likely(p_input_thread != NULL) )
     {
-        p_sys->p_input = p_input_thread;
-        var_AddCallback( p_input_thread, "intf-event", InputEvent, p_playlist );
-
-        var_SetAddress( p_playlist, "input-current", p_input_thread );
+        var_AddCallback( p_input_thread, "intf-event",
+                         InputEvent, p_playlist );
 
-        if( input_Start( p_sys->p_input ) )
+        if( input_Start( p_input_thread ) )
         {
+            var_DelCallback( p_input_thread, "intf-event",
+                             InputEvent, p_playlist );
             vlc_object_release( p_input_thread );
-            p_sys->p_input = p_input_thread = NULL;
+            p_input_thread = NULL;
         }
+        else
+            var_SetAddress( p_playlist, "input-current", p_input_thread );
     }
 
     /* TODO store art policy in playlist private data */
@@ -235,9 +239,10 @@ static void PlayItem( playlist_t *p_playlist, playlist_item_t *p_item )
     }
     free( psz_arturl );
 
-    PL_UNLOCK;
     var_TriggerCallback( p_playlist, "activity" );
+
     PL_LOCK;
+    p_sys->p_input = p_input_thread;
 }
 
 /**



More information about the vlc-commits mailing list