X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fplaylist%2Fthread.c;h=50d19bcb5d3d06015558cad02bb465e89dd5cc07;hb=39aae2a3c9d265085b4a7bfde5bc1fb630860713;hp=caadd8cdcf23d7ace2cf65ddde9672ee7c4ddc86;hpb=a78e273ec53ff8a6c3993f3deda0b893f8dd709a;p=vlc diff --git a/src/playlist/thread.c b/src/playlist/thread.c index caadd8cdcf..50d19bcb5d 100644 --- a/src/playlist/thread.c +++ b/src/playlist/thread.c @@ -1,7 +1,7 @@ /***************************************************************************** - * playlist.c : Playlist management functions + * thread.c : Playlist management functions ***************************************************************************** - * Copyright (C) 1999-2004 the VideoLAN team + * Copyright © 1999-2008 the VideoLAN team * $Id$ * * Authors: Samuel Hocevar @@ -31,7 +31,6 @@ #include #include #include "playlist_internal.h" -#include "interface/interface.h" /***************************************************************************** * Local prototypes @@ -39,8 +38,8 @@ static void RunControlThread ( playlist_t * ); static void RunPreparse( playlist_preparse_t * ); static void RunFetcher( playlist_fetcher_t * ); - -static void DestroyInteraction( playlist_t * ); +static void PreparseDestructor( vlc_object_t * ); +static void FetcherDestructor( vlc_object_t * ); /***************************************************************************** * Main functions for the global thread @@ -49,7 +48,6 @@ static void DestroyInteraction( playlist_t * ); /** * Create the main playlist thread * Additionally to the playlist, this thread controls : - * - Interaction * - Statistics * - VLM * \param p_parent @@ -60,14 +58,6 @@ 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 ) ); - vlc_mutex_init( p_playlist, &p_playlist->p_stats->lock ); - p_playlist->p_stats_computer = NULL; - - // Interaction - p_playlist->p_interaction = NULL; - // Preparse p_playlist->p_preparse = vlc_object_create( p_playlist, sizeof( playlist_preparse_t ) ); @@ -77,15 +67,17 @@ void __playlist_ThreadCreate( vlc_object_t *p_parent ) 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; + vlc_object_set_destructor( p_playlist->p_preparse, PreparseDestructor ); + 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_detach( p_playlist->p_preparse ); vlc_object_release( p_playlist->p_preparse ); return; } @@ -99,28 +91,28 @@ void __playlist_ThreadCreate( vlc_object_t *p_parent ) 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" ); + vlc_object_set_destructor( p_playlist->p_fetcher, FetcherDestructor ); + vlc_object_attach( p_playlist->p_fetcher, p_playlist ); 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_detach( p_playlist->p_fetcher ); vlc_object_release( p_playlist->p_fetcher ); return; } // 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 ); @@ -133,82 +125,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 ) -{ - // Tell playlist to go to last loop - vlc_object_kill( p_playlist ); - - // Kill preparser - if( p_playlist->p_preparse ) - { - vlc_object_kill( p_playlist->p_preparse ); - vlc_thread_join( p_playlist->p_preparse ); - free( p_playlist->p_preparse->pp_waiting ); - vlc_object_detach( p_playlist->p_preparse ); - vlc_object_release( p_playlist->p_preparse ); - } - - // Kill meta fetcher - if( p_playlist->p_fetcher ) - { - vlc_object_kill( p_playlist->p_fetcher ); - vlc_thread_join( p_playlist->p_fetcher ); - free( p_playlist->p_fetcher->p_waiting ); - vlc_object_detach( p_playlist->p_fetcher ); - vlc_object_release( p_playlist->p_fetcher ); - } - - // Wait for thread to complete - vlc_thread_join( p_playlist ); - - // Stats - vlc_mutex_destroy( &p_playlist->p_stats->lock ); - if( p_playlist->p_stats ) - free( p_playlist->p_stats ); - - DestroyInteraction( 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 ) + + vlc_object_lock( p_playlist ); + while( vlc_object_alive( p_playlist ) ) { - i_loops++; + PL_UNLOCK; + playlist_MainLoop( p_playlist ); + PL_LOCK; - if( p_playlist->p_interaction ) - intf_InteractionManage( 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; - playlist_MainLoop( p_playlist ); if( p_playlist->b_cant_sleep ) { /* 100 ms is an acceptable delay for playlist operations */ + PL_UNLOCK; msleep( INTF_IDLE_SLEEP*2 ); + PL_LOCK; } 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 ); } @@ -229,14 +179,14 @@ static void RunFetcher( playlist_fetcher_t *p_obj ) playlist_FetcherLoop( p_obj ); } -/***************************************************************************** - * Interaction functions - *****************************************************************************/ -static void DestroyInteraction( playlist_t *p_playlist ) +static void PreparseDestructor( vlc_object_t * p_this ) { - if( p_playlist->p_interaction ) - { - intf_InteractionDestroy( p_playlist->p_interaction ); - p_playlist->p_interaction = NULL; - } + playlist_preparse_t * p_preparse = (playlist_preparse_t *)p_this; + free( p_preparse->pp_waiting ); +} + +static void FetcherDestructor( vlc_object_t * p_this ) +{ + playlist_fetcher_t * p_fetcher = (playlist_fetcher_t *)p_this; + free( p_fetcher->pp_waiting ); }