From: Takashi Iwai Date: Mon, 30 May 2005 17:56:12 +0000 (+0000) Subject: Fix bugs in the last change of ipc_gid option X-Git-Tag: v1.0.10rc1~43 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=b69ab56881f747c6ea0203d07a488a12db25b41d;p=alsa-lib.git Fix bugs in the last change of ipc_gid option - Fix semaphore gid control - Do semaphore discard for all semaphores (although currently defined as 1) - Fix the wrong check of return value from shmctl --- diff --git a/src/pcm/pcm_direct.c b/src/pcm/pcm_direct.c index 3610a95f..c7eeb325 100644 --- a/src/pcm/pcm_direct.c +++ b/src/pcm/pcm_direct.c @@ -50,7 +50,8 @@ int snd_pcm_direct_semaphore_create_or_connect(snd_pcm_direct_t *dmix) { - struct shmid_ds buf; + struct semid_ds buf; + int i; dmix->semid = semget(dmix->ipc_key, DIRECT_IPC_SEMS, IPC_CREAT | dmix->ipc_perm); @@ -58,22 +59,28 @@ int snd_pcm_direct_semaphore_create_or_connect(snd_pcm_direct_t *dmix) return -errno; if (dmix->ipc_gid < 0) return 0; - if (shmctl(dmix->semid, IPC_STAT, &buf) < 0) { - int err = -errno; - snd_pcm_direct_semaphore_discard(dmix); - return err; + for (i = 0; i < DIRECT_IPC_SEMS; i++) { + if (semctl(dmix->semid, i, IPC_STAT, &buf) < 0) { + int err = -errno; + snd_pcm_direct_semaphore_discard(dmix); + return err; + } + buf.sem_perm.gid = dmix->ipc_gid; + semctl(dmix->semid, i, IPC_SET, &buf); } - buf.shm_perm.gid = dmix->ipc_gid; - shmctl(dmix->semid, IPC_SET, &buf); return 0; } int snd_pcm_direct_semaphore_discard(snd_pcm_direct_t *dmix) { + int i; + if (dmix->semid < 0) return -EINVAL; - if (semctl(dmix->semid, 0, IPC_RMID, NULL) < 0) - return -errno; + for (i = 0; i < DIRECT_IPC_SEMS; i++) { + if (semctl(dmix->semid, i, IPC_RMID, NULL) < 0) + return -errno; + } dmix->semid = -1; return 0; } diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c index 24aecdeb..462a5a21 100644 --- a/src/pcm/pcm_dmix.c +++ b/src/pcm/pcm_dmix.c @@ -87,7 +87,7 @@ retryshm: goto retryshm; return err; } - if (!shmctl(dmix->u.dmix.shmid_sum, IPC_STAT, &buf)) { + if (shmctl(dmix->u.dmix.shmid_sum, IPC_STAT, &buf) < 0) { err = -errno; shm_sum_discard(dmix); return err;