From f5ac485ac81cc0a79aa9b1c9efd278ae80100fc3 Mon Sep 17 00:00:00 2001 From: SChernykh Date: Fri, 20 Jan 2023 17:03:59 +0100 Subject: [PATCH] TCPServer: optimized internal write buffers --- src/stratum_server.cpp | 2 +- src/tcp_server.h | 5 +++-- src/tcp_server.inl | 18 ++++++++++++++---- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/stratum_server.cpp b/src/stratum_server.cpp index 2f82bcb..1af2368 100644 --- a/src/stratum_server.cpp +++ b/src/stratum_server.cpp @@ -758,7 +758,7 @@ void StratumServer::on_blobs_ready() } const bool result = send(client, - [data, target, hashing_blob, &job_id](void* buf, size_t buf_size) + [data, target, hashing_blob, job_id](void* buf, size_t buf_size) { log::hex_buf target_hex(reinterpret_cast(&target), sizeof(uint64_t)); diff --git a/src/tcp_server.h b/src/tcp_server.h index 1a31e9c..76eeb64 100644 --- a/src/tcp_server.h +++ b/src/tcp_server.h @@ -102,9 +102,10 @@ public: struct WriteBuf { - Client* m_client = nullptr; uv_write_t m_write = {}; - std::vector m_data; + Client* m_client = nullptr; + void* m_data = nullptr; + size_t m_dataCapacity = 0; }; std::vector m_writeBuffers; diff --git a/src/tcp_server.inl b/src/tcp_server.inl index 8a93c9e..e64fbe4 100644 --- a/src/tcp_server.inl +++ b/src/tcp_server.inl @@ -518,13 +518,22 @@ bool TCPServer::send_internal(Client* client, Sen return true; } - buf->m_client = client; buf->m_write.data = buf; - buf->m_data.reserve(round_up(bytes_written, 64)); - buf->m_data.assign(callback_buf, callback_buf + bytes_written); + buf->m_client = client; + + if (buf->m_dataCapacity < bytes_written) { + buf->m_dataCapacity = round_up(bytes_written, 64); + buf->m_data = realloc_hook(buf->m_data, buf->m_dataCapacity); + if (!buf->m_data) { + LOGERR(0, "failed to allocate " << buf->m_dataCapacity << " bytes to send data"); + PANIC_STOP(); + } + } + + memcpy(buf->m_data, callback_buf, bytes_written); uv_buf_t bufs[1]; - bufs[0].base = reinterpret_cast(buf->m_data.data()); + bufs[0].base = reinterpret_cast(buf->m_data); bufs[0].len = static_cast(bytes_written); const int err = uv_write(&buf->m_write, reinterpret_cast(&client->m_socket), bufs, 1, Client::on_write); @@ -562,6 +571,7 @@ void TCPServer::loop(void* data) } for (WriteBuf* buf : server->m_writeBuffers) { + free_hook(buf->m_data); delete buf; } server->m_writeBuffers.clear();