]> git.alsa-project.org Git - alsa-lib.git/commitdiff
Fix bugs in the last change of ipc_gid option
authorTakashi Iwai <tiwai@suse.de>
Mon, 30 May 2005 17:56:12 +0000 (17:56 +0000)
committerTakashi Iwai <tiwai@suse.de>
Mon, 30 May 2005 17:56:12 +0000 (17:56 +0000)
- Fix semaphore gid control
- Do semaphore discard for all semaphores (although currently defined as 1)
- Fix the wrong check of return value from shmctl

src/pcm/pcm_direct.c
src/pcm/pcm_dmix.c

index 3610a95fc3c540d73f95a85ab945e1979255c8ce..c7eeb325c70b0bdbc600982a34d8b68251c40e8b 100644 (file)
@@ -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;
 }
index 24aecdeb7d313702e74cfde71de35c1f22ddb444..462a5a21c150588ec905d850c4779fff91beeeef 100644 (file)
@@ -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;