From 272176a6a5c11dd690393dd1c0bf62ed277e5a24 Mon Sep 17 00:00:00 2001 From: Oliver Giles Date: Wed, 6 Dec 2017 21:51:50 +0200 Subject: [PATCH] server: allocate a single buffer per file descriptor --- src/server.cpp | 12 ++++++------ src/server.h | 3 ++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/server.cpp b/src/server.cpp index 5ccb72d..4658d9e 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -422,7 +422,8 @@ void Server::stop() { void Server::addDescriptor(int fd, std::function cb) { auto event = this->ioContext.lowLevelProvider->wrapInputFd(fd, kj::LowLevelAsyncIoProvider::TAKE_OWNERSHIP); - tasks.add(handleFdRead(event, cb).attach(std::move(event))); + std::vector buffer(PROC_IO_BUFSIZE); + tasks.add(handleFdRead(event, kj::mv(buffer), cb).attach(std::move(event))); } void Server::acceptHttpClient(kj::Own&& listener) { @@ -455,13 +456,12 @@ void Server::acceptRpcClient(kj::Own&& listener) { // returns a promise which will read a chunk of data from the file descriptor // wrapped by stream and invoke the provided callback with the read data. // Repeats until ::read returns <= 0 -kj::Promise Server::handleFdRead(kj::AsyncInputStream* stream, std::function cb) { - std::vector buffer(PROC_IO_BUFSIZE); +kj::Promise Server::handleFdRead(kj::AsyncInputStream* stream, std::vector&& buffer, std::function cb) { return stream->tryRead((void*)buffer.data(), 1, PROC_IO_BUFSIZE).then(kj::mvCapture(kj::mv(buffer), [this,stream,cb](std::vector&& buffer, size_t sz) { if(sz > 0) { cb(buffer.data(), sz); - return handleFdRead(stream, cb); + return handleFdRead(stream, kj::mv(buffer), cb); } - return kj::Promise(kj::READY_NOW); - })).attach(kj::mv(buffer)); + return kj::Promise(kj::READY_NOW).attach(kj::mv(buffer)); + })); } diff --git a/src/server.h b/src/server.h index 8485282..765c372 100644 --- a/src/server.h +++ b/src/server.h @@ -23,6 +23,7 @@ #include #include #include +#include struct LaminarInterface; @@ -46,7 +47,7 @@ public: private: void acceptHttpClient(kj::Own&& listener); void acceptRpcClient(kj::Own&& listener); - kj::Promise handleFdRead(kj::AsyncInputStream* stream, std::function cb); + kj::Promise handleFdRead(kj::AsyncInputStream* stream, std::vector&& buffer, std::function cb); void taskFailed(kj::Exception&& exception) override { kj::throwFatalException(kj::mv(exception));