Commit a1066b72 authored by Clément Stenac's avatar Clément Stenac

Cleanup control and parser threads handling. Might fix #917

parent 65d21833
......@@ -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 */
......
......@@ -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 );
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment