//SPDX-FileCopyrightText: 2023 Yury Gubich //SPDX-License-Identifier: GPL-3.0-or-later #pragma once #include #include #include #include #include #include #include "manager.h" #include "function.h" #include "record.h" #include "utils/helpers.h" namespace TM { class Scheduler { public: using Delay = std::chrono::milliseconds; using Time = Record::Time; using Task = Record::Task; Scheduler (std::weak_ptr manager); ~Scheduler (); void start (); void stop (); Record::ID schedule (const Task& task, Delay delay); bool cancel (Record::ID id); static const Record::ID none; private: void loop (); private: PriorityQueue< Record, std::vector, std::greater<> > queue; std::set scheduled; std::weak_ptr manager; std::mutex mutex; std::condition_variable cond; std::unique_ptr thread; bool running; Record::ID idCounter; }; }