jay/component/loop.h
2025-04-12 13:12:38 +03:00

51 lines
1.0 KiB
C++

// SPDX-FileCopyrightText: 2024 Yury Gubich <blue@macaw.me>
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <set>
#include <map>
#include <functional>
#include <mutex>
#include <atomic>
#include <sys/select.h>
#include "shared/loggable.h"
#include "shared/logger.h"
class Loop : Shared::Loggable {
public:
typedef std::function<void()> Callback;
typedef std::map<int, Callback> 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<bool> running;
private:
static void registerInstance(Loop* loop);
static void unregisterInstance(Loop* loop);
static void signalHandler(int signum);
static inline std::set<Loop*> instances;
static inline std::mutex instanceMutex;
};