USB_Config_Vendor/CC_SDK/Include/Module/IO/EventLoop.h
2026-02-03 14:36:30 +08:00

102 lines
2.6 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef EPOLL_EVENTLOOP_H
#define EPOLL_EVENTLOOP_H
#include "CCEpoll.h"
#ifdef __linux__
#include <unistd.h>
#endif
#include <functional>
#include <vector>
#include <queue>
#include <mutex>
#include <atomic>
#include <thread>
#include <iostream>
#include <chrono>
#include <set>
#include "TL/Map.h"
namespace CTL {
enum EPEvent {
IN_t = 1,
OUT_t = 2,
HUP = 3,
MSG = 4,
RD_HUP = 5,
ERR = 6,
};
class EventLoop {
public:
using Callback = std::function<void(uint32_t)>;
using TimePoint = std::chrono::steady_clock::time_point;
struct Event_t {
Callback cb = nullptr;
uint32_t event{};
};
EventLoop();
~EventLoop();
// 注册IO事件
void registerEvent(int fd, const Callback &cb,uint32_t event_t = EPOLLIN);
// 移除IO事件
void unregisterEvent(int fd);
// 添加定时任务(延迟执行)
void addTimerAfter(std::chrono::milliseconds delay, const Callback &cb, bool repeat = false);
// 添加定时任务(指定时间点执行)
void addTimerAt(TimePoint expiration, const Callback &cb, bool repeat = false);
// 启动事件循环
void run();
// 停止事件循环
void stop();
private:
struct TimerTask {
TimePoint expiration;
Callback cb;
bool repeat;
std::chrono::milliseconds interval;
TimerTask(TimePoint exp, Callback callback, bool rep, std::chrono::milliseconds intv)
: expiration(exp), cb(std::move(callback)), repeat(rep), interval(intv) {}
// 新增部分:用于优先队列排序(按时间从小到大)
bool operator<(const TimerTask& other) const {
return expiration > other.expiration; // 小顶堆
}
};
using TimerQueue = std::priority_queue<TimerTask, std::vector<TimerTask>, std::greater<TimerTask>>;
void addTimer(TimePoint expiration, Callback cb, bool repeat, std::chrono::milliseconds interval);
void processTimers();
void advanceWheel();
size_t getCurrentTick() const;
static constexpr size_t WHEEL_SIZE = 60; // 时间轮槽数
static constexpr int WHEEL_INTERVAL = 1000; // 每个槽的时间间隔ms
Epoll epoll_{};
Map<int, Event_t*> callbacks_;
std::mutex mutex_;
std::atomic<bool> running;
// 时间轮实现
std::vector<std::priority_queue<TimerTask>> wheel_;
size_t current_tick_ = 0;
TimePoint last_tick_ = std::chrono::steady_clock::now();
// 用于定时器触发的epoll事件
struct epoll_event event_;
int next_timer_id_ = 0;
};
}
#endif