mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-19 00:41:43 +00:00
[ntcore] Limit buffer pool size to 64KB per connection (#5485)
Previously this was unlimited, which could result in holding on to a large amount of memory if the connection got backlogged or a burst of data transmission occurred.
This commit is contained in:
@@ -16,6 +16,7 @@ using namespace nt::net;
|
||||
static constexpr size_t kAllocSize = 4096;
|
||||
static constexpr size_t kTextFrameRolloverSize = 4096;
|
||||
static constexpr size_t kBinaryFrameRolloverSize = 8192;
|
||||
static constexpr size_t kMaxPoolSize = 16;
|
||||
|
||||
WebSocketConnection::WebSocketConnection(wpi::WebSocket& ws)
|
||||
: m_ws{ws},
|
||||
@@ -53,7 +54,13 @@ void WebSocketConnection::Flush() {
|
||||
++m_sendsActive;
|
||||
m_ws.SendFrames(m_ws_frames, [selfweak = weak_from_this()](auto bufs, auto) {
|
||||
if (auto self = selfweak.lock()) {
|
||||
self->m_buf_pool.insert(self->m_buf_pool.end(), bufs.begin(), bufs.end());
|
||||
size_t numToPool =
|
||||
(std::min)(bufs.size(), kMaxPoolSize - self->m_buf_pool.size());
|
||||
self->m_buf_pool.insert(self->m_buf_pool.end(), bufs.begin(),
|
||||
bufs.begin() + numToPool);
|
||||
for (auto&& buf : bufs.subspan(numToPool)) {
|
||||
buf.Deallocate();
|
||||
}
|
||||
if (self->m_sendsActive > 0) {
|
||||
--self->m_sendsActive;
|
||||
}
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
using namespace nt;
|
||||
using namespace nt::net3;
|
||||
|
||||
static constexpr size_t kMaxPoolSize = 16;
|
||||
|
||||
UvStreamConnection3::UvStreamConnection3(wpi::uv::Stream& stream)
|
||||
: m_stream{stream}, m_os{m_buffers, [this] { return AllocBuf(); }} {}
|
||||
|
||||
@@ -26,7 +28,13 @@ void UvStreamConnection3::Flush() {
|
||||
++m_sendsActive;
|
||||
m_stream.Write(m_buffers, [selfweak = weak_from_this()](auto bufs, auto) {
|
||||
if (auto self = selfweak.lock()) {
|
||||
self->m_buf_pool.insert(self->m_buf_pool.end(), bufs.begin(), bufs.end());
|
||||
size_t numToPool =
|
||||
(std::min)(bufs.size(), kMaxPoolSize - self->m_buf_pool.size());
|
||||
self->m_buf_pool.insert(self->m_buf_pool.end(), bufs.begin(),
|
||||
bufs.begin() + numToPool);
|
||||
for (auto&& buf : bufs.subspan(numToPool)) {
|
||||
buf.Deallocate();
|
||||
}
|
||||
if (self->m_sendsActive > 0) {
|
||||
--self->m_sendsActive;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user