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

View File

@ -19,10 +19,11 @@
// THE SOFTWARE. // THE SOFTWARE.
#pragma once #pragma once
#include <atomic>
#include <mutex>
#include <condition_variable> #include <condition_variable>
#include <kiwano/core/Common.h> #include <kiwano/core/Common.h>
#include <kiwano/core/Module.h> #include <kiwano/core/Module.h>
#include <mutex>
namespace kiwano namespace kiwano
{ {
@ -105,7 +106,11 @@ private:
std::mutex response_mutex_; std::mutex response_mutex_;
Queue<HttpResponsePtr> response_queue_; 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_;
}; };
/** @} */ /** @} */