Skip to content
API Documentation
BastionGuard™
TaskRunner.cpp
Go to the documentation of this file.
2
3#include <thread>
4
5namespace bsc::task {
6
8
9void TaskRunner::every(const std::string& name, std::chrono::milliseconds interval, std::function<void()> fn) {
10 stop_task(name);
11 if (shutdown_) return;
12
13 auto state = std::make_unique<TaskState>();
14 state->interval = interval;
15 state->fn = std::move(fn);
16 auto* ptr = state.get();
17 state->thread = std::thread([this, ptr]() {
18 while (!shutdown_ && ptr->running) {
19 ptr->fn();
20 for (std::chrono::milliseconds elapsed{0}; !shutdown_ && ptr->running && elapsed < ptr->interval; elapsed += std::chrono::milliseconds(100)) {
21 std::this_thread::sleep_for(std::chrono::milliseconds(100));
22 }
23 }
24 });
25
26 std::lock_guard lock(mutex_);
27 tasks_[name] = std::move(state);
28}
29
30bool TaskRunner::stop_task(const std::string& name) {
31 std::unique_ptr<TaskState> task;
32 {
33 std::lock_guard lock(mutex_);
34 auto it = tasks_.find(name);
35 if (it == tasks_.end()) return false;
36 task = std::move(it->second);
37 tasks_.erase(it);
38 }
39 task->running = false;
40 if (task->thread.joinable()) task->thread.join();
41 return true;
42}
43
44bool TaskRunner::has_task(const std::string& name) const {
45 std::lock_guard lock(mutex_);
46 return tasks_.contains(name);
47}
48
50 shutdown_ = true;
51 std::unordered_map<std::string, std::unique_ptr<TaskState>> tasks;
52 {
53 std::lock_guard lock(mutex_);
54 tasks.swap(tasks_);
55 }
56 for (auto& [_, task] : tasks) task->running = false;
57 for (auto& [_, task] : tasks) if (task->thread.joinable()) task->thread.join();
58}
59
60} // namespace bsc::task
#define _(s)
bool stop_task(const std::string &name)
bool has_task(const std::string &name) const
std::unordered_map< std::string, std::unique_ptr< TaskState > > tasks_
std::atomic_bool shutdown_
void every(const std::string &name, std::chrono::milliseconds interval, std::function< void()> fn)
Definition TaskRunner.cpp:9