#ifndef _MANAGE_TOOL_SERVER_USER_STATISTICS_H_ #define _MANAGE_TOOL_SERVER_USER_STATISTICS_H_ #pragma warning(disable:4800) #include #include #include #include #include #include #include #include // forward decl. namespace ServerManage { struct UserNumPair; } struct PktBase; class CUserStatistics { public: static CUserStatistics& GetInstance(); bool Load(); void SetSetupFileName(const TCHAR* szFileName); void SetUserNum(unsigned long dwRunID, unsigned long dwServerID, int nCurrentUserNum) { StatisticsLock::Syncronize sync(m_Lock); InternalSetUserNum(dwRunID, dwServerID, nCurrentUserNum); } int GetUserNum(unsigned long dwServerID); int GetTotalUserNum(); int GetGroupUserNum(char cGroupNum); void ClearRunID_UserNum(unsigned long dwRunID) { StatisticsLock::Syncronize sync(m_Lock); InternalClearRunID_UserNum(dwRunID); } void ClearGroupUserNum(unsigned char cGroupNum) { StatisticsLock::Syncronize sync(m_Lock); InternalClearGroupUserNum(cGroupNum); } void CheckClearUser(PktBase* lpPktBase); void SerializeIn(unsigned long dwRunID, ServerManage::UserNumPair* lpUserNumPair, unsigned long dwPairNum); void SendStatisticsToHanGame(); void SendStatisticsToStatServer(); private: CUserStatistics(); ~CUserStatistics(); void InternalSetUserNum(unsigned long dwRunID, unsigned long dwServerID, int nCurrentUserNum); void InternalClearRunID_UserNum(unsigned long dwRunID); void InternalClearGroupUserNum(unsigned char cGroupNum); typedef CCSLock StatisticsLock; typedef std::map, boost::fast_pool_allocator > > UserNumTable; typedef std::multimap, boost::fast_pool_allocator > > RunIDTable; typedef std::map ServerGroupNames; typedef std::list AddressList; StatisticsLock m_Lock; CACHE_PAD(StatisticsLockPad, sizeof(StatisticsLock)); UserNumTable m_CurrentUsers; RunIDTable m_RunIDTable; ServerGroupNames m_ServerGroupNames; AddressList m_HangameAddress; TCHAR m_szSetupFileName[MAX_PATH]; }; #endif