X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fplaylist%2Fthread.c;h=50d19bcb5d3d06015558cad02bb465e89dd5cc07;hb=49fbd281fe8fd09e84b324b2971ff57396ca415f;hp=0d6919fa7e307bb98f01d1988a17ab2d3a071000;hpb=ef81e665be4bf3a169443a8af0cce89af39ce4de;p=vlc diff --git a/src/playlist/thread.c b/src/playlist/thread.c index 0d6919fa7e..50d19bcb5d 100644 --- a/src/playlist/thread.c +++ b/src/playlist/thread.c @@ -61,13 +61,13 @@ void __playlist_ThreadCreate( vlc_object_t *p_parent ) // Preparse p_playlist->p_preparse = vlc_object_create( p_playlist, sizeof( playlist_preparse_t ) ); - p_playlist->p_preparse->psz_object_name = "preparser"; 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; @@ -75,7 +75,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 ); @@ -85,17 +85,15 @@ 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"; 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" ); @@ -105,7 +103,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 ); @@ -114,7 +112,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 ); @@ -127,19 +125,6 @@ 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 */ @@ -155,6 +140,11 @@ static void RunControlThread ( playlist_t *p_playlist ) 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. */ + if( !vlc_object_alive( p_playlist ) ) + break; + if( p_playlist->b_cant_sleep ) { /* 100 ms is an acceptable delay for playlist operations */ @@ -198,5 +188,5 @@ static void PreparseDestructor( vlc_object_t * p_this ) 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 ); }