From 91c1edba6d270fb56e11391e5c680456d8b28834 Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Mon, 28 Jul 2008 23:35:02 +0200 Subject: [PATCH] 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). --- 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 f451adaaa2..beebba4f8a 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 314b27fbee..f66c44bb36 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 2e1b70d3bd..33f2861ec6 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 { -- 2.39.2