Update HTTP module
This commit is contained in:
parent
9fbe396e3b
commit
b9f1d47143
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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_;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue