diff --git a/server/masterserver/gsmgr.cc b/server/masterserver/gsmgr.cc index 67836d0..63c1ad2 100644 --- a/server/masterserver/gsmgr.cc +++ b/server/masterserver/gsmgr.cc @@ -3,6 +3,7 @@ #include #include +#include #include #include "gsmgr.h" @@ -24,20 +25,11 @@ struct GSNode int port = 0; bool servicing = false; int version = 0; - long long last_active_tick = 0; + f8::TimerWp timer_wp; }; void GSMgr::Init() { - f8::Timer::Instance()->SetIntervalEx - (1000 * 2, - [] (int e, const a8::Args* args) - { - if (e == a8::TIMER_EXEC_EVENT) { - GSMgr::Instance()->ClearTimeOutNode(); - } - }, - &timer_attacher_); } void GSMgr::UnInit() @@ -115,7 +107,9 @@ void GSMgr::___GSReport(std::shared_ptr request) RearrangeNode(); } itr->second->alive_count = alive_count; - itr->second->last_active_tick = a8::XGetTickCount(); + if (!itr->second->timer_wp.expired()) { + f8::Timer::Instance()->ModifyTime(itr->second->timer_wp, 1000 * 5); + } } else { auto gs = std::make_shared(); gs->key = key; @@ -129,7 +123,28 @@ void GSMgr::___GSReport(std::shared_ptr request) gs->port = port; gs->servicing = servicing; gs->version = version; - gs->last_active_tick = a8::XGetTickCount(); + gs->timer_wp = f8::Timer::Instance()->SetIntervalWp + ( + 1000 * 5, + [this, gs] (int e, const a8::Args* args) + { + if (a8::TIMER_EXEC_EVENT == e) { + RemoveNodeFromSortedNodes(gs); + { + std::vector deleted_teams; + for (auto& pair : team_hash_) { + if (pair.second == gs) { + deleted_teams.push_back(pair.first); + } + } + for (const std::string& team_id : deleted_teams) { + team_hash_.erase(team_id); + } + } + node_key_hash_.erase(gs->key); + RearrangeNode(); + } + }); node_key_hash_[key] = gs; AddNodeToSortedNodes(gs); RearrangeNode(); @@ -269,32 +284,6 @@ void GSMgr::RearrangeNode() } } -void GSMgr::ClearTimeOutNode() -{ - std::vector> time_out_nodes; - for (auto& pair : node_key_hash_) { - if (a8::XGetTickCount() - pair.second->last_active_tick > 1000 * 5) { - time_out_nodes.push_back(pair.second); - } - } - for (std::shared_ptr node : time_out_nodes) { - RemoveNodeFromSortedNodes(node); - { - std::vector deleted_teams; - for (auto& pair : team_hash_) { - if (pair.second == node) { - deleted_teams.push_back(pair.first); - } - } - for (const std::string& team_id : deleted_teams) { - team_hash_.erase(team_id); - } - } - node_key_hash_.erase(node->key); - } - RearrangeNode(); -} - void GSMgr::AddNodeToSortedNodes(std::shared_ptr node) { auto itr = sorted_node_hash_.find(node->version); diff --git a/server/masterserver/gsmgr.h b/server/masterserver/gsmgr.h index 0507938..f5e0cf8 100644 --- a/server/masterserver/gsmgr.h +++ b/server/masterserver/gsmgr.h @@ -34,7 +34,6 @@ class GSMgr : public a8::Singleton std::shared_ptr GetNodeByNodeKey(const std::string& node_key); std::shared_ptr AllocNode(); void RearrangeNode(); - void ClearTimeOutNode(); void AddNodeToSortedNodes(std::shared_ptr node); void RemoveNodeFromSortedNodes(std::shared_ptr node); std::vector>* GetSortedNodes();