diff --git a/server/wsproxy/CMakeLists.txt b/server/wsproxy/CMakeLists.txt index bf8ac61..77ac129 100644 --- a/server/wsproxy/CMakeLists.txt +++ b/server/wsproxy/CMakeLists.txt @@ -18,7 +18,7 @@ endif() set(CMAKE_BUILD_TYPE "Debug") set(CMAKE_CXX_FLAGS_RELEASE "-std=gnu++11 -fsanitize=address -fno-omit-frame-pointer") set(CMAKE_CXX_FLAGS_DEBUG "-Wall -g -std=gnu++11") -set(CMAKE_CXX_FLAGS_DEBUG "-Wall -g -std=gnu++11 -DGAME_ID=${GAME_ID} -DMASTER_MODE=${MASTER_MODE}") +set(CMAKE_CXX_FLAGS_DEBUG "-Wall -g -std=gnu++11 -DGAME_ID=${GAME_ID} -DMASTER_MODE=${MASTER_MODE} -DA8_TCP_SESSION2=1") include_directories( AFTER diff --git a/server/wsproxy/app.cc b/server/wsproxy/app.cc index 3725190..9f81651 100644 --- a/server/wsproxy/app.cc +++ b/server/wsproxy/app.cc @@ -71,7 +71,7 @@ static void SavePerfLog() #endif } -void App::Init(int argc, char* argv[]) +bool App::Init(int argc, char* argv[]) { signal(SIGPIPE, SIG_IGN); this->argc = argc; @@ -79,10 +79,10 @@ void App::Init(int argc, char* argv[]) if (!ParseOpt()) { terminated = true; - a8::XPrintf("masterserver启动失败,缺少-i参数\n", {}); - return; + a8::XPrintf("wsproxy启动失败,缺少-i参数\n", {}); + return false; } - a8::XPrintf("masterserver starting instance_id:%d pid:%d\n", {instance_id, getpid()}); + a8::XPrintf("wsproxy starting instance_id:%d pid:%d\n", {instance_id, getpid()}); loop_mutex_ = new std::mutex(); loop_cond_ = new std::condition_variable(); @@ -100,7 +100,7 @@ void App::Init(int argc, char* argv[]) MasterSvrMgr::Instance()->Init(); TargetConnMgr::Instance()->Init(); - a8::UdpLog::Instance()->Info("masterserver starting instance_id:%d pid:%d", {instance_id, getpid()}); + a8::UdpLog::Instance()->Info("wsproxy starting instance_id:%d pid:%d", {instance_id, getpid()}); { int perf_log_time = 1000 * 60 * 5; if (getenv("is_dev_env")) { @@ -113,13 +113,23 @@ void App::Init(int argc, char* argv[]) SavePerfLog(); }); } + if (HasFlag(1)) { + a8::Timer::Instance()->AddDeadLineTimer( + 1000 * 10, + a8::XParams(), + [] (const a8::XParams& param) + { + App::Instance()->terminated = true; + App::Instance()->NotifyLoopCond(); + } + ); + } + return true; } void App::UnInit() { - if (terminated) { - return; - } + a8::XPrintf("wsproxy terminating instance_id:%d pid:%d\n", {instance_id, getpid()}); MasterSvrMgr::Instance()->UnInit(); TargetConnMgr::Instance()->UnInit(); GameClientMgr::Instance()->UnInit(); @@ -129,6 +139,8 @@ void App::UnInit() HandlerMgr::Instance()->UnInit(); UnInitLog(); + FreeSocketMsgQueue(); + FreeIMMsgQueue(); delete im_msg_mutex_; im_msg_mutex_ = nullptr; delete msg_mutex_; @@ -137,15 +149,13 @@ void App::UnInit() loop_cond_ = nullptr; delete loop_mutex_; loop_mutex_ = nullptr; + a8::XPrintf("wsproxy terminated instance_id:%d pid:%d\n", {instance_id, getpid()}); } int App::Run() { - if (terminated) { - return 0; - } int ret = 0; - a8::UdpLog::Instance()->Info("masterserver running", {}); + a8::UdpLog::Instance()->Info("wsproxy running", {}); while (!terminated) { a8::tick_t begin_tick = a8::XGetTickCount(); QuickExecute(); @@ -476,13 +486,22 @@ void App::UnInitLog() bool App::ParseOpt() { int ch = 0; - while ((ch = getopt(argc, argv, "i:")) != -1) { + while ((ch = getopt(argc, argv, "i:f:")) != -1) { switch (ch) { case 'i': { instance_id = a8::XValue(optarg); } break; + case 'f': + { + std::vector strings; + a8::Split(optarg, strings, ','); + for (auto& str : strings) { + flags.insert(a8::XValue(str).GetInt()); + } + } + break; } } return instance_id > 0; @@ -504,3 +523,58 @@ a8::XParams* App::GetContext(long long context_id) auto itr = context_hash_.find(context_id); return itr != context_hash_.end() ? &(itr->second) : nullptr; } + +bool App::HasFlag(int flag) +{ + return flags.find(flag) != flags.end(); +} + +void App::FreeSocketMsgQueue() +{ + msg_mutex_->lock(); + if (!work_node_) { + work_node_ = top_node_; + top_node_ = nullptr; + bot_node_ = nullptr; + } + while (work_node_) { + MsgNode* pdelnode = work_node_; + work_node_ = work_node_->next; + if (pdelnode->buf) { + free(pdelnode->buf); + } + free(pdelnode); + if (!work_node_) { + work_node_ = top_node_; + top_node_ = nullptr; + bot_node_ = nullptr; + } + } + msg_mutex_->unlock(); +} + +void App::FreeIMMsgQueue() +{ + im_msg_mutex_->lock(); + if (!im_work_node_) { + im_work_node_ = im_top_node_; + im_top_node_ = nullptr; + im_bot_node_ = nullptr; + } + while (im_work_node_) { + IMMsgNode* pdelnode = im_work_node_; + im_work_node_ = im_work_node_->next; + if (pdelnode->msgid == f8::IM_SysMsgQueue) { + a8::XParams* param = (a8::XParams*)pdelnode->params.param1.GetUserData(); + delete param; + } + delete pdelnode; + if (!im_work_node_) { + im_work_node_ = im_top_node_; + im_top_node_ = nullptr; + im_bot_node_ = nullptr; + } + } + im_msg_mutex_->unlock(); +} + diff --git a/server/wsproxy/app.h b/server/wsproxy/app.h index 8fdb272..1b3df90 100644 --- a/server/wsproxy/app.h +++ b/server/wsproxy/app.h @@ -12,7 +12,7 @@ class App : public a8::Singleton public: - void Init(int argc, char* argv[]); + bool Init(int argc, char* argv[]); void UnInit(); int Run(); @@ -31,6 +31,7 @@ class App : public a8::Singleton a8::XParams* AddContext(long long context_id); void DelContext(long long context_id); a8::XParams* GetContext(long long context_id); + bool HasFlag(int flag); private: void QuickExecute(); @@ -49,11 +50,14 @@ private: void UnInitLog(); bool ParseOpt(); + void FreeSocketMsgQueue(); + void FreeIMMsgQueue(); public: int argc = 0; char** argv = nullptr; volatile bool terminated = false; + std::set flags; PerfMonitor perf; a8::uuid::SnowFlake uuid; diff --git a/server/wsproxy/gameclientmgr.cc b/server/wsproxy/gameclientmgr.cc index a94a2a8..34eb8be 100644 --- a/server/wsproxy/gameclientmgr.cc +++ b/server/wsproxy/gameclientmgr.cc @@ -14,6 +14,10 @@ void GameClientMgr::Init() void GameClientMgr::UnInit() { + for (auto& pair : socket_hash_) { + delete pair.second; + } + socket_hash_.clear(); } void GameClientMgr::OnClientDisconnect(a8::XParams& param) diff --git a/server/wsproxy/main.cc b/server/wsproxy/main.cc index 7dffbf1..3ca4bad 100644 --- a/server/wsproxy/main.cc +++ b/server/wsproxy/main.cc @@ -4,8 +4,9 @@ int main(int argc, char* argv[]) { int exitcode = 0; - App::Instance()->Init(argc, argv); - exitcode = App::Instance()->Run(); - App::Instance()->UnInit(); + if (App::Instance()->Init(argc, argv)) { + exitcode = App::Instance()->Run(); + App::Instance()->UnInit(); + } return exitcode; } diff --git a/server/wsproxy/target_conn.cc b/server/wsproxy/target_conn.cc index 3d6a2b0..e5c1ea4 100644 --- a/server/wsproxy/target_conn.cc +++ b/server/wsproxy/target_conn.cc @@ -94,6 +94,7 @@ void TargetConn::SendStockMsg() void TargetConn::ForwardClientMsg(f8::MsgHdr& hdr) { char* buff = (char*)malloc(sizeof(f8::WSProxyPackHead_C) + hdr.buflen); + memset(buff, 0, sizeof(f8::WSProxyPackHead_C)); f8::WSProxyPackHead_C* head = (f8::WSProxyPackHead_C*)buff; head->packlen = hdr.buflen; head->msgid = hdr.msgid; diff --git a/server/wsproxy/target_conn_mgr.cc b/server/wsproxy/target_conn_mgr.cc index ba1d743..339728e 100644 --- a/server/wsproxy/target_conn_mgr.cc +++ b/server/wsproxy/target_conn_mgr.cc @@ -26,6 +26,10 @@ void TargetConnMgr::Init() void TargetConnMgr::UnInit() { + for (auto& pair : id_hash_) { + pair.second->UnInit(); + delete pair.second; + } } TargetConn* TargetConnMgr::GetConnByKey(const std::string& key) diff --git a/third_party/a8engine b/third_party/a8engine index 0765079..0ae4192 160000 --- a/third_party/a8engine +++ b/third_party/a8engine @@ -1 +1 @@ -Subproject commit 07650796618d3d5f86bc3749e817bdc4848458b9 +Subproject commit 0ae4192e3a75e5627a80e5131fb4425948f146b6 diff --git a/third_party/framework b/third_party/framework index 0d1fd33..7af5d3b 160000 --- a/third_party/framework +++ b/third_party/framework @@ -1 +1 @@ -Subproject commit 0d1fd33446c6dda16e8ecb5a0ad9b0e42c44deee +Subproject commit 7af5d3b84aeaa84a2979c24db9db5ed5a43cea2d