From a1066b72e4bc3cdd3edcecc2e2482de378a11b7c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Cl=C3=A9ment=20Stenac?= Date: Fri, 22 Dec 2006 21:34:23 +0000 Subject: [PATCH] Cleanup control and parser threads handling. Might fix #917 --- src/playlist/engine.c | 71 ++++++++++++++++++------------------------- src/playlist/thread.c | 49 ++++++++++++++--------------- 2 files changed, 51 insertions(+), 69 deletions(-) diff --git a/src/playlist/engine.c b/src/playlist/engine.c index ae85d8f527..ebb7365e2f 100644 --- a/src/playlist/engine.c +++ b/src/playlist/engine.c @@ -158,21 +158,6 @@ playlist_t * playlist_Create( vlc_object_t *p_parent ) void playlist_Destroy( playlist_t *p_playlist ) { - while( p_playlist->i_sds ) - { - playlist_ServicesDiscoveryRemove( p_playlist, - p_playlist->pp_sds[0]->psz_module ); - } - - playlist_MLDump( p_playlist ); - - vlc_thread_join( p_playlist->p_preparse ); - vlc_thread_join( p_playlist->p_fetcher ); - vlc_thread_join( p_playlist ); - - vlc_object_detach( p_playlist->p_preparse ); - vlc_object_detach( p_playlist->p_fetcher ); - var_Destroy( p_playlist, "intf-change" ); var_Destroy( p_playlist, "item-change" ); var_Destroy( p_playlist, "playlist-current" ); @@ -185,34 +170,7 @@ void playlist_Destroy( playlist_t *p_playlist ) var_Destroy( p_playlist, "loop" ); var_Destroy( p_playlist, "activity" ); - PL_LOCK; - /* Go through all items, and simply free everything without caring - * about the tree structure. Do not decref, it will be done by doing - * the same thing on the input items array */ - FOREACH_ARRAY( playlist_item_t *p_del, p_playlist->all_items ) - free( p_del->pp_children ); - free( p_del ); - FOREACH_END(); - ARRAY_RESET( p_playlist->all_items ); - - FOREACH_ARRAY( input_item_t *p_del, p_playlist->input_items ) - input_ItemClean( p_del ); - free( p_del ); - FOREACH_END(); - ARRAY_RESET( p_playlist->input_items ); - - ARRAY_RESET( p_playlist->items ); - ARRAY_RESET( p_playlist->current ); - - PL_UNLOCK; - - vlc_mutex_destroy( &p_playlist->p_stats->lock ); - if( p_playlist->p_stats ) - free( p_playlist->p_stats ); - vlc_mutex_destroy( &p_playlist->gc_lock ); - vlc_object_destroy( p_playlist->p_preparse ); - vlc_object_destroy( p_playlist->p_fetcher ); vlc_object_detach( p_playlist ); vlc_object_destroy( p_playlist ); } @@ -474,6 +432,35 @@ void playlist_LastLoop( playlist_t *p_playlist ) vlc_object_release( p_obj ); vout_Destroy( (vout_thread_t *)p_obj ); } + + while( p_playlist->i_sds ) + { + playlist_ServicesDiscoveryRemove( p_playlist, + p_playlist->pp_sds[0]->psz_module ); + } + + playlist_MLDump( p_playlist ); + + PL_LOCK; + /* Go through all items, and simply free everything without caring + * about the tree structure. Do not decref, it will be done by doing + * the same thing on the input items array */ + FOREACH_ARRAY( playlist_item_t *p_del, p_playlist->all_items ) + free( p_del->pp_children ); + free( p_del ); + FOREACH_END(); + ARRAY_RESET( p_playlist->all_items ); + + FOREACH_ARRAY( input_item_t *p_del, p_playlist->input_items ) + input_ItemClean( p_del ); + free( p_del ); + FOREACH_END(); + ARRAY_RESET( p_playlist->input_items ); + + ARRAY_RESET( p_playlist->items ); + ARRAY_RESET( p_playlist->current ); + + PL_UNLOCK; } /** Main loop for preparser queue */ diff --git a/src/playlist/thread.c b/src/playlist/thread.c index 01544c73d4..9062875158 100644 --- a/src/playlist/thread.c +++ b/src/playlist/thread.c @@ -36,10 +36,6 @@ static void RunControlThread ( playlist_t * ); static void RunPreparse( playlist_preparse_t * ); static void RunFetcher( playlist_fetcher_t * ); -static playlist_t * CreatePlaylist( vlc_object_t *p_parent ); -static void EndPlaylist( playlist_t * ); -static void DestroyPlaylist( playlist_t * ); - static void DestroyInteraction( playlist_t * ); /***************************************************************************** @@ -57,9 +53,7 @@ static void DestroyInteraction( playlist_t * ); */ void __playlist_ThreadCreate( vlc_object_t *p_parent ) { - playlist_t *p_playlist; - p_playlist = CreatePlaylist( p_parent ); - + playlist_t *p_playlist = playlist_Create( p_parent ); if( !p_playlist ) return; // Stats @@ -142,21 +136,41 @@ void __playlist_ThreadCreate( vlc_object_t *p_parent ) */ int playlist_ThreadDestroy( playlist_t * p_playlist ) { + // Tell playlist to go to last loop p_playlist->b_die = VLC_TRUE; playlist_Signal( p_playlist ); + + // Kill preparser if( p_playlist->p_preparse ) { vlc_cond_signal( &p_playlist->p_preparse->object_wait ); free( p_playlist->p_preparse->pp_waiting ); } + vlc_thread_join( p_playlist->p_preparse ); + vlc_object_detach( p_playlist->p_preparse ); + vlc_object_destroy( p_playlist->p_preparse ); + + // Kill meta fetcher if( p_playlist->p_fetcher ) { vlc_cond_signal( &p_playlist->p_fetcher->object_wait ); free( p_playlist->p_fetcher->p_waiting ); } + vlc_thread_join( p_playlist->p_fetcher ); + vlc_object_detach( p_playlist->p_fetcher ); + vlc_object_destroy( 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 ); - DestroyPlaylist( p_playlist ); + + playlist_Destroy( p_playlist ); return VLC_SUCCESS; } @@ -192,25 +206,6 @@ static void RunControlThread ( playlist_t *p_playlist ) } } - EndPlaylist( p_playlist ); -} - - -/***************************************************************************** - * Playlist-specific functions - *****************************************************************************/ -static playlist_t * CreatePlaylist( vlc_object_t *p_parent ) -{ - return playlist_Create( p_parent ); -} - -static void DestroyPlaylist( playlist_t *p_playlist ) -{ - playlist_Destroy( p_playlist ); -} - -static void EndPlaylist( playlist_t *p_playlist ) -{ playlist_LastLoop( p_playlist ); } -- 2.20.1