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 ) ...@@ -158,21 +158,6 @@ playlist_t * playlist_Create( vlc_object_t *p_parent )
void playlist_Destroy( playlist_t *p_playlist ) 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, "intf-change" );
var_Destroy( p_playlist, "item-change" ); var_Destroy( p_playlist, "item-change" );
var_Destroy( p_playlist, "playlist-current" ); var_Destroy( p_playlist, "playlist-current" );
...@@ -185,34 +170,7 @@ void playlist_Destroy( playlist_t *p_playlist ) ...@@ -185,34 +170,7 @@ void playlist_Destroy( playlist_t *p_playlist )
var_Destroy( p_playlist, "loop" ); var_Destroy( p_playlist, "loop" );
var_Destroy( p_playlist, "activity" ); 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_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_detach( p_playlist );
vlc_object_destroy( p_playlist ); vlc_object_destroy( p_playlist );
} }
...@@ -474,6 +432,35 @@ void playlist_LastLoop( playlist_t *p_playlist ) ...@@ -474,6 +432,35 @@ void playlist_LastLoop( playlist_t *p_playlist )
vlc_object_release( p_obj ); vlc_object_release( p_obj );
vout_Destroy( (vout_thread_t *)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 */ /** Main loop for preparser queue */
......
...@@ -36,10 +36,6 @@ static void RunControlThread ( playlist_t * ); ...@@ -36,10 +36,6 @@ static void RunControlThread ( playlist_t * );
static void RunPreparse( playlist_preparse_t * ); static void RunPreparse( playlist_preparse_t * );
static void RunFetcher( playlist_fetcher_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 * ); static void DestroyInteraction( playlist_t * );
/***************************************************************************** /*****************************************************************************
...@@ -57,9 +53,7 @@ static void DestroyInteraction( playlist_t * ); ...@@ -57,9 +53,7 @@ static void DestroyInteraction( playlist_t * );
*/ */
void __playlist_ThreadCreate( vlc_object_t *p_parent ) void __playlist_ThreadCreate( vlc_object_t *p_parent )
{ {
playlist_t *p_playlist; playlist_t *p_playlist = playlist_Create( p_parent );
p_playlist = CreatePlaylist( p_parent );
if( !p_playlist ) return; if( !p_playlist ) return;
// Stats // Stats
...@@ -142,21 +136,41 @@ void __playlist_ThreadCreate( vlc_object_t *p_parent ) ...@@ -142,21 +136,41 @@ void __playlist_ThreadCreate( vlc_object_t *p_parent )
*/ */
int playlist_ThreadDestroy( playlist_t * p_playlist ) int playlist_ThreadDestroy( playlist_t * p_playlist )
{ {
// Tell playlist to go to last loop
p_playlist->b_die = VLC_TRUE; p_playlist->b_die = VLC_TRUE;
playlist_Signal( p_playlist ); playlist_Signal( p_playlist );
// Kill preparser
if( p_playlist->p_preparse ) if( p_playlist->p_preparse )
{ {
vlc_cond_signal( &p_playlist->p_preparse->object_wait ); vlc_cond_signal( &p_playlist->p_preparse->object_wait );
free( p_playlist->p_preparse->pp_waiting ); 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 ) if( p_playlist->p_fetcher )
{ {
vlc_cond_signal( &p_playlist->p_fetcher->object_wait ); vlc_cond_signal( &p_playlist->p_fetcher->object_wait );
free( p_playlist->p_fetcher->p_waiting ); 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 ); DestroyInteraction( p_playlist );
DestroyPlaylist( p_playlist );
playlist_Destroy( p_playlist );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -192,25 +206,6 @@ static void RunControlThread ( playlist_t *p_playlist ) ...@@ -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 ); 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