diff --git a/src/connection.cpp b/src/connection.cpp index 78de4d4..1039b3a 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -47,11 +47,7 @@ void Connection::appendMessage(std::string_view s, bool copyToArena) { } } -std::string_view Connection::readBytes(size_t /*max_request_size*/, - size_t buffer_size) { - // Use Variable Length Array for optimal stack allocation - char buf[buffer_size]; - +std::string_view Connection::readBytes(char *buf, size_t buffer_size) { int r = read(fd_, buf, buffer_size); if (r == -1) { if (errno == EINTR || errno == EAGAIN) { @@ -63,11 +59,7 @@ std::string_view Connection::readBytes(size_t /*max_request_size*/, if (r == 0) { return {}; // EOF - let server handle connection cleanup } - - // Copy data to arena for persistent storage - char *arena_data = arena_.allocate(r); - std::memcpy(arena_data, buf, r); - return {arena_data, size_t(r)}; + return {buf, size_t(r)}; } bool Connection::writeBytes() { diff --git a/src/connection.hpp b/src/connection.hpp index 9daa031..a7cd794 100644 --- a/src/connection.hpp +++ b/src/connection.hpp @@ -349,7 +349,7 @@ private: ConnectionHandler *handler, std::weak_ptr server); // Networking interface - only accessible by Server - std::string_view readBytes(size_t max_request_size, size_t buffer_size); + std::string_view readBytes(char *buf, size_t buffer_size); bool writeBytes(); void tsan_acquire(); void tsan_release(); diff --git a/src/server.cpp b/src/server.cpp index 65dd6ca..3eb92ca 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -318,9 +318,9 @@ void Server::start_network_threads() { } if (events[i].events & EPOLLIN) { - std::string_view data = - conn->readBytes(config_.server.max_request_size_bytes, - config_.server.read_buffer_size); + auto buf_size = config_.server.read_buffer_size; + char buf[buf_size]; + std::string_view data = conn->readBytes(buf, buf_size); if (data.empty()) { // No data, error, or EOF - connection should be closed