From d8da3977957a3cca6a7fc8d35769fe3c851cea9f Mon Sep 17 00:00:00 2001 From: Vladimir Olteanu Date: Fri, 16 Jul 2021 13:33:23 +0300 Subject: [PATCH] Use std::list to manage TMegaPkts --- Source/msg.cpp | 49 ++++++++++++++++++++++--------------------------- Source/msg.h | 8 -------- 2 files changed, 22 insertions(+), 35 deletions(-) diff --git a/Source/msg.cpp b/Source/msg.cpp index 09cc20192..8c02b3088 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -7,6 +7,7 @@ #include #include +#include #include "DiabloUI/diabloui.h" #include "automap.h" @@ -39,6 +40,16 @@ int dwRecCount; namespace { +struct TMegaPkt { + uint32_t spaceLeft; + byte data[32000]; + + TMegaPkt() + : spaceLeft(sizeof(data)) + { + } +}; + #define MAX_CHUNKS (NUMLEVELS + 4) uint32_t sgdwOwnerWait; @@ -46,48 +57,31 @@ uint32_t sgdwRecvOffset; int sgnCurrMegaPlayer; DLevel sgLevels[NUMLEVELS]; BYTE sbLastCmd; -TMegaPkt *sgpCurrPkt; byte sgRecvBuf[sizeof(DLevel) + 1]; BYTE sgbRecvCmd; LocalLevel sgLocals[NUMLEVELS]; DJunk sgJunk; -TMegaPkt *sgpMegaPkt; bool sgbDeltaChanged; BYTE sgbDeltaChunks; +std::list MegaPktList; void GetNextPacket() { - TMegaPkt *result; - - sgpCurrPkt = static_cast(std::malloc(sizeof(TMegaPkt))); - if (sgpCurrPkt == nullptr) - app_fatal("Failed to allocate memory"); - sgpCurrPkt->pNext = nullptr; - sgpCurrPkt->dwSpaceLeft = sizeof(result->data); - - result = (TMegaPkt *)&sgpMegaPkt; - while (result->pNext != nullptr) - result = result->pNext; - - result->pNext = sgpCurrPkt; + MegaPktList.emplace_back(); } void FreePackets() { - while (sgpMegaPkt != nullptr) { - sgpCurrPkt = sgpMegaPkt->pNext; - std::free(sgpMegaPkt); - sgpMegaPkt = sgpCurrPkt; - } + MegaPktList.clear(); } void PrePacket() { uint8_t playerId = -1; - for (TMegaPkt *pkt = sgpMegaPkt; pkt != nullptr; pkt = pkt->pNext) { - byte *data = pkt->data; - size_t spaceLeft = sizeof(pkt->data); - while (spaceLeft != pkt->dwSpaceLeft) { + for (TMegaPkt &pkt : MegaPktList) { + byte *data = pkt.data; + size_t spaceLeft = sizeof(pkt.data); + while (spaceLeft != pkt.spaceLeft) { auto cmdId = static_cast<_cmd_id>(*data); if (cmdId == FAKE_CMD_SETID) { @@ -123,11 +117,12 @@ void SendPacket(int pnum, const void *packet, DWORD dwSize) cmd.bPlr = pnum; SendPacket(pnum, &cmd, sizeof(cmd)); } - if (sgpCurrPkt->dwSpaceLeft < dwSize) + if (MegaPktList.back().spaceLeft < dwSize) GetNextPacket(); - memcpy(sgpCurrPkt->data + sizeof(sgpCurrPkt->data) - sgpCurrPkt->dwSpaceLeft, packet, dwSize); - sgpCurrPkt->dwSpaceLeft -= dwSize; + TMegaPkt &currMegaPkt = MegaPktList.back(); + memcpy(currMegaPkt.data + sizeof(currMegaPkt.data) - currMegaPkt.spaceLeft, packet, dwSize); + currMegaPkt.spaceLeft -= dwSize; } int WaitForTurns() diff --git a/Source/msg.h b/Source/msg.h index e4ac53e17..30d1a9e22 100644 --- a/Source/msg.h +++ b/Source/msg.h @@ -398,14 +398,6 @@ struct DJunk { }; #pragma pack(pop) -#pragma pack(push, 1) -struct TMegaPkt { - struct TMegaPkt *pNext; - uint32_t dwSpaceLeft; - byte data[32000]; -}; -#pragma pack(pop) - struct TBuffer { uint32_t dwNextWriteOffset; byte bData[4096];