aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Server/WorldSocket.cpp60
1 files changed, 32 insertions, 28 deletions
diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp
index 6b89e04b6ee..02fa39e2a07 100644
--- a/src/server/game/Server/WorldSocket.cpp
+++ b/src/server/game/Server/WorldSocket.cpp
@@ -81,40 +81,44 @@ void WorldSocket::CheckIpCallback(PreparedQueryResult result)
bool WorldSocket::Update()
{
EncryptablePacket* queued;
- MessageBuffer buffer(_sendBufferSize);
- while (_bufferQueue.Dequeue(queued))
+ if (_bufferQueue.Dequeue(queued))
{
- ServerPktHeader header(queued->size() + 2, queued->GetOpcode());
- if (queued->NeedsEncryption())
- _authCrypt.EncryptSend(header.header, header.getHeaderLength());
-
- if (buffer.GetRemainingSpace() < queued->size() + header.getHeaderLength())
+ // Allocate buffer only when it's needed but not on every Update() call.
+ MessageBuffer buffer(_sendBufferSize);
+ do
{
- QueuePacket(std::move(buffer));
- buffer.Resize(_sendBufferSize);
- }
+ ServerPktHeader header(queued->size() + 2, queued->GetOpcode());
+ if (queued->NeedsEncryption())
+ _authCrypt.EncryptSend(header.header, header.getHeaderLength());
- if (buffer.GetRemainingSpace() >= queued->size() + header.getHeaderLength())
- {
- buffer.Write(header.header, header.getHeaderLength());
- if (!queued->empty())
- buffer.Write(queued->contents(), queued->size());
- }
- else // single packet larger than 4096 bytes
- {
- MessageBuffer packetBuffer(queued->size() + header.getHeaderLength());
- packetBuffer.Write(header.header, header.getHeaderLength());
- if (!queued->empty())
- packetBuffer.Write(queued->contents(), queued->size());
+ if (buffer.GetRemainingSpace() < queued->size() + header.getHeaderLength())
+ {
+ QueuePacket(std::move(buffer));
+ buffer.Resize(_sendBufferSize);
+ }
- QueuePacket(std::move(packetBuffer));
- }
+ if (buffer.GetRemainingSpace() >= queued->size() + header.getHeaderLength())
+ {
+ buffer.Write(header.header, header.getHeaderLength());
+ if (!queued->empty())
+ buffer.Write(queued->contents(), queued->size());
+ }
+ else // single packet larger than buffer size
+ {
+ MessageBuffer packetBuffer(queued->size() + header.getHeaderLength());
+ packetBuffer.Write(header.header, header.getHeaderLength());
+ if (!queued->empty())
+ packetBuffer.Write(queued->contents(), queued->size());
- delete queued;
- }
+ QueuePacket(std::move(packetBuffer));
+ }
+
+ delete queued;
+ } while (_bufferQueue.Dequeue(queued));
- if (buffer.GetActiveSize() > 0)
- QueuePacket(std::move(buffer));
+ if (buffer.GetActiveSize() > 0)
+ QueuePacket(std::move(buffer));
+ }
if (!BaseSocket::Update())
return false;