From d5da31067c3b602729047d4cf8f48b6580187869 Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期四, 21 一月 2021 18:09:36 +0800 Subject: [PATCH] update --- src/svsem.cpp | 121 +++++++++++++++++++++------------------- 1 files changed, 63 insertions(+), 58 deletions(-) diff --git a/src/svsem_util.cpp b/src/svsem.cpp similarity index 66% rename from src/svsem_util.cpp rename to src/svsem.cpp index 6a8ba2b..54db4a2 100644 --- a/src/svsem_util.cpp +++ b/src/svsem.cpp @@ -1,12 +1,12 @@ -#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; @@ -14,8 +14,8 @@ //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()); @@ -23,7 +23,7 @@ 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"); @@ -40,7 +40,7 @@ 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"); @@ -69,51 +69,68 @@ 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; } @@ -123,17 +140,17 @@ * 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; } @@ -141,32 +158,32 @@ } -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; } @@ -174,37 +191,30 @@ } -/* 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]; @@ -218,9 +228,9 @@ 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; } @@ -230,7 +240,7 @@ return 0; } -int SvsemUtil::cond_signal(int semId ){ +int svsem_cond_signal(int semid ){ struct sembuf sops; // 閫氱煡绛夊緟cond鐨勮繘绋� @@ -238,16 +248,11 @@ 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"); -} + \ No newline at end of file -- Gitblit v1.8.0