On 22/Ago/2016 11:26, Takashi Iwai wrote:
On Sun, 14 Aug 2016 02:28:52 +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
src/pcm/pcm_direct.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/src/pcm/pcm_direct.c b/src/pcm/pcm_direct.c index c3925cc20fd3..b5215ba35406 100644 --- a/src/pcm/pcm_direct.c +++ b/src/pcm/pcm_direct.c @@ -101,6 +101,8 @@ retryget: if ((dmix->shmid = shmget(dmix->ipc_key, sizeof(snd_pcm_direct_share_t), IPC_CREAT | IPC_EXCL | dmix->ipc_perm)) != -1) first_instance = 1;
if (dmix->shmid < 0 && errno == EEXIST)
goto retryget;
Hrm, but this would result in an endless loop if the shm was already taken persistently.
If so, shouldn't the first call to shmget succeed?
To me it seems very unlikely that both calls continuosly fail.
Also, which call does give a negative shmid, actually? It's from the first shmget() or the second shmget()?
What happens is that both threads go down that path but, of course, only one succeeds in the second shmget call.