diff --git a/src/kiwano-network/HttpModule.cpp b/src/kiwano-network/HttpModule.cpp index 99de7d54..6acd609d 100644 --- a/src/kiwano-network/HttpModule.cpp +++ b/src/kiwano-network/HttpModule.cpp @@ -18,6 +18,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. +#include #include #include #include @@ -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 lock(request_mutex_); + request_queue_.push(nullptr); + } + + // Notify work thread + sleep_cond_.notify_one(); + + // Wait for work thread destroyed + { + std::unique_lock 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 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 lock(request_mutex_); - while (request_queue_.empty()) - { - sleep_condition_.wait(request_mutex_); - } + std::unique_lock 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); diff --git a/src/kiwano-network/HttpModule.h b/src/kiwano-network/HttpModule.h index 8473c877..0da60053 100644 --- a/src/kiwano-network/HttpModule.h +++ b/src/kiwano-network/HttpModule.h @@ -19,10 +19,11 @@ // THE SOFTWARE. #pragma once +#include +#include #include #include #include -#include namespace kiwano { @@ -105,7 +106,11 @@ private: std::mutex response_mutex_; Queue response_queue_; - std::condition_variable_any sleep_condition_; + std::condition_variable sleep_cond_; + + std::atomic quit_flag_; + std::mutex quit_mutex_; + std::condition_variable quit_cond_; }; /** @} */