vlc | branch: master | Thomas Guillem <[email protected]> | Tue Mar 29 13:47:35 2016 +0200| [7f8d972a2b0ff62ef02a9d562a9a8299dd2eb985] | committer: Thomas Guillem
playlist/fetcher: interrupt fetcher thread on exit This unblocks playlist_fetcher_Delete if a task is blocked on I/O. This doesn't prevent a task to block all next tasks on a normal run. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=7f8d972a2b0ff62ef02a9d562a9a8299dd2eb985 --- src/playlist/fetcher.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/playlist/fetcher.c b/src/playlist/fetcher.c index a8b7b11..9baf3b7 100644 --- a/src/playlist/fetcher.c +++ b/src/playlist/fetcher.c @@ -34,6 +34,7 @@ #include <vlc_memory.h> #include <vlc_demux.h> #include <vlc_modules.h> +#include <vlc_interrupt.h> #include "libvlc.h" #include "art.h" @@ -75,6 +76,7 @@ struct playlist_fetcher_t vlc_mutex_t lock; vlc_cond_t wait; bool b_live; + vlc_interrupt_t *interrupt; fetcher_entry_t *p_waiting_head[PASS_COUNT]; fetcher_entry_t *p_waiting_tail[PASS_COUNT]; @@ -95,6 +97,12 @@ playlist_fetcher_t *playlist_fetcher_New( vlc_object_t *parent ) if( !p_fetcher ) return NULL; + p_fetcher->interrupt = vlc_interrupt_create(); + if( unlikely(p_fetcher->interrupt == NULL) ) + { + free( p_fetcher ); + return NULL; + } p_fetcher->object = parent; vlc_mutex_init( &p_fetcher->lock ); vlc_cond_init( &p_fetcher->wait ); @@ -148,6 +156,9 @@ void playlist_fetcher_Push( playlist_fetcher_t *p_fetcher, input_item_t *p_item, void playlist_fetcher_Delete( playlist_fetcher_t *p_fetcher ) { fetcher_entry_t *p_next; + + vlc_interrupt_kill(p_fetcher->interrupt); + vlc_mutex_lock( &p_fetcher->lock ); /* Remove any left-over item, the fetcher will exit */ for ( int i_queue=0; i_queue<PASS_COUNT; i_queue++ ) @@ -169,6 +180,8 @@ void playlist_fetcher_Delete( playlist_fetcher_t *p_fetcher ) vlc_cond_destroy( &p_fetcher->wait ); vlc_mutex_destroy( &p_fetcher->lock ); + vlc_interrupt_destroy( p_fetcher->interrupt ); + playlist_album_t album; FOREACH_ARRAY( album, p_fetcher->albums ) free( album.psz_album ); @@ -437,6 +450,9 @@ static void *Thread( void *p_data ) playlist_fetcher_t *p_fetcher = p_data; vlc_object_t *obj = p_fetcher->object; fetcher_pass_t e_pass = PASS1_LOCAL; + + vlc_interrupt_set(p_fetcher->interrupt); + for( ;; ) { fetcher_entry_t *p_entry = NULL; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
