From f0e3d861fb7d3f75df609294a2499f35aea2a2eb Mon Sep 17 00:00:00 2001 From: azw Date: Mon, 17 Apr 2023 02:56:00 +0000 Subject: [PATCH] 1 --- server/wsproxy/app.cc | 50 +++++++++++++++++++++++++++++++++++++++++++ server/wsproxy/app.h | 17 ++++++++++++++- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/server/wsproxy/app.cc b/server/wsproxy/app.cc index 61a785f..187cc34 100644 --- a/server/wsproxy/app.cc +++ b/server/wsproxy/app.cc @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -39,6 +40,12 @@ struct MsgNode MsgNode* next; }; +struct UdpMsgNode +{ + a8::UdpPacket* pkt; + UdpMsgNode* next; +}; + const char* const PROJ_LOG_ROOT_FMT = "/data/logs/%s/logs"; const char* const PROJ_LOG_FILENAME_FMT = "log_$pid_%Y%m%d.log"; @@ -101,6 +108,7 @@ bool App::Init(int argc, char* argv[]) loop_mutex_ = new std::mutex(); loop_cond_ = new std::condition_variable(); msg_mutex_ = new std::mutex(); + udp_msg_mutex_ = new std::mutex(); srand(time(nullptr)); InitLog(); @@ -176,8 +184,11 @@ void App::UnInit() UnInitLog(); FreeSocketMsgQueue(); + FreeUdpMsgQueue(); delete msg_mutex_; msg_mutex_ = nullptr; + delete udp_msg_mutex_; + udp_msg_mutex_ = nullptr; delete loop_cond_; loop_cond_ = nullptr; delete loop_mutex_; @@ -508,3 +519,42 @@ void App::FreeSocketMsgQueue() } msg_mutex_->unlock(); } + +void App::FreeUdpMsgQueue() +{ + udp_msg_mutex_->lock(); + if (!udp_work_node_) { + udp_work_node_ = udp_top_node_; + udp_top_node_ = nullptr; + udp_bot_node_ = nullptr; + } + while (udp_work_node_) { + UdpMsgNode* pdelnode = udp_work_node_; + delete pdelnode->pkt; + udp_work_node_ = udp_work_node_->next; + if (!udp_work_node_) { + udp_work_node_ = udp_top_node_; + udp_top_node_ = nullptr; + udp_bot_node_ = nullptr; + } + } + udp_msg_mutex_->unlock(); +} + +void App::AddUdpMsg(a8::UdpPacket* pkt) +{ + UdpMsgNode *p = (UdpMsgNode*) malloc(sizeof(UdpMsgNode)); + memset(p, 0, sizeof(UdpMsgNode)); + p->pkt = pkt; + udp_msg_mutex_->lock(); + if (udp_bot_node_) { + udp_bot_node_->next = p; + udp_bot_node_ = p; + } else { + udp_top_node_ = p; + udp_bot_node_ = p; + } + ++udp_msgnode_size_; + udp_msg_mutex_->unlock(); + NotifyLoopCond(); +} diff --git a/server/wsproxy/app.h b/server/wsproxy/app.h index 4e4be9f..e1d1c8a 100644 --- a/server/wsproxy/app.h +++ b/server/wsproxy/app.h @@ -3,7 +3,13 @@ #include #include +namespace a8 +{ + struct UdpPacket; +} + struct MsgNode; +struct UdpMsgNode; class App : public a8::Singleton { private: @@ -25,6 +31,8 @@ class App : public a8::Singleton const char *msgbody, int bodylen); + void AddUdpMsg(a8::UdpPacket* pkt); + void NotifyLoopCond(); bool HasFlag(int flag); @@ -45,6 +53,7 @@ private: bool ParseOpt(); void FreeSocketMsgQueue(); + void FreeUdpMsgQueue(); public: int argc = 0; @@ -63,13 +72,19 @@ public: std::mutex *loop_mutex_ = nullptr; std::condition_variable *loop_cond_ = nullptr; - std::mutex *msg_mutex_ = nullptr; + std::mutex* msg_mutex_ = nullptr; MsgNode* top_node_ = nullptr; MsgNode* bot_node_ = nullptr; MsgNode* work_node_ = nullptr; + std::mutex* udp_msg_mutex_ = nullptr; + UdpMsgNode* udp_top_node_ = nullptr; + UdpMsgNode* udp_bot_node_ = nullptr; + UdpMsgNode* udp_work_node_ = nullptr; + public: int msgnode_size_ = 0 ; + int udp_msgnode_size_ = 0 ; int working_msgnode_size_ = 0; };