[vlc-commits] variables: privatise the callback CV
Rémi Denis-Courmont
git at videolan.org
Sat Dec 19 16:04:02 UTC 2020
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | 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;
More information about the vlc-commits
mailing list