#pragma once #include #include #include #include #include #include #include #include #include #include #include #include"Epoll.h" #include"Channel.h" #include"Connection.h" class Channel; class Epoll; class Connection; using spConnection=std::shared_ptr; class EventLoop { private: int timeval_; //定时器周期 int timeout_; //超时界限,每隔timeval_处理超过timeout_无信息交换的连接 std::unique_ptr epoll_; //生命周期和EventLoop一样,析构 pid_t threadID_; //线程ID std::mutex mutex_; int wakefd_; std::unique_ptr wakeChannel_; std::queue> taskQueue_; int tfd_; std::unique_ptr timeChannel_; //定时器Channel bool mainLoop_; //是否是主事件循环(仅受理新连接) std::map connections_; //存储该事件循环的连接(仅子EventLoop有) std::function timeOutCB; //处理超时的回调函数 std::mutex mmutex_; std::atomic stop_; public: EventLoop(bool _mainLoop,int _timeval=30,int _timeut=300); //构造函数 ~EventLoop(); //析构函数:epoll_ void run(); //事件循环 void UpdateChannel(Channel *ch); //调用Epoll的update void removeChannel(Channel *ch); //清楚Channel bool isLoopThread(); //判断当前线程是否为事件循环线程 void wakeUp(); void HandleWake(); void addTaskLoop(std::function); void HandleAlarm(); void newConnection(spConnection _newConnection); void SetTimeOutCB(std::function); void Stop(); void DelConnection(int fd); //删除map中fd对应Connection };