2019-11-07 19:56:32 +01:00
|
|
|
#include "pch.h"
|
|
|
|
|
2021-11-08 13:02:56 +01:00
|
|
|
#include <common/logger/call_tracer.h>
|
|
|
|
|
2019-11-07 19:56:32 +01:00
|
|
|
#include "on_thread_executor.h"
|
|
|
|
|
2020-03-05 11:07:06 +01:00
|
|
|
OnThreadExecutor::OnThreadExecutor() :
|
|
|
|
_shutdown_request{ false }, _worker_thread{ [this] { worker_thread(); } }
|
|
|
|
{
|
|
|
|
}
|
2019-11-07 19:56:32 +01:00
|
|
|
|
2020-03-05 11:07:06 +01:00
|
|
|
std::future<void> OnThreadExecutor::submit(task_t task)
|
|
|
|
{
|
|
|
|
auto future = task.get_future();
|
|
|
|
std::lock_guard lock{ _task_mutex };
|
|
|
|
_task_queue.emplace(std::move(task));
|
|
|
|
_task_cv.notify_one();
|
|
|
|
return future;
|
2019-11-07 19:56:32 +01:00
|
|
|
}
|
|
|
|
|
2020-10-12 11:05:22 +02:00
|
|
|
void OnThreadExecutor::cancel()
|
|
|
|
{
|
|
|
|
std::lock_guard lock{ _task_mutex };
|
|
|
|
_task_queue = {};
|
|
|
|
_task_cv.notify_one();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-03-05 11:07:06 +01:00
|
|
|
void OnThreadExecutor::worker_thread()
|
|
|
|
{
|
|
|
|
while (!_shutdown_request)
|
2019-11-07 19:56:32 +01:00
|
|
|
{
|
2020-03-05 11:07:06 +01:00
|
|
|
task_t task;
|
|
|
|
{
|
2021-03-15 13:58:25 +01:00
|
|
|
CallTracer callTracer(__FUNCTION__ "(loop)");
|
2020-03-05 11:07:06 +01:00
|
|
|
std::unique_lock task_lock{ _task_mutex };
|
|
|
|
_task_cv.wait(task_lock, [this] { return !_task_queue.empty() || _shutdown_request; });
|
|
|
|
if (_shutdown_request)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
task = std::move(_task_queue.front());
|
|
|
|
_task_queue.pop();
|
|
|
|
}
|
|
|
|
task();
|
2019-11-07 19:56:32 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-05 11:07:06 +01:00
|
|
|
OnThreadExecutor::~OnThreadExecutor()
|
|
|
|
{
|
|
|
|
_shutdown_request = true;
|
|
|
|
_task_cv.notify_one();
|
|
|
|
_worker_thread.join();
|
2019-11-07 19:56:32 +01:00
|
|
|
}
|