X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=ipc.c;h=0f295a9d2e6fc34b600d38594d5bd219afd08ccf;hb=3910462d958e9d8163eafba74052fed01c88a5d3;hp=723570e60b291811b8de24214159d18423557ee3;hpb=c92370affe722f38a85a41d1b5524e4a102b8f4d;p=dss.git diff --git a/ipc.c b/ipc.c index 723570e..0f295a9 100644 --- a/ipc.c +++ b/ipc.c @@ -22,9 +22,9 @@ #include "err.h" #include "ipc.h" -static int get_key(const char *config_file) +static key_t get_key(const char *config_file) { - int ret; + key_t ret; assert(config_file); ret = ftok(config_file, 'D'); @@ -40,11 +40,11 @@ static int get_key(const char *config_file) return 0x0D55; /* no magic, this number just looks a bit like DSS */ } -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); @@ -64,31 +64,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; @@ -108,23 +83,44 @@ static bool mutex_is_locked(int id) int lock_dss(char *config_file) { - int ret, key = get_key(config_file); + int ret, id; + struct sembuf sops[4]; + key_t key = get_key(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(config_file); + int ret, semid; + key_t key = get_key(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)