mirror of
https://github.com/SatDump/SatDump
synced 2026-08-13 17:47:30 -04:00
58 lines
No EOL
1.1 KiB
C++
58 lines
No EOL
1.1 KiB
C++
#include "task_queue.h"
|
|
|
|
namespace satdump
|
|
{
|
|
TaskQueue::TaskQueue() {}
|
|
|
|
TaskQueue::~TaskQueue()
|
|
{
|
|
if (task_thread.joinable())
|
|
task_thread.join();
|
|
}
|
|
|
|
void TaskQueue::threadFunc()
|
|
{
|
|
recheck:
|
|
queue_mtx.lock();
|
|
bool queue_has_data = task_queue.size() > 0;
|
|
queue_mtx.unlock();
|
|
|
|
if (queue_has_data)
|
|
{
|
|
queue_mtx.lock();
|
|
auto task = task_queue.front();
|
|
task_queue.pop();
|
|
queue_mtx.unlock();
|
|
|
|
try
|
|
{
|
|
task();
|
|
}
|
|
catch (std::exception &e)
|
|
{
|
|
// TODOREWORK?
|
|
}
|
|
|
|
goto recheck;
|
|
}
|
|
|
|
thread_exited = true;
|
|
}
|
|
|
|
void TaskQueue::push(std::function<void()> task)
|
|
{
|
|
queue_mtx.lock();
|
|
|
|
task_queue.push(task);
|
|
|
|
if (thread_exited)
|
|
{
|
|
if (task_thread.joinable())
|
|
task_thread.join();
|
|
thread_exited = false;
|
|
task_thread = std::thread(&TaskQueue::threadFunc, this);
|
|
}
|
|
|
|
queue_mtx.unlock();
|
|
}
|
|
} // namespace satdump
|