From f52f2c2828047c2f30d30fc1fe2b54d8db146d49 Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期四, 25 二月 2021 15:56:35 +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