summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Stokes <linux@dadeos.co.uk>2009-02-23 10:02:50 +0100
committerTakashi Iwai <tiwai@suse.de>2009-02-23 10:02:50 +0100
commit9e71a90ea5f34872d8e0b700746aebdd2508a7ae (patch)
tree069019e8fc712e1c83083a49c116f323de31d3b4
parent63257a7b4b47cd654c96511366645eb2b6025956 (diff)
arcam_av: Remove incorrect usage of the static SHM ID variable
Signed-off-by: Peter Stokes <linux@dadeos.co.uk> Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--arcam-av/arcam_av.c58
1 files changed, 20 insertions, 38 deletions
diff --git a/arcam-av/arcam_av.c b/arcam-av/arcam_av.c
index 81e72e9..0491fc6 100644
--- a/arcam-av/arcam_av.c
+++ b/arcam-av/arcam_av.c
@@ -329,39 +329,34 @@ static void arcam_av_state_query(int fd)
}
-static int arcam_av_state_shm_id = -1;
-
arcam_av_state_t* arcam_av_state_attach(const char* port)
{
arcam_av_state_t* state;
+ struct stat port_stat;
+ key_t ipc_key;
+ int shmid, shmflg;
+ struct shmid_ds shm_stat;
- if (arcam_av_state_shm_id < 0) {
- struct stat port_stat;
- key_t ipc_key;
- int shmflg;
- struct shmid_ds shm_stat;
-
- if (stat(port, &port_stat))
- return NULL;
+ if (stat(port, &port_stat))
+ return NULL;
- ipc_key = ftok(port, 'A');
- if (ipc_key < 0)
- return NULL;
+ ipc_key = ftok(port, 'A');
+ if (ipc_key < 0)
+ return NULL;
- shmflg = IPC_CREAT | (port_stat.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO));
- arcam_av_state_shm_id = shmget(ipc_key, sizeof(arcam_av_state_t), shmflg);
- if (arcam_av_state_shm_id < 0)
- return NULL;
+ shmflg = IPC_CREAT | (port_stat.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO));
+ shmid = shmget(ipc_key, sizeof(arcam_av_state_t), shmflg);
+ if (shmid < 0)
+ return NULL;
- if (shmctl(arcam_av_state_shm_id, IPC_STAT, &shm_stat))
- return NULL;
+ if (shmctl(shmid, IPC_STAT, &shm_stat))
+ return NULL;
- shm_stat.shm_perm.uid = port_stat.st_uid;
- shm_stat.shm_perm.gid = port_stat.st_gid;
- shmctl(arcam_av_state_shm_id, IPC_SET, &shm_stat);
- }
+ shm_stat.shm_perm.uid = port_stat.st_uid;
+ shm_stat.shm_perm.gid = port_stat.st_gid;
+ shmctl(shmid, IPC_SET, &shm_stat);
- state = shmat(arcam_av_state_shm_id, NULL, 0);
+ state = shmat(shmid, NULL, 0);
return (state == (void*)-1) ? NULL : state;
}
@@ -369,20 +364,7 @@ arcam_av_state_t* arcam_av_state_attach(const char* port)
int arcam_av_state_detach(arcam_av_state_t* state)
{
- struct shmid_ds shm_stat;
-
- if (shmdt(state))
- return -1;
-
- if (shmctl(arcam_av_state_shm_id, IPC_STAT, &shm_stat))
- return -1;
-
- if (!shm_stat.shm_nattch) {
- shmctl(arcam_av_state_shm_id, IPC_RMID, NULL);
- arcam_av_state_shm_id = -1;
- }
-
- return 0;
+ return shmdt(state);
}