X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fplaylist%2Fthread.c;h=33f2861ec6eeb9cb2276f1a62023271e628ca15c;hb=07be8bb586c268720eb4deec0509f473a4d64b51;hp=69f62a3df22a0f3961bf1ca51929ae2efdfacf1a;hpb=624a1e2a3bbd0213583f003dab15e69354520212;p=vlc diff --git a/src/playlist/thread.c b/src/playlist/thread.c index 69f62a3df2..33f2861ec6 100644 --- a/src/playlist/thread.c +++ b/src/playlist/thread.c @@ -25,7 +25,7 @@ # include "config.h" #endif -#include +#include #include #include #include @@ -58,26 +58,18 @@ void __playlist_ThreadCreate( vlc_object_t *p_parent ) playlist_t *p_playlist = playlist_Create( p_parent ); if( !p_playlist ) return; - // Stats - p_playlist->p_stats = (global_stats_t *)malloc( sizeof( global_stats_t ) ); - if( !p_playlist->p_stats ) - { - vlc_object_release( p_playlist ); - return; - } - vlc_mutex_init( p_playlist, &p_playlist->p_stats->lock ); - p_playlist->p_stats_computer = NULL; - // Preparse - p_playlist->p_preparse = vlc_object_create( p_playlist, - sizeof( playlist_preparse_t ) ); - p_playlist->p_preparse->psz_object_name = "preparser"; + static const char ppname[] = "preparser"; + p_playlist->p_preparse = + vlc_custom_create( p_playlist, sizeof( playlist_preparse_t ), + VLC_OBJECT_GENERIC, ppname ); if( !p_playlist->p_preparse ) { msg_Err( p_playlist, "unable to create preparser" ); vlc_object_release( p_playlist ); return; } + p_playlist->p_preparse->psz_object_name = strdup( "preparser" ); p_playlist->p_preparse->i_waiting = 0; p_playlist->p_preparse->pp_waiting = NULL; @@ -85,7 +77,7 @@ void __playlist_ThreadCreate( vlc_object_t *p_parent ) vlc_object_attach( p_playlist->p_preparse, p_playlist ); if( vlc_thread_create( p_playlist->p_preparse, "preparser", - RunPreparse, VLC_THREAD_PRIORITY_LOW, VLC_TRUE ) ) + RunPreparse, VLC_THREAD_PRIORITY_LOW, true ) ) { msg_Err( p_playlist, "cannot spawn preparse thread" ); vlc_object_release( p_playlist->p_preparse ); @@ -93,19 +85,19 @@ void __playlist_ThreadCreate( vlc_object_t *p_parent ) } // Secondary Preparse - p_playlist->p_fetcher = vlc_object_create( p_playlist, - sizeof( playlist_fetcher_t ) ); - p_playlist->p_fetcher->psz_object_name = "fetcher"; + static const char fname[] = "fetcher"; + p_playlist->p_fetcher = + vlc_custom_create( p_playlist, sizeof( playlist_fetcher_t ), + VLC_OBJECT_GENERIC, fname ); if( !p_playlist->p_fetcher ) { msg_Err( p_playlist, "unable to create secondary preparser" ); vlc_object_release( p_playlist ); return; } + p_playlist->p_fetcher->psz_object_name = strdup( "fetcher" ); p_playlist->p_fetcher->i_waiting = 0; - p_playlist->p_fetcher->p_waiting = NULL; - p_playlist->p_fetcher->b_fetch_meta = var_CreateGetInteger( p_playlist, - "fetch-meta" ); + p_playlist->p_fetcher->pp_waiting = NULL; p_playlist->p_fetcher->i_art_policy = var_CreateGetInteger( p_playlist, "album-art" ); @@ -115,7 +107,7 @@ void __playlist_ThreadCreate( vlc_object_t *p_parent ) if( vlc_thread_create( p_playlist->p_fetcher, "fetcher", RunFetcher, - VLC_THREAD_PRIORITY_LOW, VLC_TRUE ) ) + VLC_THREAD_PRIORITY_LOW, true ) ) { msg_Err( p_playlist, "cannot spawn secondary preparse thread" ); vlc_object_release( p_playlist->p_fetcher ); @@ -124,7 +116,7 @@ void __playlist_ThreadCreate( vlc_object_t *p_parent ) // Start the thread if( vlc_thread_create( p_playlist, "playlist", RunControlThread, - VLC_THREAD_PRIORITY_LOW, VLC_TRUE ) ) + VLC_THREAD_PRIORITY_LOW, true ) ) { msg_Err( p_playlist, "cannot spawn playlist thread" ); vlc_object_release( p_playlist ); @@ -137,45 +129,40 @@ void __playlist_ThreadCreate( vlc_object_t *p_parent ) return; } -/** - * Destroy the playlist global thread. - * - * Deinits all things controlled by the playlist global thread - * \param p_playlist the playlist thread to destroy - * \return VLC_SUCCESS or an error - */ -int playlist_ThreadDestroy( playlist_t * p_playlist ) -{ - playlist_Destroy( p_playlist ); - return VLC_SUCCESS; -} - /** * Run the main control thread itself */ static void RunControlThread ( playlist_t *p_playlist ) { - int i_loops = 0; - /* Tell above that we're ready */ vlc_thread_ready( p_playlist ); - while( !p_playlist->b_die ) - { - i_loops++; + vlc_object_lock( p_playlist ); + while( vlc_object_alive( p_playlist ) ) + { playlist_MainLoop( p_playlist ); + + /* The playlist lock has been unlocked, so we can't tell if + * someone has killed us in the meantime. Check now. */ + if( !vlc_object_alive( p_playlist ) ) + break; + if( p_playlist->b_cant_sleep ) { /* 100 ms is an acceptable delay for playlist operations */ + vlc_object_unlock( p_playlist ); + msleep( INTF_IDLE_SLEEP*2 ); + + vlc_object_lock( p_playlist ); } else { - PL_LOCK; - vlc_cond_wait( &p_playlist->object_wait, &p_playlist->object_lock ); - PL_UNLOCK; + vlc_object_wait( p_playlist ); } } + vlc_object_unlock( p_playlist ); + playlist_LastLoop( p_playlist ); } @@ -200,10 +187,12 @@ static void PreparseDestructor( vlc_object_t * p_this ) { playlist_preparse_t * p_preparse = (playlist_preparse_t *)p_this; free( p_preparse->pp_waiting ); + msg_Dbg( p_this, "Destroyed" ); } static void FetcherDestructor( vlc_object_t * p_this ) { playlist_fetcher_t * p_fetcher = (playlist_fetcher_t *)p_this; - free( p_fetcher->p_waiting ); + free( p_fetcher->pp_waiting ); + msg_Dbg( p_this, "Destroyed" ); }