pcm: Add LIBASOUND_THREAD_SAFE env variable check

For making the debugging with any deadlocks by the newly introduced
thread-safety feature, add a check with LIBASOUND_THREAD_SAFE
environment variable.  When this variable is set to "0", alsa-lib PCM
forcibly disables the whole thread-safe pthread mutex calls.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Iwai 2016-07-07 15:21:14 +02:00
parent 7a8a1d1552
commit c4b690278e
2 changed files with 20 additions and 2 deletions

View file

@ -494,6 +494,13 @@ aren't thread-safe, and application needs to call them carefully when they
are called from multiple threads. In general, all the functions that are are called from multiple threads. In general, all the functions that are
often called during streaming are covered as thread-safe. often called during streaming are covered as thread-safe.
This thread-safe behavior can be disabled also by passing 0 to the environment
variable LIBASOUND_THREAD_SAFE, e.g.
\code
LIBASOUND_THREAD_SAFE=0 aplay foo.wav
\endcode
for making the debugging easier.
\section pcm_dev_names PCM naming conventions \section pcm_dev_names PCM naming conventions
The ALSA library uses a generic string representation for names of devices. The ALSA library uses a generic string representation for names of devices.
@ -2536,6 +2543,15 @@ int snd_pcm_new(snd_pcm_t **pcmp, snd_pcm_type_t type, const char *name,
INIT_LIST_HEAD(&pcm->async_handlers); INIT_LIST_HEAD(&pcm->async_handlers);
#ifdef THREAD_SAFE_API #ifdef THREAD_SAFE_API
pthread_mutex_init(&pcm->lock, NULL); pthread_mutex_init(&pcm->lock, NULL);
{
static int default_thread_safe = -1;
if (default_thread_safe < 0) {
char *p = getenv("LIBASOUND_THREAD_SAFE");
default_thread_safe = !p || *p != '0';
}
if (!default_thread_safe)
pcm->thread_safe = -1; /* force to disable */
}
#endif #endif
*pcmp = pcm; *pcmp = pcm;
return 0; return 0;

View file

@ -1087,11 +1087,13 @@ static inline void sw_set_period_event(snd_pcm_sw_params_t *params, int val)
#ifdef THREAD_SAFE_API #ifdef THREAD_SAFE_API
static inline void __snd_pcm_lock(snd_pcm_t *pcm) static inline void __snd_pcm_lock(snd_pcm_t *pcm)
{ {
pthread_mutex_lock(&pcm->lock); if (pcm->thread_safe >= 0)
pthread_mutex_lock(&pcm->lock);
} }
static inline void __snd_pcm_unlock(snd_pcm_t *pcm) static inline void __snd_pcm_unlock(snd_pcm_t *pcm)
{ {
pthread_mutex_unlock(&pcm->lock); if (pcm->thread_safe >= 0)
pthread_mutex_unlock(&pcm->lock);
} }
static inline void snd_pcm_lock(snd_pcm_t *pcm) static inline void snd_pcm_lock(snd_pcm_t *pcm)
{ {