[vlc-devel] [PATCH] config: only create the variables once in the object

Steve Lhomme robux4 at ycbcr.xyz
Tue Mar 17 10:24:41 CET 2020


It seems the refcounting does work and reuses the first created instance 
of the variable.

There is no matching var_Destroy for the variables created here, but 
that's unrelated to this patch. When/if there is then we should make 
sure we use the proper amount of Create/Destroy.

On 2020-03-16 15:13, Steve Lhomme wrote:
> config_LoadCmdLine() is called twice for the libvlc object and thus created the
> command-line option variables twice in the same object.
> 
> We try to create the variable if the type doesn't match (unlikely) so we can
> assert later in the code.
> ---
>   src/config/cmdline.c | 21 ++++++++++++++-------
>   1 file changed, 14 insertions(+), 7 deletions(-)
> 
> diff --git a/src/config/cmdline.c b/src/config/cmdline.c
> index 72df85347a9..4b0d24ad130 100644
> --- a/src/config/cmdline.c
> +++ b/src/config/cmdline.c
> @@ -212,11 +212,13 @@ int config_LoadCmdLine( vlc_object_t *p_this, int i_argc,
>                   switch( CONFIG_CLASS(p_conf->i_type) )
>                   {
>                       case CONFIG_ITEM_STRING:
> -                        var_Create( p_this, psz_name, VLC_VAR_STRING );
> +                        if ( var_Type( p_this, psz_name ) != VLC_VAR_STRING )
> +                            var_Create( p_this, psz_name, VLC_VAR_STRING );
>                           var_SetString( p_this, psz_name, state.arg );
>                           break;
>                       case CONFIG_ITEM_INTEGER:
> -                        var_Create( p_this, psz_name, VLC_VAR_INTEGER );
> +                        if ( var_Type( p_this, psz_name ) != VLC_VAR_INTEGER )
> +                            var_Create( p_this, psz_name, VLC_VAR_INTEGER );
>                           var_Change( p_this, psz_name, VLC_VAR_SETMINMAX,
>                               (vlc_value_t){ .i_int = p_conf->min.i },
>                               (vlc_value_t){ .i_int = p_conf->max.i } );
> @@ -224,14 +226,16 @@ int config_LoadCmdLine( vlc_object_t *p_this, int i_argc,
>                                           strtoll(state.arg, NULL, 0));
>                           break;
>                       case CONFIG_ITEM_FLOAT:
> -                        var_Create( p_this, psz_name, VLC_VAR_FLOAT );
> +                        if ( var_Type( p_this, psz_name ) != VLC_VAR_FLOAT )
> +                            var_Create( p_this, psz_name, VLC_VAR_FLOAT );
>                           var_Change( p_this, psz_name, VLC_VAR_SETMINMAX,
>                               (vlc_value_t){ .f_float = p_conf->min.f },
>                               (vlc_value_t){ .f_float = p_conf->max.f } );
>                           var_SetFloat( p_this, psz_name, us_atof(state.arg) );
>                           break;
>                       case CONFIG_ITEM_BOOL:
> -                        var_Create( p_this, psz_name, VLC_VAR_BOOL );
> +                        if ( var_Type( p_this, psz_name ) != VLC_VAR_BOOL )
> +                            var_Create( p_this, psz_name, VLC_VAR_BOOL );
>                           var_SetBool( p_this, psz_name, !flag );
>                           break;
>                   }
> @@ -246,11 +250,13 @@ int config_LoadCmdLine( vlc_object_t *p_this, int i_argc,
>               switch( CONFIG_CLASS(pp_shortopts[i_cmd]->i_type) )
>               {
>                   case CONFIG_ITEM_STRING:
> -                    var_Create( p_this, name, VLC_VAR_STRING );
> +                    if ( var_Type( p_this, name ) != VLC_VAR_STRING )
> +                        var_Create( p_this, name, VLC_VAR_STRING );
>                       var_SetString( p_this, name, state.arg );
>                       break;
>                   case CONFIG_ITEM_INTEGER:
> -                    var_Create( p_this, name, VLC_VAR_INTEGER );
> +                    if ( var_Type( p_this, name ) != VLC_VAR_INTEGER )
> +                        var_Create( p_this, name, VLC_VAR_INTEGER );
>                       if( i_cmd == 'v' )
>                       {
>                           i_verbose++; /* -v */
> @@ -263,7 +269,8 @@ int config_LoadCmdLine( vlc_object_t *p_this, int i_argc,
>                       }
>                       break;
>                   case CONFIG_ITEM_BOOL:
> -                    var_Create( p_this, name, VLC_VAR_BOOL );
> +                    if ( var_Type( p_this, name ) != VLC_VAR_BOOL )
> +                        var_Create( p_this, name, VLC_VAR_BOOL );
>                       var_SetBool( p_this, name, true );
>                       break;
>               }
> -- 
> 2.17.1
> 
> _______________________________________________
> 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