On Fri, 01 Jul 2016 12:19:08 +0200, Baptiste Jonglez wrote:
On Wed, Jun 29, 2016 at 06:02:58PM +0200, Takashi Iwai wrote:
Now I reread the code again, and I guess it's really the racy accesses. Basically you can't call alsa-lib functions concurrently. For example, calling snd_pcm_avail_update() from multiple threads concurrently may lead to such an error. Internally it copies / converts the content (e.g. for softvol plugin), and this would conflict when called in parallel.
You can try a hackish patch below to see whether it emits any messages. It has no mutex, so the code itself is racy, but it should be enough just as a check.
Meanwhile, the crash itself might be avoided by disabling "pcm->mmap_shadow = 1" line in pcm_softvol.c. Then it'll be copied to the external buffer.
Thank you Takashi, I will give it a try!
To be noted: clearing mmap_show won't "fix" but merely avoid the crash. You may still get garbled sounds when such a race happens.
The best would be to fix the race. But it's often difficult to fix due to the design of apps.
I created an experimental version of alsa-lib to make PCM thread-safe by forcibly applying pthread mutex. The code is found in thread-safety branch in the git tree below: https://github.com/tiwai/alsa-lib
You need to build with --enable-thread-safety configure option with this code. I haven't tested whether it really avoids the race yet. I'd need to write a test case. So, take it as a proof-of-concept, so far.
Takashi