On Mon, 22 Aug 2016 18:04:33 +0200, Ismael Luceno wrote:
Easily seen when two threads try at the same time, one of them will fail.
The bug was identified by using apulse with Skype.
Fixes: dec428c35221 ("pcm: fix 'unable to create IPC shm instance' caused by fork from a thread") Fixes: https://github.com/i-rinat/apulse/issues/38 Signed-off-by: Ismael Luceno ismael@iodev.co.uk
OK, I'll apply this one, as this change alone is fine.
But in general, this implies that the application hitting this is buggy. You can't reliably call snd_pcm_open() for the same PCM stream concurrently via multi threads. You have to introduce the proper protection in the caller side.
thanks,
Takashi
src/pcm/pcm_direct.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/pcm/pcm_direct.c b/src/pcm/pcm_direct.c index c3925cc20fd3..643498375b34 100644 --- a/src/pcm/pcm_direct.c +++ b/src/pcm/pcm_direct.c @@ -96,11 +96,12 @@ int snd_pcm_direct_shm_create_or_connect(snd_pcm_direct_t *dmix) retryget: dmix->shmid = shmget(dmix->ipc_key, sizeof(snd_pcm_direct_share_t), dmix->ipc_perm);
- if (dmix->shmid < 0) {
if (errno == ENOENT)
- if (dmix->shmid < 0 && errno == ENOENT) { if ((dmix->shmid = shmget(dmix->ipc_key, sizeof(snd_pcm_direct_share_t), IPC_CREAT | IPC_EXCL | dmix->ipc_perm)) != -1) first_instance = 1;
else if (errno == EEXIST)
} err = -errno; if (dmix->shmid < 0) {goto retryget;
-- 2.9.2