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));