From 9e71a90ea5f34872d8e0b700746aebdd2508a7ae Mon Sep 17 00:00:00 2001 From: Peter Stokes Date: Mon, 23 Feb 2009 10:02:50 +0100 Subject: arcam_av: Remove incorrect usage of the static SHM ID variable Signed-off-by: Peter Stokes Signed-off-by: Takashi Iwai --- arcam-av/arcam_av.c | 58 ++++++++++++++++++----------------------------------- 1 file 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); } -- cgit