[vlc-devel] [PATCH] variables: privatise the callback CV

Thomas Guillem thomas at gllm.fr
Tue Dec 15 19:48:25 UTC 2020


LGTM

On Tue, Dec 15, 2020, at 20:39, RĂ©mi Denis-Courmont wrote:
> The condition variable was shared across all variables of a given
> object to save space, but it ends up waking up the wrong waiting
> threads.
> 
> vlc_cond_t is not as large as it used to be. In fact, it could be as
> small as a single pointer: if we required holding the mutex during
> signal/broadcast. The nested mutex is only there to handle unprotected
> signalling.
> ---
>  src/misc/objects.c   | 1 -
>  src/misc/variables.c | 8 +++++---
>  src/misc/variables.h | 1 -
>  3 files changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/src/misc/objects.c b/src/misc/objects.c
> index 7b15ae91d0..f43549d1a1 100644
> --- a/src/misc/objects.c
> +++ b/src/misc/objects.c
> @@ -69,7 +69,6 @@ int vlc_object_init(vlc_object_t *restrict obj, 
> vlc_object_t *parent,
>      priv->typename = typename;
>      priv->var_root = NULL;
>      vlc_mutex_init (&priv->var_lock);
> -    vlc_cond_init (&priv->var_wait);
>      priv->resources = NULL;
>  
>      obj->priv = priv;
> diff --git a/src/misc/variables.c b/src/misc/variables.c
> index ed284cf4f4..f12e55d4e7 100644
> --- a/src/misc/variables.c
> +++ b/src/misc/variables.c
> @@ -96,6 +96,8 @@ struct variable_t
>      callback_entry_t    *value_callbacks;
>      /** Registered list callbacks */
>      callback_entry_t    *list_callbacks;
> +
> +    vlc_cond_t   wait;
>  };
>  
>  static int CmpBool( vlc_value_t v, vlc_value_t w )
> @@ -228,7 +230,7 @@ static void WaitUnused(vlc_object_t *obj, variable_t *var)
>  
>      mutex_cleanup_push(&priv->var_lock);
>      while (var->b_incallback)
> -        vlc_cond_wait(&priv->var_wait, &priv->var_lock);
> +        vlc_cond_wait(&var->wait, &priv->var_lock);
>      vlc_cleanup_pop();
>  }
>  
> @@ -256,7 +258,7 @@ static void TriggerCallback(vlc_object_t *obj, 
> variable_t *var,
>  
>      vlc_mutex_lock(&priv->var_lock);
>      var->b_incallback = false;
> -    vlc_cond_broadcast(&priv->var_wait);
> +    vlc_cond_broadcast(&var->wait);
>  }
>  
>  static void TriggerListCallback(vlc_object_t *obj, variable_t *var,
> @@ -283,7 +285,7 @@ static void TriggerListCallback(vlc_object_t *obj, 
> variable_t *var,
>  
>      vlc_mutex_lock(&priv->var_lock);
>      var->b_incallback = false;
> -    vlc_cond_broadcast(&priv->var_wait);
> +    vlc_cond_broadcast(&var->wait);
>  }
>  
>  int (var_Create)( vlc_object_t *p_this, const char *psz_name, int i_type )
> diff --git a/src/misc/variables.h b/src/misc/variables.h
> index 5ef84f1b2a..711cd14b5a 100644
> --- a/src/misc/variables.h
> +++ b/src/misc/variables.h
> @@ -40,7 +40,6 @@ struct vlc_object_internals
>      /* Object variables */
>      void           *var_root;
>      vlc_mutex_t     var_lock;
> -    vlc_cond_t      var_wait;
>  
>      /* Object resources */
>      struct vlc_res *resources;
> -- 
> 2.20.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