vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Tue Dec 15 21:39:08 2020 +0200| [5ab3e74bcd7a2e02a4860a524955be365557ef46] | committer: Rémi Denis-Courmont
variables: privatise the callback CV 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. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=5ab3e74bcd7a2e02a4860a524955be365557ef46 --- 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; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
