Use a std::list, improve variable naming

This commit is contained in:
Learath2 2019-11-03 15:39:32 +01:00
parent 3d495a9936
commit 52cca29cd9
2 changed files with 38 additions and 56 deletions

View file

@ -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);

View file

@ -23,6 +23,8 @@
#include <base/tl/array.h>
#include <list>
#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<CCacheChunk> m_lCache;
public:
CCache();
~CCache();
void AddChunk(const void *pData, int Size);
SCacheChunk *GetFirst() { return m_pRoot; };
void Clear();
};
CCache m_ServerInfoCache[3 * 2];