File was renamed from src/svsem_util.cpp |
| | |
| | | #include "svsem_util.h" |
| | | #include "svsem.h" |
| | | |
| | | int SvsemUtil::get(key_t key, int nsems, unsigned short * arr_val) { |
| | | // printf("==================SvsemUtil::get===============================\n"); |
| | | int svsem_get(key_t key, unsigned int value) { |
| | | // printf("==================svsem_get===============================\n"); |
| | | int semid, perms; |
| | | |
| | | perms = S_IRUSR | S_IWUSR; |
| | | |
| | | semid = semget(key, nsems, IPC_CREAT | IPC_EXCL | perms); |
| | | semid = semget(key, 1, IPC_CREAT | IPC_EXCL | perms); |
| | | |
| | | if (semid != -1) { /* Successfully created the semaphore */ |
| | | union semun arg; |
| | |
| | | |
| | | //logger.info("%ld: created semaphore\n", (long)getpid()); |
| | | |
| | | arg.array = arr_val; /* So initialize it to arr_val */ |
| | | if (semctl(semid, 0, SETALL, arg) == -1) |
| | | arg.val = 0; /* So initialize it to 0 */ |
| | | if (semctl(semid, 0, SETVAL, arg) == -1) |
| | | err_exit(errno, "semctl 1"); |
| | | //logger.info("%ld: initialized semaphore\n", (long)getpid()); |
| | | |
| | |
| | | so other processes can see we've initialized the set. */ |
| | | |
| | | sop.sem_num = 0; /* Operate on semaphore 0 */ |
| | | sop.sem_op = arr_val[0]; |
| | | sop.sem_op = value; |
| | | sop.sem_flg = 0; |
| | | if (semop(semid, &sop, 1) == -1) |
| | | err_exit(errno, "semop"); |
| | |
| | | union semun arg; |
| | | struct semid_ds ds; |
| | | |
| | | semid = semget(key, nsems, perms); /* So just get ID */ |
| | | semid = semget(key, 1, perms); /* So just get ID */ |
| | | if (semid == -1) |
| | | err_exit(errno, "semget 2"); |
| | | |
| | |
| | | set to EINTR if operation was interrupted by a signal handler */ |
| | | |
| | | /* Reserve semaphore - decrement it by 1 */ |
| | | int SvsemUtil::dec(int semId) { |
| | | int svsem_wait(int semid) { |
| | | struct sembuf sops; |
| | | |
| | | sops.sem_num = 0; |
| | | sops.sem_op = -1; |
| | | sops.sem_flg = 0; |
| | | |
| | | while (semop(semId, &sops, 1) == -1) |
| | | while (semop(semid, &sops, 1) == -1) |
| | | if (errno != EINTR) { |
| | | // err_msg(errno, "SvsemUtil::dec"); |
| | | // err_msg(errno, "svsem_dec"); |
| | | return errno; |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | int SvsemUtil::dec_nowait(int semId) { |
| | | int svsem_trywait(int semid) { |
| | | struct sembuf sops; |
| | | |
| | | sops.sem_num = 0; |
| | | sops.sem_op = -1; |
| | | sops.sem_flg = IPC_NOWAIT | SEM_UNDO; |
| | | sops.sem_flg = IPC_NOWAIT | 0; |
| | | |
| | | while (semop(semId, &sops, 1) == -1) |
| | | while (semop(semid, &sops, 1) == -1) |
| | | if (errno != EINTR) { |
| | | // err_msg(errno, "SvsemUtil::dec_nowait"); |
| | | // err_msg(errno, "svsem_dec_nowait"); |
| | | return errno; |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | int SvsemUtil::dec_timeout(const int semId, const struct timespec *timeout) { |
| | | int svsem_timedwait(const int semid, const struct timespec *timeout) { |
| | | struct sembuf sops; |
| | | |
| | | sops.sem_num = 0; |
| | | sops.sem_op = -1; |
| | | sops.sem_flg = 0; |
| | | |
| | | while (semtimedop(semId, &sops, 1, timeout) == -1) |
| | | while (semtimedop(semid, &sops, 1, timeout) == -1) |
| | | if (errno != EINTR) { |
| | | // err_msg(errno, "SvsemUtil::dec_timeout"); |
| | | // err_msg(errno, "svsem_psem_timedwait"); |
| | | return errno; |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | |
| | | /* Release semaphore - increment it by 1 */ |
| | | int svsem_post(int semid) { |
| | | struct sembuf sops; |
| | | |
| | | sops.sem_num = 0; |
| | | sops.sem_op = 1; |
| | | sops.sem_flg = 0; |
| | | |
| | | int rv = semop(semid, &sops, 1); |
| | | if (rv == -1) { |
| | | // err_msg(errno, "svsem_inc"); |
| | | return errno; |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | |
| | | * currently equals 0. If it does, the operation completes immediately; otherwise, |
| | | * semop() blocks until the semaphore value becomes 0. |
| | | */ |
| | | int SvsemUtil::zero(int semId) { |
| | | // logger.debug("%d: SvsemUtil::dec\n", semId); |
| | | int svsem_zero(int semid) { |
| | | // logger.debug("%d: svsem_dec\n", semid); |
| | | struct sembuf sops; |
| | | |
| | | sops.sem_num = 0; |
| | | sops.sem_op = 0; |
| | | sops.sem_flg = 0; |
| | | |
| | | while (semop(semId, &sops, 1) == -1) |
| | | while (semop(semid, &sops, 1) == -1) |
| | | if (errno != EINTR) { |
| | | // err_msg(errno, "SvsemUtil::zero"); |
| | | // err_msg(errno, "svsem_zero"); |
| | | return errno; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | int SvsemUtil::zero_nowait(int semId) { |
| | | int svsem_zero_nowait(int semid) { |
| | | struct sembuf sops; |
| | | |
| | | sops.sem_num = 0; |
| | | sops.sem_op = 0; |
| | | sops.sem_flg = IPC_NOWAIT; |
| | | |
| | | while (semop(semId, &sops, 1) == -1) |
| | | while (semop(semid, &sops, 1) == -1) |
| | | if (errno != EINTR) { |
| | | // err_msg(errno, "SvsemUtil::zero_nowait"); |
| | | // err_msg(errno, "svsem_zero_nowait"); |
| | | return errno; |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | int SvsemUtil::zero_timeout(const int semId, const struct timespec *timeout) { |
| | | int svsem_zero_timeout(const int semid, const struct timespec *timeout) { |
| | | struct sembuf sops; |
| | | |
| | | sops.sem_num = 0; |
| | | sops.sem_op = 0; |
| | | sops.sem_flg = 0; |
| | | |
| | | while (semtimedop(semId, &sops, 1, timeout) == -1) |
| | | while (semtimedop(semid, &sops, 1, timeout) == -1) |
| | | if (errno != EINTR) { |
| | | // err_msg(errno, "SvsemUtil::zero_timeout"); |
| | | // err_msg(errno, "svsem_zero_timeout"); |
| | | return errno; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | /* Release semaphore - increment it by 1 */ |
| | | int SvsemUtil::inc(int semId) { |
| | | struct sembuf sops; |
| | | |
| | | sops.sem_num = 0; |
| | | sops.sem_op = 1; |
| | | sops.sem_flg = 0; |
| | | |
| | | int rv = semop(semId, &sops, 1); |
| | | if (rv == -1) { |
| | | // err_msg(errno, "SvsemUtil::inc"); |
| | | return errno; |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | |
| | | int SvsemUtil::set(int semId, int val) { |
| | | int svsem_set(int semid, int val) { |
| | | union semun arg; |
| | | arg.val = val; |
| | | if (semctl(semId, 0, SETVAL, arg) == -1) { |
| | | err_msg(errno, "SvsemUtil::set"); |
| | | if (semctl(semid, 0, SETVAL, arg) == -1) { |
| | | err_msg(errno, "svsem_set"); |
| | | return errno; |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | |
| | | void svsem_remove(int semid) { |
| | | union semun dummy; |
| | | if (semctl(semid, 0, IPC_RMID, dummy) == -1) |
| | | err_msg(errno, "svsem_remove"); |
| | | } |
| | | |
| | | |
| | | int SvsemUtil::cond_wait(int semId ){ |
| | | |
| | | |
| | | |
| | | int svsem_cond_wait(int semid ){ |
| | | |
| | | struct sembuf sops[2]; |
| | | |
| | |
| | | sops[1].sem_op = -1; |
| | | sops[1].sem_flg = 0; |
| | | |
| | | while (semop(semId, sops, 2) == -1) |
| | | while (semop(semid, sops, 2) == -1) |
| | | if (errno != EINTR) { |
| | | // err_msg(errno, "SvsemUtil::dec"); |
| | | // err_msg(errno, "Svsvsem_dec"); |
| | | return errno; |
| | | } |
| | | |
| | |
| | | return 0; |
| | | } |
| | | |
| | | int SvsemUtil::cond_signal(int semId ){ |
| | | int svsem_cond_signal(int semid ){ |
| | | struct sembuf sops; |
| | | |
| | | // 通知等待cond的进程 |
| | |
| | | sops.sem_op = 1; |
| | | sops.sem_flg = 0; |
| | | |
| | | int rv = semop(semId, &sops, 1); |
| | | int rv = semop(semid, &sops, 1); |
| | | if (rv == -1) { |
| | | // err_msg(errno, "SvsemUtil::inc"); |
| | | // err_msg(errno, "Svsvsem_inc"); |
| | | return errno; |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | void SvsemUtil::remove(int semid) { |
| | | union semun dummy; |
| | | if (semctl(semid, 0, IPC_RMID, dummy) == -1) |
| | | err_msg(errno, "SvsemUtil::remove"); |
| | | } |
| | | |