diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index 3df506451..ccd9be1cf 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -1506,7 +1506,7 @@ void CServer::SendServerInfoConnless(const NETADDR *pAddr, int Token, int Type) CServer::CCache::CCache() { - m_pRoot = m_pTail = 0; + m_lCache.clear(); } CServer::CCache::~CCache() @@ -1514,47 +1514,26 @@ CServer::CCache::~CCache() Clear(); } +CServer::CCache::CCacheChunk::CCacheChunk(const void *pData, int Size) +{ + m_pData = malloc(Size); // This can fail, but no way to indicate that barring an exception + mem_copy(m_pData, pData, Size); + m_DataSize = Size; +} + +CServer::CCache::CCacheChunk::~CCacheChunk() +{ + free(m_pData); +} + void CServer::CCache::AddChunk(const void *pData, int Size) { - SCacheChunk *pNew = new SCacheChunk; - if(!pNew) - return; - - pNew->m_pData = malloc(Size); - if(!pNew->m_pData) { - delete pNew; - return; - } - - mem_copy(pNew->m_pData, pData, Size); - pNew->m_DataSize = Size; - - pNew->m_pNext = 0; - if(!m_pRoot) - m_pRoot = m_pTail = pNew; - else - { - m_pTail->m_pNext = pNew; - m_pTail = pNew; - } + m_lCache.emplace_back(pData, Size); } void CServer::CCache::Clear() { - if(!m_pRoot) - return; - - SCacheChunk *pTmp = 0; - for(SCacheChunk *pChunk = m_pRoot; pChunk;) - { - pTmp = pChunk; - pChunk = pChunk->m_pNext; - free(pTmp->m_pData); - delete pTmp; - } - - m_pRoot = 0; - m_pTail = 0; + m_lCache.clear(); } void CServer::CacheServerInfo(CCache *pCache, int Type, bool SendClients) @@ -1642,14 +1621,14 @@ void CServer::CacheServerInfo(CCache *pCache, int Type, bool SendClients) int PrefixSize = p.Size(); CPacker pp; - int ChunksSaved = 0; - int PlayersSaved = 0; + int ChunksStored = 0; + int PlayersStored = 0; #define SAVE(size) \ do \ { \ pCache->AddChunk(pp.Data(), size); \ - ChunksSaved++; \ + ChunksStored++; \ } while(0) #define RESET() \ @@ -1662,7 +1641,7 @@ void CServer::CacheServerInfo(CCache *pCache, int Type, bool SendClients) RESET(); if(Type == SERVERINFO_64_LEGACY) - pp.AddInt(PlayersSaved); // offset + pp.AddInt(PlayersStored); // offset if(!SendClients) { @@ -1703,7 +1682,7 @@ void CServer::CacheServerInfo(CCache *pCache, int Type, bool SendClients) // Otherwise we're SERVERINFO_64_LEGACY. SAVE(pp.Size()); RESET(); - pp.AddInt(PlayersSaved); // offset + pp.AddInt(PlayersStored); // offset Remaining = 24; } if(Remaining > 0) @@ -1730,12 +1709,12 @@ void CServer::CacheServerInfo(CCache *pCache, int Type, bool SendClients) i--; SAVE(PreviousSize); RESET(); - ADD_INT(pp, ChunksSaved); + ADD_INT(pp, ChunksStored); pp.AddString("", 0); // extra info, reserved continue; } } - PlayersSaved++; + PlayersStored++; } } @@ -1752,7 +1731,8 @@ void CServer::SendServerInfo(const NETADDR *pAddr, int Token, int Type, bool Sen char aBuf[128]; p.Reset(); - CCache::SCacheChunk *pFirstChunk = m_ServerInfoCache[Type * 2 + SendClients].GetFirst(); + CCache *pCache = &m_ServerInfoCache[Type * 2 + SendClients]; + CCache::CCacheChunk &FirstChunk = pCache->m_lCache.front(); #define ADD_RAW(p, x) (p).AddRaw(x, sizeof(x)) #define ADD_INT(p, x) do { str_format(aBuf, sizeof(aBuf), "%d", x); (p).AddString(aBuf, 0); } while(0) @@ -1761,13 +1741,13 @@ void CServer::SendServerInfo(const NETADDR *pAddr, int Token, int Type, bool Sen { case SERVERINFO_EXTENDED: ADD_RAW(p, SERVERBROWSE_INFO_EXTENDED); break; case SERVERINFO_64_LEGACY: ADD_RAW(p, SERVERBROWSE_INFO_64_LEGACY); break; - case SERVERINFO_VANILLA: ADD_RAW(p, SERVERBROWSE_INFO); break; + case SERVERINFO_VANILLA: case SERVERINFO_INGAME: ADD_RAW(p, SERVERBROWSE_INFO); break; default: dbg_assert(false, "unknown serverinfo type"); } ADD_INT(p, Token); - p.AddRaw(pFirstChunk->m_pData, pFirstChunk->m_DataSize); + p.AddRaw(FirstChunk.m_pData, FirstChunk.m_DataSize); CNetChunk Packet; Packet.m_ClientID = -1; @@ -1781,7 +1761,7 @@ void CServer::SendServerInfo(const NETADDR *pAddr, int Token, int Type, bool Sen if(Type == SERVERINFO_INGAME || Type == SERVERINFO_VANILLA) return; - for(CCache::SCacheChunk *pChunk = pFirstChunk->m_pNext; pChunk; pChunk = pChunk->m_pNext) + for(const auto &Chunk : pCache->m_lCache) { p.Reset(); if(Type == SERVERINFO_EXTENDED) @@ -1791,10 +1771,10 @@ void CServer::SendServerInfo(const NETADDR *pAddr, int Token, int Type, bool Sen } else if(Type == SERVERINFO_64_LEGACY) { - p.AddRaw(pFirstChunk->m_pData, pFirstChunk->m_DataSize); + p.AddRaw(FirstChunk.m_pData, FirstChunk.m_DataSize); } - p.AddRaw(pChunk->m_pData, pChunk->m_DataSize); + p.AddRaw(Chunk.m_pData, Chunk.m_DataSize); Packet.m_pData = p.Data(); Packet.m_DataSize = p.Size(); m_NetServer.Send(&Packet); diff --git a/src/engine/server/server.h b/src/engine/server/server.h index 4e545b4ee..7b02bc6e9 100644 --- a/src/engine/server/server.h +++ b/src/engine/server/server.h @@ -23,6 +23,8 @@ #include +#include + #include "authmanager.h" #include "name_ban.h" @@ -293,22 +295,22 @@ public: class CCache { public: - struct SCacheChunk { + class CCacheChunk { + public: + CCacheChunk(const void *pData, int Size); + CCacheChunk(const CCacheChunk &) = delete; + ~CCacheChunk(); + int m_DataSize; void *m_pData; - - SCacheChunk *m_pNext; }; - private: - SCacheChunk *m_pRoot, *m_pTail; + std::list m_lCache; - public: CCache(); ~CCache(); void AddChunk(const void *pData, int Size); - SCacheChunk *GetFirst() { return m_pRoot; }; void Clear(); }; CCache m_ServerInfoCache[3 * 2];