Don't copy every byte read into arena
This commit is contained in:
@@ -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<char>(r);
|
||||
std::memcpy(arena_data, buf, r);
|
||||
return {arena_data, size_t(r)};
|
||||
return {buf, size_t(r)};
|
||||
}
|
||||
|
||||
bool Connection::writeBytes() {
|
||||
|
||||
@@ -349,7 +349,7 @@ private:
|
||||
ConnectionHandler *handler, std::weak_ptr<Server> 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();
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user