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*/,
|
std::string_view Connection::readBytes(char *buf, size_t buffer_size) {
|
||||||
size_t buffer_size) {
|
|
||||||
// Use Variable Length Array for optimal stack allocation
|
|
||||||
char buf[buffer_size];
|
|
||||||
|
|
||||||
int r = read(fd_, buf, buffer_size);
|
int r = read(fd_, buf, buffer_size);
|
||||||
if (r == -1) {
|
if (r == -1) {
|
||||||
if (errno == EINTR || errno == EAGAIN) {
|
if (errno == EINTR || errno == EAGAIN) {
|
||||||
@@ -63,11 +59,7 @@ std::string_view Connection::readBytes(size_t /*max_request_size*/,
|
|||||||
if (r == 0) {
|
if (r == 0) {
|
||||||
return {}; // EOF - let server handle connection cleanup
|
return {}; // EOF - let server handle connection cleanup
|
||||||
}
|
}
|
||||||
|
return {buf, size_t(r)};
|
||||||
// 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)};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Connection::writeBytes() {
|
bool Connection::writeBytes() {
|
||||||
|
|||||||
@@ -349,7 +349,7 @@ private:
|
|||||||
ConnectionHandler *handler, std::weak_ptr<Server> server);
|
ConnectionHandler *handler, std::weak_ptr<Server> server);
|
||||||
|
|
||||||
// Networking interface - only accessible by 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();
|
bool writeBytes();
|
||||||
void tsan_acquire();
|
void tsan_acquire();
|
||||||
void tsan_release();
|
void tsan_release();
|
||||||
|
|||||||
@@ -318,9 +318,9 @@ void Server::start_network_threads() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (events[i].events & EPOLLIN) {
|
if (events[i].events & EPOLLIN) {
|
||||||
std::string_view data =
|
auto buf_size = config_.server.read_buffer_size;
|
||||||
conn->readBytes(config_.server.max_request_size_bytes,
|
char buf[buf_size];
|
||||||
config_.server.read_buffer_size);
|
std::string_view data = conn->readBytes(buf, buf_size);
|
||||||
|
|
||||||
if (data.empty()) {
|
if (data.empty()) {
|
||||||
// No data, error, or EOF - connection should be closed
|
// No data, error, or EOF - connection should be closed
|
||||||
|
|||||||
Reference in New Issue
Block a user