[vlc-devel] [PATCH] input: fix non thread safe titles update (#21363)

Thomas Guillem thomas at gllm.fr
Tue Oct 23 13:29:31 CEST 2018


Please don't.

This code will be removed when the player is merged and used.
The new way to passe titles won't be racy anymore, in fact nothing will be racy anymore. Famous last words...

On Tue, Oct 23, 2018, at 11:52, Francois Cartegnie wrote:
> race with INPUT_GET_FULL_TITLE_INFO
> ---
>  src/input/input.c | 16 +++++++++++-----
>  1 file changed, 11 insertions(+), 5 deletions(-)
> 
> diff --git a/src/input/input.c b/src/input/input.c
> index 57e029ebb3..f659c77d20 100644
> --- a/src/input/input.c
> +++ b/src/input/input.c
> @@ -885,7 +885,8 @@ static int InitSout( input_thread_t * p_input )
>  }
>  #endif
>  
> -static void InitTitle( input_thread_t * p_input, bool had_titles )
> +static void InitTitle( input_thread_t * p_input, bool had_titles,
> +                       bool b_with_lock )
>  {
>      input_thread_private_t *priv = input_priv(p_input);
>      input_source_t *p_master = priv->master;
> @@ -893,7 +894,8 @@ static void InitTitle( input_thread_t * p_input, 
> bool had_titles )
>      if( priv->b_preparsing )
>          return;
>  
> -    vlc_mutex_lock( &priv->p_item->lock );
> +    if(b_with_lock)
> +        vlc_mutex_lock( &priv->p_item->lock );
>      /* Create global title (from master) */
>      priv->i_title = p_master->i_title;
>      priv->title   = p_master->title;
> @@ -904,7 +906,8 @@ static void InitTitle( input_thread_t * p_input, 
> bool had_titles )
>      priv->b_can_pace_control = p_master->b_can_pace_control;
>      priv->b_can_pause        = p_master->b_can_pause;
>      priv->b_can_rate_control = p_master->b_can_rate_control;
> -    vlc_mutex_unlock( &priv->p_item->lock );
> +    if(b_with_lock)
> +        vlc_mutex_unlock( &priv->p_item->lock );
>  
>      /* Send event only if the count is valid or if titles are gone */
>      if (had_titles || p_master->i_title > 0)
> @@ -1358,7 +1361,7 @@ static int Init( input_thread_t * p_input )
>          goto error;
>      priv->master = master;
>  
> -    InitTitle( p_input, false );
> +    InitTitle( p_input, false, true );
>  
>      /* Load master infos */
>      /* Init length */
> @@ -2452,6 +2455,7 @@ static void 
> UpdateTitleListfromDemux( input_thread_t *p_input )
>  
>      /* Delete the preexisting titles */
>      bool had_titles = false;
> +    vlc_mutex_lock( &priv->p_item->lock );
>      if( in->i_title > 0 )
>      {
>          had_titles = true;
> @@ -2471,7 +2475,9 @@ static void 
> UpdateTitleListfromDemux( input_thread_t *p_input )
>      else
>          in->b_title_demux = true;
>  
> -    InitTitle( p_input, had_titles );
> +    InitTitle( p_input, had_titles, false );
> +
> +    vlc_mutex_unlock( &priv->p_item->lock );
>  }
>  
>  static int
> -- 
> 2.17.2
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list