aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-08-07 23:55:53 +0200
committerShauren <shauren.trinity@gmail.com>2025-08-07 23:55:53 +0200
commitecb78919ade4afaac466927ba545975d96b507ab (patch)
tree0ef3bcca49f3f808c8afcce00e6845e3285e593f /src
parentd0047ccbeece8d6fa86b4a4ffa75280acf48f8da (diff)
Core/PacketIO: Reduce amount of stack space used by a few giant packet classes
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Server/Packets/PacketUtilities.h24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/server/game/Server/Packets/PacketUtilities.h b/src/server/game/Server/Packets/PacketUtilities.h
index f456090c018..3170b11b180 100644
--- a/src/server/game/Server/Packets/PacketUtilities.h
+++ b/src/server/game/Server/Packets/PacketUtilities.h
@@ -147,6 +147,21 @@ namespace WorldPackets
[[noreturn]] void OnInvalidArraySize(std::size_t requestedSize, std::size_t sizeLimit);
+ template <typename T, std::size_t N, bool IsLarge>
+ struct ArrayAllocatorTraits
+ {
+ using allocator_type = short_alloc::short_alloc<T, (N * sizeof(T) + (alignof(std::max_align_t) - 1)) & ~(alignof(std::max_align_t) - 1)>;
+ using resource_type = typename allocator_type::arena_type;
+ };
+
+ // don't store elements inline when size is large
+ template <typename T, std::size_t N>
+ struct ArrayAllocatorTraits<T, N, true>
+ {
+ using allocator_type = std::allocator<T>;
+ using resource_type = std::allocator<T>;
+ };
+
/**
* Utility class for automated prevention of loop counter spoofing in client packets
*/
@@ -154,8 +169,9 @@ namespace WorldPackets
class Array
{
public:
- using allocator_type = short_alloc::short_alloc<T, (N * sizeof(T) + (alignof(std::max_align_t) - 1)) & ~(alignof(std::max_align_t) - 1)>;
- using arena_type = typename allocator_type::arena_type;
+ using allocator_traits = ArrayAllocatorTraits<T, N, (sizeof(T) * N > 0x1000)>;
+ using allocator_type = typename allocator_traits::allocator_type;
+ using allocator_resource_type = typename allocator_traits::resource_type;
using storage_type = std::vector<T, allocator_type>;
@@ -170,7 +186,7 @@ namespace WorldPackets
using iterator = typename storage_type::iterator;
using const_iterator = typename storage_type::const_iterator;
- Array() : _storage(_data) { }
+ Array() : _storage(_allocatorResource) { }
Array(Array const& other) : Array()
{
@@ -253,7 +269,7 @@ namespace WorldPackets
}
private:
- arena_type _data;
+ allocator_resource_type _allocatorResource;
storage_type _storage;
};