From 653f2ac59c0c25463e531a128563c295843bc4c1 Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期三, 27 一月 2021 13:56:24 +0800
Subject: [PATCH] update
---
src/svsem.cpp | 133 ++++++++++++++++++++++++--------------------
1 files changed, 72 insertions(+), 61 deletions(-)
diff --git a/src/svsem.cpp b/src/svsem.cpp
index 54db4a2..27c88a8 100644
--- a/src/svsem.cpp
+++ b/src/svsem.cpp
@@ -6,7 +6,7 @@
perms = S_IRUSR | S_IWUSR;
- semid = semget(key, 1, IPC_CREAT | IPC_EXCL | perms);
+ semid = semget(key, 2, IPC_CREAT | IPC_EXCL | perms);
if (semid != -1) { /* Successfully created the semaphore */
union semun arg;
@@ -17,6 +17,10 @@
arg.val = 0; /* So initialize it to 0 */
if (semctl(semid, 0, SETVAL, arg) == -1)
err_exit(errno, "semctl 1");
+
+ arg.val = 1;
+ if (semctl(semid, 1, SETVAL, arg) == -1)
+ err_exit(errno, "semctl 2");
//logger.info("%ld: initialized semaphore\n", (long)getpid());
/* Perform a "no-op" semaphore operation - changes sem_otime
@@ -79,7 +83,7 @@
while (semop(semid, &sops, 1) == -1)
if (errno != EINTR) {
// err_msg(errno, "svsem_dec");
- return errno;
+ return -1;
}
return 0;
@@ -91,14 +95,9 @@
sops.sem_num = 0;
sops.sem_op = -1;
sops.sem_flg = IPC_NOWAIT | 0;
+
- while (semop(semid, &sops, 1) == -1)
- if (errno != EINTR) {
- // err_msg(errno, "svsem_dec_nowait");
- return errno;
- }
-
- return 0;
+ return semop(semid, &sops, 1) ;
}
int svsem_timedwait(const int semid, const struct timespec *timeout) {
@@ -111,7 +110,7 @@
while (semtimedop(semid, &sops, 1, timeout) == -1)
if (errno != EINTR) {
// err_msg(errno, "svsem_psem_timedwait");
- return errno;
+ return -1;
}
return 0;
@@ -129,7 +128,64 @@
int rv = semop(semid, &sops, 1);
if (rv == -1) {
// err_msg(errno, "svsem_inc");
- return errno;
+ return -1;
+ }
+ return 0;
+}
+
+
+
+
+int svsem_cond_wait(int semid ){
+
+ struct sembuf sops[2];
+ union semun arg;
+
+ arg.val = 1;
+ if (semctl(semid, 1, SETVAL, arg) == -1) {
+ err_msg(errno, "svsem_set");
+ return -1;
+ }
+
+ //閲婃斁mutex
+ sops[0].sem_num = 0;
+ sops[0].sem_op = 1;
+ sops[0].sem_flg = 0;
+
+ // 绛夊緟cond
+ sops[1].sem_num = 1;
+ sops[1].sem_op = 0;
+ sops[1].sem_flg = 0;
+
+ while (semop(semid, sops, 2) == -1)
+ if (errno != EINTR) {
+ // err_msg(errno, "Svsvsem_dec");
+ return -1;
+ }
+
+
+ //閲嶆柊鑾峰彇mutex
+ sops[0].sem_num = 0;
+ sops[0].sem_op = -1;
+ sops[0].sem_flg = 0;
+
+ while (semop(semid, sops, 1) == -1)
+ if (errno != EINTR) {
+ // err_msg(errno, "Svsvsem_dec");
+ return -1;
+ }
+
+ return 0;
+}
+
+
+int svsem_cond_signal(int semid ){
+ union semun arg;
+ arg.val = 0;
+
+ if (semctl(semid, 1, SETVAL, arg) == -1) {
+ err_msg(errno, "svsem_set");
+ return -1;
}
return 0;
}
@@ -151,7 +207,7 @@
while (semop(semid, &sops, 1) == -1)
if (errno != EINTR) {
// err_msg(errno, "svsem_zero");
- return errno;
+ return -1;
}
return 0;
@@ -168,7 +224,7 @@
while (semop(semid, &sops, 1) == -1)
if (errno != EINTR) {
// err_msg(errno, "svsem_zero_nowait");
- return errno;
+ return -1;
}
return 0;
@@ -184,7 +240,7 @@
while (semtimedop(semid, &sops, 1, timeout) == -1)
if (errno != EINTR) {
// err_msg(errno, "svsem_zero_timeout");
- return errno;
+ return -1;
}
return 0;
@@ -196,11 +252,8 @@
int svsem_set(int semid, int val) {
union semun arg;
arg.val = val;
- if (semctl(semid, 0, SETVAL, arg) == -1) {
- err_msg(errno, "svsem_set");
- return errno;
- }
- return 0;
+
+ return semctl(semid, 0, SETVAL, arg);
}
@@ -213,46 +266,4 @@
-
-int svsem_cond_wait(int semid ){
-
- struct sembuf sops[2];
-
- //閲婃斁mutex
- sops[0].sem_num = 0;
- sops[0].sem_op = 1;
- sops[0].sem_flg = 0;
-
- // 绛夊緟cond
- sops[1].sem_num = 1;
- sops[1].sem_op = -1;
- sops[1].sem_flg = 0;
-
- while (semop(semid, sops, 2) == -1)
- if (errno != EINTR) {
- // err_msg(errno, "Svsvsem_dec");
- return errno;
- }
-
-
-
-
- return 0;
-}
-
-int svsem_cond_signal(int semid ){
- struct sembuf sops;
-
- // 閫氱煡绛夊緟cond鐨勮繘绋�
- sops.sem_num = 1;
- sops.sem_op = 1;
- sops.sem_flg = 0;
-
- int rv = semop(semid, &sops, 1);
- if (rv == -1) {
- // err_msg(errno, "Svsvsem_inc");
- return errno;
- }
- return 0;
-}
\ No newline at end of file
--
Gitblit v1.8.0