Update HTTP module

This commit is contained in:
Nomango 2020-02-20 13:58:17 +08:00
parent 9fbe396e3b
commit b9f1d47143
2 changed files with 42 additions and 12 deletions

View File

@ -18,6 +18,7 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include <chrono>
#include <thread>
#include <kiwano/core/Logger.h>
#include <kiwano/platform/Application.h>
@ -185,6 +186,7 @@ namespace network
HttpModule::HttpModule()
: timeout_for_connect_(30000 /* 30 seconds */)
, timeout_for_read_(60000 /* 60 seconds */)
, quit_flag_(false)
{
}
@ -198,6 +200,25 @@ void HttpModule::SetupModule()
void HttpModule::DestroyModule()
{
// Set quit flag
quit_flag_ = true;
// Send a fake request
{
std::unique_lock<std::mutex> lock(request_mutex_);
request_queue_.push(nullptr);
}
// Notify work thread
sleep_cond_.notify_one();
// Wait for work thread destroyed
{
std::unique_lock<std::mutex> lock(quit_mutex_);
quit_cond_.wait_for(lock, std::chrono::seconds(1));
}
// Clear curl resources
::curl_global_cleanup();
}
@ -206,11 +227,11 @@ void HttpModule::Send(HttpRequestPtr request)
if (!request)
return;
request_mutex_.lock();
request_queue_.push(request);
request_mutex_.unlock();
sleep_condition_.notify_one();
{
std::unique_lock<std::mutex> lock(request_mutex_);
request_queue_.push(request);
}
sleep_cond_.notify_one();
}
void HttpModule::NetworkThread()
@ -219,15 +240,19 @@ void HttpModule::NetworkThread()
{
HttpRequestPtr request;
{
std::lock_guard<std::mutex> lock(request_mutex_);
while (request_queue_.empty())
{
sleep_condition_.wait(request_mutex_);
}
std::unique_lock<std::mutex> lock(request_mutex_);
sleep_cond_.wait(lock, [&]() { return !request_queue_.empty(); });
request = request_queue_.front();
request_queue_.pop();
}
if (quit_flag_)
{
quit_cond_.notify_one();
return;
}
HttpResponsePtr response = new (std::nothrow) HttpResponse(request);
Perform(request, response);

View File

@ -19,10 +19,11 @@
// THE SOFTWARE.
#pragma once
#include <atomic>
#include <mutex>
#include <condition_variable>
#include <kiwano/core/Common.h>
#include <kiwano/core/Module.h>
#include <mutex>
namespace kiwano
{
@ -105,7 +106,11 @@ private:
std::mutex response_mutex_;
Queue<HttpResponsePtr> response_queue_;
std::condition_variable_any sleep_condition_;
std::condition_variable sleep_cond_;
std::atomic<bool> quit_flag_;
std::mutex quit_mutex_;
std::condition_variable quit_cond_;
};
/** @} */