From bae3a4fd9406635608edf0c0d16c52cf7ca06a66 Mon Sep 17 00:00:00 2001
From: fujuntang <fujuntang@smartai.com>
Date: 星期六, 23 十月 2021 15:20:57 +0800
Subject: [PATCH] Optimize the code source.

---
 src/msg_trigger/msg_mgr.h          |   54 ++++++++++
 src/net/net_mod_socket_wrapper.cpp |   10 ++
 src/net/net_mod_socket_wrapper.h   |    2 
 src/net/net_mod_socket.h           |    7 
 src/msg_trigger/msg_mgr.cpp        |  149 +++++++++++++++++++++++++++++
 src/socket/bus_server_socket.h     |    2 
 src/bh_api.cpp                     |   17 +--
 src/net/net_mod_socket.cpp         |   19 +++
 8 files changed, 244 insertions(+), 16 deletions(-)

diff --git a/src/bh_api.cpp b/src/bh_api.cpp
index 8b03231..37f8377 100644
--- a/src/bh_api.cpp
+++ b/src/bh_api.cpp
@@ -18,7 +18,6 @@
 
 static int gRun_stat = 0;
 static void *gNetmod_socket = NULL;
-static std::map<std::string, int> gRecvbuf;
 
 static pthread_mutex_t mutex;
 
@@ -1202,7 +1201,6 @@
   std::string str;
   std::string MsgID;
   int timeout_ms = 3000;
-  std::map<std::string, int>::iterator recvIter;
   char data_buf[MAX_STR_LEN] = { 0x00 };
   char buf_temp[MAX_STR_LEN] = { 0x00 };
   char *topics_buf = NULL;
@@ -1265,11 +1263,10 @@
 #endif 
  
   str = buf_temp;
-  recvIter = gRecvbuf.find(str);
-  if(recvIter != gRecvbuf.end()) {
+  val = net_mod_socket_buf_data_get(gNetmod_socket, str);
+  if(val > 0) {
     
     rv = 0;
-    val = recvIter->second;
 
   } else {
     rv = net_mod_socket_reg(gNetmod_socket, buf_temp, strlen(buf_temp), &buf, &size, timeout_ms, PROC_QUE_STCS);
@@ -1280,7 +1277,7 @@
       val = atoi((char *)data_buf);
       if (val > 0) {
         str = buf_temp;
-        gRecvbuf.insert({str, val});
+        net_mod_socket_buf_data_set(gNetmod_socket, str, val);
       }
 
       free(buf);
@@ -1381,7 +1378,6 @@
   net_mod_err_t *errarr;
   int errarr_size = 0;
   char *errString = NULL;
-  std::map<std::string, int>::iterator recvIter;
   char buf_temp[MAX_STR_LEN] = { 0x00 };
   char *topics_buf = NULL;
   
@@ -1450,11 +1446,10 @@
 #endif 
  
   str = buf_temp;
-  recvIter = gRecvbuf.find(str);
-  if(recvIter != gRecvbuf.end()) {
+  val = net_mod_socket_buf_data_get(gNetmod_socket, str);
+  if(val > 0) {
     
     rv = 0;
-    val = recvIter->second;
 
   } else {
     rv = net_mod_socket_reg(gNetmod_socket, buf_temp, strlen(buf_temp), &buf, &size, timeout_ms, PROC_QUE_STCS);
@@ -1465,7 +1460,7 @@
       val = atoi((char *)data_buf);
       if (val > 0) {
         str = buf_temp;
-        gRecvbuf.insert({str, val});
+        net_mod_socket_buf_data_set(gNetmod_socket, str, val);
       }
 
       free(buf);
diff --git a/src/msg_trigger/msg_mgr.cpp b/src/msg_trigger/msg_mgr.cpp
new file mode 100644
index 0000000..444cd41
--- /dev/null
+++ b/src/msg_trigger/msg_mgr.cpp
@@ -0,0 +1,149 @@
+#include "sem_util.h"
+#include "logger_factory.h"
+#include <sys/sem.h>
+#include <sys/shm.h>
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/msg.h>
+#include <errno.h>
+#include "msg_mgr.h"
+
+static Logger *logger = LoggerFactory::getLogger();
+
+static int sem_msg_id;
+static Msg_info gMsg_buf[MAX_LOCK];
+
+static int rsv_msg_id;
+
+int msg_init(void)
+{
+  key_t key = ftok(MSG_PATH, 0x01);
+  
+  memset(gMsg_buf, 0x00, sizeof(gMsg_buf));
+  sem_msg_id = msgget((key_t)key, 0666 | IPC_CREAT);
+  if(sem_msg_id < 0) {
+    logger->error("msgget failed with error: %d\n", sem_msg_id);
+
+    return -1;
+  }
+
+  key_t key_rsv = ftok(MSG_RSV_PATH, 0x02);
+  rsv_msg_id = msgget((key_t)key_rsv, 0666 | IPC_CREAT);                                                 
+  if(rsv_msg_id == -1) {                                                                                                  
+    logger->error("msgget failed with error: %d\n", rsv_msg_id);                                     
+                                                                                                     
+    return -1;                                                                                       
+  } 
+
+  return 0;
+
+}
+
+void msg_distrib(int msg_id, Msg_info *message)
+{
+  int ret;
+  Msg_info* msg_obj = message;
+
+  switch(msg_id)
+  {
+    case SEM_TYPE_ID:
+      msg_obj->mtype = MSG_TYPE_SEM;
+      ret = msgsnd(sem_msg_id, msg_obj, sizeof(Msg_info) - sizeof(long), IPC_NOWAIT);
+      if(ret < 0) {
+        logger->error("msg send fail: %d\n", ret);
+
+        return;
+
+      }
+      
+      break;
+
+    case RSV_TYPE_ID:
+      msg_obj->mtype = MSG_TYPE_RSV;
+      ret = msgsnd(rsv_msg_id, msg_obj, sizeof(Msg_info), 0);
+      if(ret < 0) {
+        logger->error("msg send fail: %d\n", ret);
+				
+        return;
+
+      }
+
+      break;
+
+  default:
+    logger->error("unknown msg type!\n");
+  
+  }
+
+}
+
+int get_msg_info(int Msgid, Msg_info *message)
+{
+  int ret = 0;
+  Msg_info msg_obj;
+  int msg_id;
+
+  if (Msgid == SEM_TYPE_ID) {
+    msg_id = sem_msg_id;
+  } else if (Msgid == RSV_TYPE_ID) {
+    msg_id = rsv_msg_id; 
+  }
+
+  ret = msgrcv(msg_id, (void*)&msg_obj, sizeof(Msg_info) - sizeof(long), MSG_TYPE_SEM, 0);
+  if(ret < 0) {
+
+    logger->error("msg recv fail: %d\n", ret);
+    
+    return -1;
+
+  }
+
+  switch(Msgid) {
+    case SEM_TYPE_ID:
+      msg_info_set(SEM_TYPE_ID, msg_obj);
+
+      break;
+
+    case RSV_TYPE_ID:
+      msg_info_set(SEM_TYPE_ID, msg_obj);
+
+      break;
+
+    default:
+      logger->error("unknown msg type!\n");
+
+  }
+
+  return 0;
+  
+}
+
+void msg_info_set(int index, Msg_info msg_obj)
+{
+  gMsg_buf[index].key = msg_obj.key;
+  gMsg_buf[index].id = msg_obj.id;
+    
+  if (msg_obj.act == SEM_POST) {
+    gMsg_buf[index].count++;
+  } else if (msg_obj.act == SEM_GET) {
+    gMsg_buf[index].count--; 
+  } else if (msg_obj.act == SEM_RESET) {
+    gMsg_buf[index].count = 0;
+  }
+
+}
+
+void *sem_msg_handler(void *skptr)
+{
+  int ret;
+  Msg_info msg_obj;
+
+  msg_init();
+  while(true) {
+    ret = get_msg_info(SEM_TYPE_ID, &msg_obj);
+    if (ret == 0) {
+      //process_msg(msg_obj);
+    }
+  }
+}
+
diff --git a/src/msg_trigger/msg_mgr.h b/src/msg_trigger/msg_mgr.h
new file mode 100644
index 0000000..809808b
--- /dev/null
+++ b/src/msg_trigger/msg_mgr.h
@@ -0,0 +1,54 @@
+#ifndef __MSG_MGR_DEF_
+#define __MSG_MGR_DEF_
+
+#ifdef __cplusplus
+extern "C" {
+#endif 
+
+#define SEM_TYPE_ID   0
+#define RSV_TYPE_ID   1
+
+#define MSG_TYPE_SEM  1
+#define MSG_TYPE_RSV  2
+
+#define SEM_CREATE    0
+#define SEM_GET       1
+#define SEM_POST      2
+#define SEM_RM        3
+#define SEM_RESET     4
+
+#define MSG_PATH      "/tmp/msgqueue"
+#define MSG_RSV_PATH  "/tmp/msgqueue_rsv"
+
+#define QUERY_MUTEX_KEY 0x8700
+
+#define MAX_LOCK      100
+#define MAX_LOCK_HOLD 10
+
+#define SEM_WT_TIMEOUT  60
+
+typedef struct _msg_info
+{
+  long mtype;
+  int key;
+  int id;
+  int act;
+  int count;
+
+} Msg_info;
+
+#ifdef __cplusplus
+}
+#endif
+
+int msg_init(void);
+void msg_distrib(int msg_id, Msg_info *message);
+int get_msg_info(int msg_id, Msg_info *message);
+void *sem_msg_handler(void *skptr);
+void msg_info_set(int index, Msg_info msg_obj);
+
+#endif  //end of file
+
+
+
+
diff --git a/src/net/net_mod_socket.cpp b/src/net/net_mod_socket.cpp
index b3aa9b0..c48c33b 100644
--- a/src/net/net_mod_socket.cpp
+++ b/src/net/net_mod_socket.cpp
@@ -341,6 +341,25 @@
      
 }
 
+void NetModSocket::buf_data_set(std::string str, int val) {
+  recvbuf.insert({str, val}); 
+}
+
+int NetModSocket::buf_data_get(std::string str) {
+  
+  int i;
+  int val = 0;
+  std::map<std::string, int>::iterator recvIter;
+
+  recvIter = recvbuf.find(str);
+  if(recvIter != recvbuf.end()) {
+    
+    val = recvIter->second;
+
+  }
+
+  return val;
+}
 
 void NetModSocket::free_recv_msg_arr(net_mod_recv_msg_t * arr, size_t size) {
 
diff --git a/src/net/net_mod_socket.h b/src/net/net_mod_socket.h
index 0cb2fd0..bef1783 100644
--- a/src/net/net_mod_socket.h
+++ b/src/net/net_mod_socket.h
@@ -73,6 +73,7 @@
   ShmModSocket shmModSocket;
   int int_val;
   int svr_val;
+  std::map<std::string, int> recvbuf; 
   // pthread_mutex_t sendMutex;
 
   // request header 缂栫爜涓虹綉缁滀紶杈撶殑瀛楄妭
@@ -180,9 +181,6 @@
   int sendandrecv_timeout( const void *send_buf, const int send_size, const int send_key, void **recv_buf, int *recv_size, int sec, int nsec) ;
   int sendandrecv_nowait( const void *send_buf, const int send_size, const int send_key, void **recv_buf, int *recv_size) ;
 
-
-  
-
   /**
    * recvandsend
    */
@@ -250,7 +248,8 @@
    */
   static void free_recv_msg_arr(net_mod_recv_msg_t * arr, size_t size);
  
-
+  void buf_data_set(std::string str, int val);
+  int buf_data_get(std::string str);
 };
  
 #endif
\ No newline at end of file
diff --git a/src/net/net_mod_socket_wrapper.cpp b/src/net/net_mod_socket_wrapper.cpp
index 479b0d4..038e8cf 100644
--- a/src/net/net_mod_socket_wrapper.cpp
+++ b/src/net/net_mod_socket_wrapper.cpp
@@ -123,6 +123,16 @@
   return sockt->svr_get();
 }
 
+void net_mod_socket_buf_data_set(void * _socket, std::string str, int val) {
+  NetModSocket *sockt = (NetModSocket *)_socket;
+  sockt->buf_data_set(str, val);
+}
+
+int net_mod_socket_buf_data_get(void * _socket, std::string str) {
+  NetModSocket *sockt = (NetModSocket *)_socket;
+  return sockt->buf_data_get(str);
+}
+
 /**
  * 濡傛灉寤虹珛杩炴帴鐨勮妭鐐规病鏈夋帴鍙楀埌娑堟伅绛夊緟timeout鐨勬椂闂村悗杩斿洖
  * @timeout 绛夊緟鏃堕棿锛屽崟浣嶆槸鍗冨垎涔嬩竴绉�
diff --git a/src/net/net_mod_socket_wrapper.h b/src/net/net_mod_socket_wrapper.h
index d68a23e..c9ac313 100644
--- a/src/net/net_mod_socket_wrapper.h
+++ b/src/net/net_mod_socket_wrapper.h
@@ -132,6 +132,8 @@
 void net_mod_socket_svr_set(void * _socket, int data);
 int net_mod_socket_int_get(void * _socket);
 int net_mod_socket_svr_get(void * _socket);
+void net_mod_socket_buf_data_set(void * _socket, std::string str, int val);
+int net_mod_socket_buf_data_get(void * _socket, std::string str);
 
 /**
  * @brief 璺ㄦ満鍣ㄥ彂閫佹秷鎭苟鎺ュ彈杩斿洖鐨勫簲绛旀秷鎭紝鐩村埌鍙戦�佸畬鎴愭墠杩斿洖
diff --git a/src/socket/bus_server_socket.h b/src/socket/bus_server_socket.h
index ec0e42f..7b94ba1 100644
--- a/src/socket/bus_server_socket.h
+++ b/src/socket/bus_server_socket.h
@@ -23,7 +23,7 @@
   int data;
   int data_fix;
   int count;
-    
+ 
   _LinkNode *next; 
 } LinkNode;
 

--
Gitblit v1.8.0