[vlc-devel] commit: Removed an unused lock. (Laurent Aimar )

git version control git at videolan.org
Mon Jul 28 23:38:44 CEST 2008


vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Mon Jul 28 23:35:02 2008 +0200| [91c1edba6d270fb56e11391e5c680456d8b28834]

Removed an unused lock.
Fixed a playlist race condition on input events.

The playlist was loosing state events from input. And thus it may not
always be able to detect (by itself) the end of a stream (It happens
easily with small playlist files).

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

 include/vlc_playlist.h |    2 --
 src/playlist/engine.c  |   18 +++++++-----------
 src/playlist/thread.c  |    8 ++++----
 3 files changed, 11 insertions(+), 17 deletions(-)

diff --git a/include/vlc_playlist.h b/include/vlc_playlist.h
index f451ada..beebba4 100644
--- a/include/vlc_playlist.h
+++ b/include/vlc_playlist.h
@@ -203,8 +203,6 @@ struct playlist_t
     playlist_preparse_t  *p_preparse; /**< Preparser object */
     playlist_fetcher_t   *p_fetcher;/**< Meta and art fetcher object */
 
-    vlc_mutex_t gc_lock;         /**< Lock to protect the garbage collection */
-
     struct {
         /* Current status. These fields are readonly, only the playlist
          * main loop can touch it*/
diff --git a/src/playlist/engine.c b/src/playlist/engine.c
index 314b27f..f66c44b 100644
--- a/src/playlist/engine.c
+++ b/src/playlist/engine.c
@@ -76,7 +76,6 @@ playlist_t * playlist_Create( vlc_object_t *p_parent )
     VariablesInit( p_playlist );
 
     /* Initialise data structures */
-    vlc_mutex_init( &p_playlist->gc_lock );
     p_playlist->i_last_playlist_id = 0;
     p_playlist->p_input = NULL;
 
@@ -199,9 +198,7 @@ static void ObjectGarbageCollector( playlist_t *p_playlist, bool b_force )
             return;
     }
 
-    vlc_mutex_lock( &p_playlist->gc_lock );
     p_playlist->b_cant_sleep = false;
-    vlc_mutex_unlock( &p_playlist->gc_lock );
 }
 
 /* Input Callback */
@@ -330,7 +327,8 @@ void set_current_status_node( playlist_t * p_playlist,
 /**
  * Main loop
  *
- * Main loop for the playlist
+ * Main loop for the playlist. It should be entered with the
+ * playlist lock (otherwise input event may be lost)
  * \param p_playlist the playlist object
  * \return nothing
  */
@@ -338,7 +336,8 @@ void playlist_MainLoop( playlist_t *p_playlist )
 {
     playlist_item_t *p_item = NULL;
     bool b_playexit = var_GetBool( p_playlist, "play-and-exit" );
-    PL_LOCK;
+
+    PL_ASSERT_LOCKED;
 
     if( p_playlist->b_reset_currently_playing &&
         mdate() - p_playlist->last_rebuild_date > 30000 ) // 30 ms
@@ -406,9 +405,7 @@ check_input:
         }
         else if( p_playlist->p_input->i_state != INIT_S )
         {
-            PL_UNLOCK;
             ObjectGarbageCollector( p_playlist, false );
-            PL_LOCK;
         }
     }
     else
@@ -430,7 +427,6 @@ check_input:
             {
                 msg_Dbg( p_playlist, "nothing to play" );
                 p_playlist->status.i_status = PLAYLIST_STOPPED;
-                PL_UNLOCK;
 
                 if( b_playexit == true )
                 {
@@ -441,6 +437,9 @@ check_input:
                 return;
             }
             playlist_PlayItem( p_playlist, p_item );
+            /* playlist_PlayItem loose input event, we need to recheck */
+            //if( !p_playlist->b_cant_sleep )
+                goto check_input;
         }
         else
         {
@@ -449,12 +448,9 @@ check_input:
             p_playlist->status.i_status = PLAYLIST_STOPPED;
 
             /* Collect garbage */
-            PL_UNLOCK;
             ObjectGarbageCollector( p_playlist, b_gc_forced );
-            PL_LOCK;
         }
     }
-    PL_UNLOCK;
 }
 
 /**
diff --git a/src/playlist/thread.c b/src/playlist/thread.c
index 2e1b70d..33f2861 100644
--- a/src/playlist/thread.c
+++ b/src/playlist/thread.c
@@ -140,9 +140,7 @@ static void RunControlThread ( playlist_t *p_playlist )
     vlc_object_lock( p_playlist );
     while( vlc_object_alive( p_playlist ) )
     {
-        PL_UNLOCK;
         playlist_MainLoop( p_playlist );
-        PL_LOCK;
 
         /* The playlist lock has been unlocked, so we can't tell if
          * someone has killed us in the meantime. Check now. */
@@ -152,9 +150,11 @@ static void RunControlThread ( playlist_t *p_playlist )
         if( p_playlist->b_cant_sleep )
         {
             /* 100 ms is an acceptable delay for playlist operations */
-            PL_UNLOCK;
+            vlc_object_unlock( p_playlist );
+
             msleep( INTF_IDLE_SLEEP*2 );
-            PL_LOCK;
+
+            vlc_object_lock( p_playlist );
         }
         else
         {




More information about the vlc-devel mailing list