@@ -79,7 +79,10 @@ void HttpClientImpl::createTcpClient()
7979 thisPtr->requestsBuffer_ .front ().first );
8080 thisPtr->pipeliningCallbacks_ .push (
8181 std::move (thisPtr->requestsBuffer_ .front ()));
82- thisPtr->requestsBuffer_ .pop_front ();
82+ thisPtr->pipeliningCallbacksSize_ .fetch_add (
83+ 1 , std::memory_order_relaxed);
84+
85+ thisPtr->popFrontRequest ();
8386 }
8487 }
8588 else
@@ -340,7 +343,7 @@ void HttpClientImpl::sendRequestInLoop(const HttpRequestPtr &req,
340343 {
341344 if (iter->first == callbackParamsPtr->requestPtr )
342345 {
343- thisPtr->requestsBuffer_ . erase (iter);
346+ thisPtr->eraseRequest (iter);
344347 break ;
345348 }
346349 }
@@ -419,12 +422,12 @@ void HttpClientImpl::sendRequestInLoop(const drogon::HttpRequestPtr &req,
419422 {
420423 auto callbackPtr =
421424 std::make_shared<drogon::HttpReqCallback>(std::move (callback));
422- requestsBuffer_. push_back (
423- {req ,
424- [thisPtr = shared_from_this () ,
425- callbackPtr](ReqResult result, const HttpResponsePtr &response) {
426- (*callbackPtr)(result, response);
427- } });
425+ enqueueRequest (req,
426+ [thisPtr = shared_from_this () ,
427+ callbackPtr](ReqResult result ,
428+ const HttpResponsePtr &response) {
429+ (*callbackPtr)(result, response);
430+ });
428431
429432 if (domain_.empty () || !isDomainName_)
430433 {
@@ -436,7 +439,7 @@ void HttpClientImpl::sendRequestInLoop(const drogon::HttpRequestPtr &req,
436439 // No ip address and no domain, respond with BadServerAddress
437440 else
438441 {
439- requestsBuffer_. pop_front ();
442+ popFrontRequest ();
440443 (*callbackPtr)(ReqResult::BadServerAddress, nullptr );
441444 assert (requestsBuffer_.empty ());
442445 }
@@ -480,7 +483,8 @@ void HttpClientImpl::sendRequestInLoop(const drogon::HttpRequestPtr &req,
480483 {
481484 auto &reqAndCb = (thisPtr->requestsBuffer_ ).front ();
482485 reqAndCb.second (ReqResult::BadServerAddress, nullptr );
483- (thisPtr->requestsBuffer_ ).pop_front ();
486+
487+ thisPtr->popFrontRequest ();
484488 }
485489 });
486490 });
@@ -495,13 +499,11 @@ void HttpClientImpl::sendRequestInLoop(const drogon::HttpRequestPtr &req,
495499 // Not connected, push request to buffer and wait for connection
496500 if (!connPtr || connPtr->disconnected ())
497501 {
498- requestsBuffer_.push_back (
499- {req,
500- [thisPtr,
501- callback = std::move (callback)](ReqResult result,
502- const HttpResponsePtr &response) {
503- callback (result, response);
504- }});
502+ enqueueRequest (req,
503+ [thisPtr, callback = std::move (callback)](
504+ ReqResult result, const HttpResponsePtr &response) {
505+ callback (result, response);
506+ });
505507 return ;
506508 }
507509
@@ -517,16 +519,15 @@ void HttpClientImpl::sendRequestInLoop(const drogon::HttpRequestPtr &req,
517519 const HttpResponsePtr &response) {
518520 callback (result, response);
519521 }});
522+ pipeliningCallbacksSize_.fetch_add (1 , std::memory_order_relaxed);
520523 }
521524 else
522525 {
523- requestsBuffer_.push_back (
524- {req,
525- [thisPtr,
526- callback = std::move (callback)](ReqResult result,
527- const HttpResponsePtr &response) {
528- callback (result, response);
529- }});
526+ enqueueRequest (req,
527+ [thisPtr, callback = std::move (callback)](
528+ ReqResult result, const HttpResponsePtr &response) {
529+ callback (result, response);
530+ });
530531 }
531532}
532533
@@ -562,6 +563,7 @@ void HttpClientImpl::handleResponse(
562563#endif
563564 auto cb = std::move (reqAndCb);
564565 pipeliningCallbacks_.pop ();
566+ pipeliningCallbacksSize_.fetch_sub (1 , std::memory_order_relaxed);
565567 handleCookies (resp);
566568 cb.second (ReqResult::Ok, resp);
567569
@@ -576,7 +578,8 @@ void HttpClientImpl::handleResponse(
576578 auto &reqAndCallback = requestsBuffer_.front ();
577579 sendReq (connPtr, reqAndCallback.first );
578580 pipeliningCallbacks_.push (std::move (reqAndCallback));
579- requestsBuffer_.pop_front ();
581+ pipeliningCallbacksSize_.fetch_add (1 , std::memory_order_relaxed);
582+ popFrontRequest ();
580583 }
581584 else
582585 {
@@ -592,6 +595,7 @@ void HttpClientImpl::handleResponse(
592595 {
593596 auto cb = std::move (pipeliningCallbacks_.front ());
594597 pipeliningCallbacks_.pop ();
598+ pipeliningCallbacksSize_.fetch_sub (1 , std::memory_order_relaxed);
595599 cb.second (ReqResult::NetworkFailure, nullptr );
596600 }
597601 }
@@ -674,12 +678,13 @@ void HttpClientImpl::onError(ReqResult result)
674678 {
675679 auto cb = std::move (pipeliningCallbacks_.front ());
676680 pipeliningCallbacks_.pop ();
681+ pipeliningCallbacksSize_.fetch_sub (1 , std::memory_order_relaxed);
677682 cb.second (result, nullptr );
678683 }
679684 while (!requestsBuffer_.empty ())
680685 {
681686 auto cb = std::move (requestsBuffer_.front ().second );
682- requestsBuffer_. pop_front ();
687+ popFrontRequest ();
683688 cb (result, nullptr );
684689 }
685690 tcpClientPtr_.reset ();
0 commit comments