From 27d8bc7cad4a8f68c2da3efbb77f45ec70ae40e6 Mon Sep 17 00:00:00 2001
From: liuxiaolong <liuxiaolong@aiotlink.com>
Date: 星期三, 05 一月 2022 14:11:39 +0800
Subject: [PATCH] pb.go MsgQueryProcReply add subLocalTopics and subNetTopics

---
 src/svsem.cpp |  142 +++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 117 insertions(+), 25 deletions(-)

diff --git a/src/svsem.cpp b/src/svsem.cpp
index 26bde2c..8ad2401 100644
--- a/src/svsem.cpp
+++ b/src/svsem.cpp
@@ -1,16 +1,17 @@
+#include "bh_api.h"
 #include "svsem.h"
+#include "msg_mgr.h"
 
 int svsem_get(key_t key, unsigned int value) {
   int semid, perms;
 
-  perms = S_IRUSR | S_IWUSR;
+  perms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
 
   semid = semget(key, 2, IPC_CREAT | IPC_EXCL | perms);
 
   if (semid != -1) { /* Successfully created the semaphore */
     union semun arg;
     struct sembuf sop;
-
 
     arg.val = 0; /* So initialize it to 0 */
     if (semctl(semid, 0, SETVAL, arg) == -1)
@@ -25,7 +26,7 @@
 
     sop.sem_num = 0; /* Operate on semaphore 0 */
     sop.sem_op = value;
-    sop.sem_flg = 0;
+    sop.sem_flg = SEM_UNDO;
     if (semop(semid, &sop, 1) == -1)
       err_exit(errno, "semop");
 
@@ -72,7 +73,7 @@
 
   sops.sem_num = 0;
   sops.sem_op = -1;
-  sops.sem_flg = 0;
+  sops.sem_flg = SEM_UNDO;
 
   while (semop(semid, &sops, 1) == -1)
     if (errno != EINTR) {
@@ -80,6 +81,15 @@
       
       return -1;
     }
+
+#if defined(MSG_HANDLER)
+  Msg_info msg_obj;
+
+  msg_obj.key = inter_key_get();
+  msg_obj.id = semid;
+  msg_obj.act = SEM_GET;
+  msg_distrib(SEM_TYPE_ID, &msg_obj);
+#endif 
 
   return 0;
 }
@@ -89,18 +99,26 @@
 
   sops.sem_num = 0;
   sops.sem_op = -1;
-  sops.sem_flg = IPC_NOWAIT | 0;
+  sops.sem_flg = IPC_NOWAIT | SEM_UNDO;
  
+#if defined(MSG_HANDLER)
+  Msg_info msg_obj;
+
+  msg_obj.key = inter_key_get();
+  msg_obj.id = semid;
+  msg_obj.act = SEM_GET;
+  msg_distrib(SEM_TYPE_ID, &msg_obj);
+#endif 
 
   return semop(semid, &sops, 1) ;
 }
 
-int svsem_timedwait(const int semid, const struct timespec *timeout) {
+int svsem_timedwait(int semid, struct timespec *timeout) {
   struct sembuf sops;
 
   sops.sem_num = 0;
   sops.sem_op = -1;
-  sops.sem_flg = 0;
+  sops.sem_flg = SEM_UNDO;
 
   while (semtimedop(semid, &sops, 1, timeout) == -1)
     if (errno != EINTR) {
@@ -108,9 +126,39 @@
       return -1;
     }
 
+#if defined(MSG_HANDLER)
+  Msg_info msg_obj;
+
+  msg_obj.key = inter_key_get();
+  msg_obj.id = semid;
+  msg_obj.act = SEM_GET;
+  msg_distrib(SEM_TYPE_ID, &msg_obj);
+#endif 
+
   return 0;
 }
 
+int svsem_uni_wait(int semid) {
+  struct timespec res;
+
+  res.tv_sec = SEM_WT_TIMEOUT;
+  res.tv_nsec = 0;
+  
+  while(1) {
+    if(svsem_timedwait(semid, &res) != 0) {
+
+      if(svsem_post(semid) != 0) {
+        err_msg(errno, "_inc");
+      }
+
+    } else {
+
+      break;
+    }
+  }
+
+  return 0;
+}
 
 /* Release semaphore - increment it by 1 */
 int svsem_post(int semid) {
@@ -118,18 +166,25 @@
 
   sops.sem_num = 0;
   sops.sem_op = 1;
-  sops.sem_flg = 0;
+  sops.sem_flg = SEM_UNDO;
 
   int rv = semop(semid, &sops, 1);
   if (rv == -1) {
     // err_msg(errno, "svsem_inc");
     return -1;
   }
+
+#if defined(MSG_HANDLER)
+  Msg_info msg_obj;
+
+  msg_obj.key = inter_key_get();
+  msg_obj.id = semid;
+  msg_obj.act = SEM_POST;
+  msg_distrib(SEM_TYPE_ID, &msg_obj);
+#endif 
+
   return 0;
 }
-
-
-
 
 int svsem_cond_wait(int semid ){
 
@@ -145,12 +200,12 @@
   //閲婃斁mutex
   sops[0].sem_num = 0;
   sops[0].sem_op = 1;
-  sops[0].sem_flg = 0;
+  sops[0].sem_flg = SEM_UNDO;
 
   // 绛夊緟cond
   sops[1].sem_num = 1;
   sops[1].sem_op = 0;
-  sops[1].sem_flg = 0;
+  sops[1].sem_flg = SEM_UNDO;
 
   while (semop(semid, sops, 2) == -1)
     if (errno != EINTR) {
@@ -162,13 +217,22 @@
    //閲嶆柊鑾峰彇mutex
   sops[0].sem_num = 0;
   sops[0].sem_op = -1;
-  sops[0].sem_flg = 0;
+  sops[0].sem_flg = SEM_UNDO;
 
   while (semop(semid, sops, 1) == -1)
     if (errno != EINTR) {
       // err_msg(errno, "Svsvsem_dec");
       return -1;
     }
+
+#if defined(MSG_HANDLER)
+  Msg_info msg_obj;
+
+  msg_obj.key = inter_key_get();
+  msg_obj.id = semid;
+  msg_obj.act = SEM_GET;
+  msg_distrib(SEM_TYPE_ID, &msg_obj);
+#endif 
 
   return 0;
 }
@@ -197,13 +261,22 @@
 
   sops.sem_num = 0;
   sops.sem_op = 0;
-  sops.sem_flg = 0;
+  sops.sem_flg = SEM_UNDO;
 
   while (semop(semid, &sops, 1) == -1)
     if (errno != EINTR) {
       // err_msg(errno, "svsem_zero");
       return -1;
     }
+
+#if defined(MSG_HANDLER)
+  Msg_info msg_obj;
+
+  msg_obj.key = inter_key_get();
+  msg_obj.id = semid;
+  msg_obj.act = SEM_RESET;
+  msg_distrib(SEM_TYPE_ID, &msg_obj);
+#endif 
 
   return 0;
 }
@@ -214,7 +287,7 @@
 
   sops.sem_num = 0;
   sops.sem_op = 0;
-  sops.sem_flg = IPC_NOWAIT;
+  sops.sem_flg = IPC_NOWAIT | SEM_UNDO;
 
   while (semop(semid, &sops, 1) == -1)
     if (errno != EINTR) {
@@ -222,15 +295,23 @@
       return -1;
     }
 
+#if defined(MSG_HANDLER)
+  Msg_info msg_obj;
+  msg_obj.key = inter_key_get();
+  msg_obj.id = semid;
+  msg_obj.act = SEM_RESET;
+  msg_distrib(SEM_TYPE_ID, &msg_obj);
+#endif 
+
   return 0;
 }
 
-int svsem_zero_timeout(const int semid, const struct timespec *timeout) {
+int svsem_zero_timeout(int semid, struct timespec *timeout) {
   struct sembuf sops;
 
   sops.sem_num = 0;
   sops.sem_op = 0;
-  sops.sem_flg = 0;
+  sops.sem_flg = SEM_UNDO;
 
   while (semtimedop(semid, &sops, 1, timeout) == -1)
     if (errno != EINTR) {
@@ -238,11 +319,16 @@
       return -1;
     }
 
+#if defined(MSG_HANDLER)
+  Msg_info msg_obj;
+  msg_obj.key = inter_key_get();
+  msg_obj.id = semid;
+  msg_obj.act = SEM_RESET;
+  msg_distrib(SEM_TYPE_ID, &msg_obj);
+#endif 
+
   return 0;
 }
-
-
-
 
 int svsem_set(int semid, int val) {
   union semun arg;
@@ -251,14 +337,20 @@
   return semctl(semid, 0, SETVAL, arg);
 }
 
-
 void svsem_remove(int semid) {
   union semun dummy;
+
   if (semctl(semid, 0, IPC_RMID, dummy) == -1)
     err_msg(errno, "svsem_remove");
+
+#if defined(MSG_HANDLER)
+  Msg_info msg_obj;
+  msg_obj.key = inter_key_get();
+  msg_obj.id = semid;
+  msg_obj.act = SEM_RM;
+  msg_distrib(SEM_TYPE_ID, &msg_obj);
+#endif 
+
 }
-
-
-
 
  

--
Gitblit v1.8.0