X-Git-Url: http://git.tuebingen.mpg.de/?p=dss.git;a=blobdiff_plain;f=ipc.c;h=183c76e9b4ad0b46ee2910207f12626fbb7087ca;hp=c55554c5d3fd815cd09c045a94f7b72d5bd5db85;hb=a4544b07746d58815d78c4f1213ccdb96d256919;hpb=ae647da612e0edfb607a4fdb251983d6405f6b00 diff --git a/ipc.c b/ipc.c index c55554c..183c76e 100644 --- a/ipc.c +++ b/ipc.c @@ -258,11 +258,11 @@ static int get_key_or_die(const char *config_file) return ret; } -static int mutex_get(int key, int flags) +static int mutex_get(key_t key, int flags) { int ret; - DSS_DEBUG_LOG(("getting semaphore 0x%x\n", key)); + DSS_DEBUG_LOG(("getting semaphore 0x%lx\n", (long)key)); ret = semget(key, 2, flags); if (ret < 0) return -ERRNO_TO_DSS_ERROR(errno); @@ -282,31 +282,6 @@ static int do_semop(int id, struct sembuf *sops, int num) return -ERRNO_TO_DSS_ERROR(errno); } -static int mutex_lock(int id) -{ - struct sembuf sops[4]; - - DSS_DEBUG_LOG(("locking\n")); - - sops[0].sem_num = 0; - sops[0].sem_op = 0; - sops[0].sem_flg = SEM_UNDO | IPC_NOWAIT; - - sops[1].sem_num = 0; - sops[1].sem_op = 1; - sops[1].sem_flg = SEM_UNDO | IPC_NOWAIT; - - sops[2].sem_num = 1; - sops[2].sem_op = 0; - sops[2].sem_flg = SEM_UNDO | IPC_NOWAIT; - - sops[3].sem_num = 1; - sops[3].sem_op = 1; - sops[3].sem_flg = SEM_UNDO | IPC_NOWAIT; - - return do_semop(id, sops, 4); -} - static bool mutex_is_locked(int id) { struct sembuf sops; @@ -326,23 +301,44 @@ static bool mutex_is_locked(int id) int lock_dss(char *config_file) { - int ret, key = get_key_or_die(config_file); + int ret, id; + struct sembuf sops[4]; + key_t key = get_key_or_die(config_file); ret = mutex_get(key, IPC_CREAT | 0600); if (ret < 0) return ret; - return mutex_lock(ret); + id = ret; + + sops[0].sem_num = 0; + sops[0].sem_op = 0; + sops[0].sem_flg = SEM_UNDO | IPC_NOWAIT; + + sops[1].sem_num = 0; + sops[1].sem_op = 1; + sops[1].sem_flg = SEM_UNDO | IPC_NOWAIT; + + sops[2].sem_num = 1; + sops[2].sem_op = 0; + sops[2].sem_flg = SEM_UNDO | IPC_NOWAIT; + + sops[3].sem_num = 1; + sops[3].sem_op = 1; + sops[3].sem_flg = SEM_UNDO | IPC_NOWAIT; + + return do_semop(id, sops, 4); } int get_dss_pid(char *config_file, pid_t *pid) { - int ret, semid, key = get_key_or_die(config_file); + int ret, semid; + key_t key = get_key_or_die(config_file); if (pid) *pid = 0; ret = mutex_get(key, 0); if (ret < 0) - return ret; + return ret == -ERRNO_TO_DSS_ERROR(ENOENT)? -E_NOT_RUNNING : ret; semid = ret; ret = semctl(semid, 1, GETPID); if (ret < 0)