This commit is contained in:
azw 2023-04-17 02:56:00 +00:00
parent e4dc35c2af
commit f0e3d861fb
2 changed files with 66 additions and 1 deletions

View File

@ -8,6 +8,7 @@
#include <a8/xtimer.h> #include <a8/xtimer.h>
#include <a8/uuid.h> #include <a8/uuid.h>
#include <a8/udplistener.h>
#include <f8/netmsghandler.h> #include <f8/netmsghandler.h>
#include <f8/udplog.h> #include <f8/udplog.h>
@ -39,6 +40,12 @@ struct MsgNode
MsgNode* next; 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_ROOT_FMT = "/data/logs/%s/logs";
const char* const PROJ_LOG_FILENAME_FMT = "log_$pid_%Y%m%d.log"; 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_mutex_ = new std::mutex();
loop_cond_ = new std::condition_variable(); loop_cond_ = new std::condition_variable();
msg_mutex_ = new std::mutex(); msg_mutex_ = new std::mutex();
udp_msg_mutex_ = new std::mutex();
srand(time(nullptr)); srand(time(nullptr));
InitLog(); InitLog();
@ -176,8 +184,11 @@ void App::UnInit()
UnInitLog(); UnInitLog();
FreeSocketMsgQueue(); FreeSocketMsgQueue();
FreeUdpMsgQueue();
delete msg_mutex_; delete msg_mutex_;
msg_mutex_ = nullptr; msg_mutex_ = nullptr;
delete udp_msg_mutex_;
udp_msg_mutex_ = nullptr;
delete loop_cond_; delete loop_cond_;
loop_cond_ = nullptr; loop_cond_ = nullptr;
delete loop_mutex_; delete loop_mutex_;
@ -508,3 +519,42 @@ void App::FreeSocketMsgQueue()
} }
msg_mutex_->unlock(); 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();
}

View File

@ -3,7 +3,13 @@
#include <a8/uuid.h> #include <a8/uuid.h>
#include <a8/singleton.h> #include <a8/singleton.h>
namespace a8
{
struct UdpPacket;
}
struct MsgNode; struct MsgNode;
struct UdpMsgNode;
class App : public a8::Singleton<App> class App : public a8::Singleton<App>
{ {
private: private:
@ -25,6 +31,8 @@ class App : public a8::Singleton<App>
const char *msgbody, const char *msgbody,
int bodylen); int bodylen);
void AddUdpMsg(a8::UdpPacket* pkt);
void NotifyLoopCond(); void NotifyLoopCond();
bool HasFlag(int flag); bool HasFlag(int flag);
@ -45,6 +53,7 @@ private:
bool ParseOpt(); bool ParseOpt();
void FreeSocketMsgQueue(); void FreeSocketMsgQueue();
void FreeUdpMsgQueue();
public: public:
int argc = 0; int argc = 0;
@ -63,13 +72,19 @@ public:
std::mutex *loop_mutex_ = nullptr; std::mutex *loop_mutex_ = nullptr;
std::condition_variable *loop_cond_ = nullptr; std::condition_variable *loop_cond_ = nullptr;
std::mutex *msg_mutex_ = nullptr; std::mutex* msg_mutex_ = nullptr;
MsgNode* top_node_ = nullptr; MsgNode* top_node_ = nullptr;
MsgNode* bot_node_ = nullptr; MsgNode* bot_node_ = nullptr;
MsgNode* work_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: public:
int msgnode_size_ = 0 ; int msgnode_size_ = 0 ;
int udp_msgnode_size_ = 0 ;
int working_msgnode_size_ = 0; int working_msgnode_size_ = 0;
}; };