mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-29 05:40:25 -04:00
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:
parent
7a8a1d1552
commit
c4b690278e
2 changed files with 20 additions and 2 deletions
|
|
@ -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
|
||||
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
|
||||
|
||||
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);
|
||||
#ifdef THREAD_SAFE_API
|
||||
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
|
||||
*pcmp = pcm;
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -1087,11 +1087,13 @@ static inline void sw_set_period_event(snd_pcm_sw_params_t *params, int val)
|
|||
#ifdef THREAD_SAFE_API
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue