diff --git a/examples/benchmark/JsonCtrl.cc b/examples/benchmark/JsonCtrl.cc index fcf5fc51..89551545 100644 --- a/examples/benchmark/JsonCtrl.cc +++ b/examples/benchmark/JsonCtrl.cc @@ -6,6 +6,6 @@ void JsonCtrl::asyncHandleHttpRequest( { Json::Value ret; ret["message"] = "Hello, World!"; - auto resp = HttpResponse::newHttpJsonResponse(ret); + auto resp = HttpResponse::newHttpJsonResponse(std::move(ret)); callback(resp); } diff --git a/lib/src/HttpRequestParser.cc b/lib/src/HttpRequestParser.cc index b9c6375e..215bd785 100644 --- a/lib/src/HttpRequestParser.cc +++ b/lib/src/HttpRequestParser.cc @@ -99,31 +99,32 @@ bool HttpRequestParser::processRequestLine(const char *begin, const char *end) HttpRequestImplPtr HttpRequestParser::makeRequestForPool(HttpRequestImpl *ptr) { - std::weak_ptr weakPtr = shared_from_this(); - return std::shared_ptr(ptr, [weakPtr](HttpRequestImpl *p) { - auto thisPtr = weakPtr.lock(); - if (thisPtr) - { - if (thisPtr->loop_->isInLoopThread()) + return std::shared_ptr( + ptr, [weakPtr = weak_from_this()](HttpRequestImpl *p) { + auto thisPtr = weakPtr.lock(); + if (thisPtr) { - p->reset(); - thisPtr->requestsPool_.emplace_back( - thisPtr->makeRequestForPool(p)); - } - else - { - thisPtr->loop_->queueInLoop([thisPtr, p]() { + if (thisPtr->loop_->isInLoopThread()) + { p->reset(); thisPtr->requestsPool_.emplace_back( thisPtr->makeRequestForPool(p)); - }); + } + else + { + auto &loop = thisPtr->loop_; + loop->queueInLoop([thisPtr = std::move(thisPtr), p]() { + p->reset(); + thisPtr->requestsPool_.emplace_back( + thisPtr->makeRequestForPool(p)); + }); + } } - } - else - { - delete p; - } - }); + else + { + delete p; + } + }); } void HttpRequestParser::reset() diff --git a/lib/src/HttpServer.cc b/lib/src/HttpServer.cc index 2326f1a0..0661d33e 100644 --- a/lib/src/HttpServer.cc +++ b/lib/src/HttpServer.cc @@ -546,11 +546,12 @@ void HttpServer::httpRequestHandling( } } - binderPtr->handleRequest( + auto &binderRef = *binderPtr; + binderRef.handleRequest( req, // This is the actual callback being passed to controller - [req, binderPtr, callback = std::move(callback)]( - const HttpResponsePtr &resp) { + [req, binderPtr = std::move(binderPtr), callback = std::move(callback)]( + const HttpResponsePtr &resp) mutable { // Check if we need to cache the response if (resp->expiredTime() >= 0 && resp->statusCode() != k404NotFound) { @@ -562,9 +563,10 @@ void HttpServer::httpRequestHandling( } else { - loop->queueInLoop([binderPtr, resp]() { - binderPtr->responseCache_.setThreadData(resp); - }); + loop->queueInLoop( + [binderPtr = std::move(binderPtr), resp]() { + binderPtr->responseCache_.setThreadData(resp); + }); } } // post-handling aop