vlc | branch: master | Thomas Guillem <[email protected]> | Tue Sep 27 15:54:04 2016 +0200| [9a108595cb4b13078d099594c46643e74a8e1a7b] | committer: Thomas Guillem
preparser: reduce lock scope This was a regression introduced by f30ae6b016b6dca3a4c072f98486f9e81044ead3 closes #17355, #17399 > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9a108595cb4b13078d099594c46643e74a8e1a7b --- src/playlist/preparser.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/playlist/preparser.c b/src/playlist/preparser.c index 8baf345..0dc31e5 100644 --- a/src/playlist/preparser.c +++ b/src/playlist/preparser.c @@ -232,19 +232,22 @@ static void Preparse( playlist_preparser_t *preparser, if( b_preparse && !input_item_IsPreparsed( p_item ) ) { int status; - preparser->input = input_CreatePreparser( preparser->object, p_item ); - if( preparser->input == NULL ) + input_thread_t *input = input_CreatePreparser( preparser->object, p_item ); + if( input == NULL ) { input_item_SignalPreparseEnded( p_item, ITEM_PREPARSE_FAILED ); return; } - preparser->input_done = false; - preparser->input_id = p_entry->id; - var_AddCallback( preparser->input, "intf-event", InputEvent, - preparser ); - if( input_Start( preparser->input ) == VLC_SUCCESS ) + var_AddCallback( input, "intf-event", InputEvent, preparser ); + if( input_Start( input ) == VLC_SUCCESS ) { + vlc_mutex_lock( &preparser->lock ); + + preparser->input = input; + preparser->input_done = false; + preparser->input_id = p_entry->id; + if( p_entry->timeout > 0 ) { mtime_t deadline = mdate() + p_entry->timeout; @@ -260,15 +263,16 @@ static void Preparse( playlist_preparser_t *preparser, vlc_cond_wait( &preparser->thread_wait, &preparser->lock ); status = ITEM_PREPARSE_DONE; } + preparser->input = NULL; + preparser->input_id = NULL; + + vlc_mutex_unlock( &preparser->lock ); } else status = ITEM_PREPARSE_FAILED; - var_DelCallback( preparser->input, "intf-event", InputEvent, - preparser ); - input_Close( preparser->input ); - preparser->input = NULL; - preparser->input_id = NULL; + var_DelCallback( input, "intf-event", InputEvent, preparser ); + input_Close( input ); var_SetAddress( preparser->object, "item-change", p_item ); input_item_SetPreparsed( p_item, true ); @@ -327,11 +331,11 @@ static void *Thread( void *data ) { playlist_preparser_t *p_preparser = data; - vlc_mutex_lock( &p_preparser->lock ); for( ;; ) { preparser_entry_t *p_entry; + vlc_mutex_lock( &p_preparser->lock ); /* */ if( p_preparser->i_waiting > 0 ) { @@ -342,8 +346,10 @@ static void *Thread( void *data ) { p_preparser->b_live = false; vlc_cond_signal( &p_preparser->wait ); + vlc_mutex_unlock( &p_preparser->lock ); break; } + vlc_mutex_unlock( &p_preparser->lock ); assert( p_entry ); Preparse( p_preparser, p_entry ); @@ -352,7 +358,6 @@ static void *Thread( void *data ) vlc_gc_decref( p_entry->p_item ); free( p_entry ); } - vlc_mutex_unlock( &p_preparser->lock ); return NULL; } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
