Signed-off-by: Jerome Forissier jerome@taodyne.com --- src/control/namehint.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+)
diff --git a/src/control/namehint.c b/src/control/namehint.c index 19352be..b30f75d 100644 --- a/src/control/namehint.c +++ b/src/control/namehint.c @@ -26,6 +26,9 @@ */
#include "local.h" +#ifdef HAVE_LIBPTHREAD +#include <pthread.h> +#endif
#ifndef DOC_HIDDEN struct hint_list { @@ -44,6 +47,25 @@ struct hint_list { int show_all; char *cardname; }; + +#ifdef HAVE_LIBPTHREAD +static pthread_mutex_t snd_device_name_hint_mutex = + PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; +#endif + +static inline void snd_device_name_hint_lock() +{ +#ifdef HAVE_LIBPTHREAD + pthread_mutex_lock(&snd_device_name_hint_mutex); +#endif +} + +static inline void snd_device_name_hint_unlock() +{ +#ifdef HAVE_LIBPTHREAD + pthread_mutex_unlock(&snd_device_name_hint_mutex); +#endif +} #endif
static int hint_list_add(struct hint_list *list, @@ -553,9 +575,13 @@ int snd_device_name_hint(int card, const char *iface, void ***hints)
if (hints == NULL) return -EINVAL; + snd_device_name_hint_lock(); err = snd_config_update(); if (err < 0) + { + snd_device_name_hint_unlock(); return err; + } list.list = NULL; list.count = list.allocated = 0; list.siface = iface; @@ -574,7 +600,10 @@ int snd_device_name_hint(int card, const char *iface, void ***hints) else if (strcmp(iface, "ctl") == 0) list.iface = SND_CTL_ELEM_IFACE_MIXER; else + { + snd_device_name_hint_unlock(); return -EINVAL; + } list.show_all = 0; list.cardname = NULL; if (snd_config_search(snd_config, "defaults.namehint.showall", &conf) >= 0) @@ -618,6 +647,7 @@ int snd_device_name_hint(int card, const char *iface, void ***hints) snd_device_name_free_hint((void **)list.list); if (list.cardname) free(list.cardname); + snd_device_name_hint_unlock(); return err; } else { err = hint_list_add(&list, NULL, NULL); @@ -627,6 +657,7 @@ int snd_device_name_hint(int card, const char *iface, void ***hints) if (list.cardname) free(list.cardname); } + snd_device_name_hint_unlock(); return 0; }