49 lines
1.0 KiB
C++
49 lines
1.0 KiB
C++
//SPDX-FileCopyrightText: 2023 Yury Gubich <blue@macaw.me>
|
|
//SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
#pragma once
|
|
|
|
#include <memory>
|
|
#include <thread>
|
|
#include <chrono>
|
|
#include <functional>
|
|
#include <mutex>
|
|
#include <condition_variable>
|
|
|
|
#include "manager.h"
|
|
#include "function.h"
|
|
#include "utils/helpers.h"
|
|
|
|
namespace TM {
|
|
class Scheduler {
|
|
public:
|
|
using Delay = std::chrono::milliseconds;
|
|
|
|
Scheduler (std::weak_ptr<Manager> manager);
|
|
~Scheduler ();
|
|
|
|
void start();
|
|
void stop();
|
|
void schedule(const std::function<void()>& task, Delay delay);
|
|
|
|
private:
|
|
void loop();
|
|
|
|
private:
|
|
using Task = std::unique_ptr<Function>;
|
|
using Time = std::chrono::time_point<std::chrono::steady_clock>;
|
|
using Record = std::pair<Time, Task>;
|
|
|
|
PriorityQueue<
|
|
Record,
|
|
std::vector<Record>,
|
|
FirstGreater<Record>
|
|
> queue;
|
|
std::weak_ptr<Manager> manager;
|
|
std::mutex mutex;
|
|
std::condition_variable cond;
|
|
std::unique_ptr<std::thread> thread;
|
|
bool running;
|
|
};
|
|
}
|