// SPDX-FileCopyrightText: 2024 Yury Gubich // SPDX-License-Identifier: GPL-3.0-or-later #pragma once #include #include #include #include #include #include #include "shared/loggable.h" #include "shared/logger.h" class Loop : Shared::Loggable { public: typedef std::function Callback; typedef std::map Handlers; Loop(const Shared::Logger& logger); ~Loop(); void run(); void stop(); void addDescriptor(int descriptor, const Callback& handler); void removeDescriptor(int descriptor); private: void wake(); bool drain(fd_set* readfds); bool runCallbacks(const Handlers& copy); private: int wakePipe[2]; Handlers handlers; std::mutex mutex; std::atomic running; private: static void registerInstance(Loop* loop); static void unregisterInstance(Loop* loop); static void signalHandler(int signum); static inline std::set instances; static inline std::mutex instanceMutex; };