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