文章目录
- 设计
- 知识点
设计
IO协程调度模块,整个项目里最重要的模块~
和 协程调度模块 相比,增加了 IO 事件的 触发条件。
所以需要重新封装 Event 事件, 通过 epoll_wait 监测触发事件(重新实现了idle), addEvent,addConditionEvent, delEvent ~
// 省略 互斥 和 ptr
class IOManager : public Scheduler{
public:// IO事件,使用 epoll 事件的定义// 和 epoll_event 一样,可以使用 | 操作。enum Event{NONE = 0x0,READ = 0x1,WRITE = 0x4,}
private:// 重新封装了一遍 带事件触发的fd。类似于read,write ~// 这里和hook模块里的 fd_manager不太一样。// fd_manager是侧重于 管理所有的 fd,以及记录是否是socket类型// FdContext 侧重于记录 触发条件 以及 触发事件。struct FdContext{// 封装 执行事件回调的调度器,回调协程,回调函数。struct EventContext{Scheduler* scheduler = nullptr;Fiber::ptr fiber;std::function<void()> cb;};EventContext& getEventContex(Event event);void resetEventContext(EventContext& ctx);void triggerEvent(Event event);// 读事件上下文EventContext read;// 写事件上下文EventContext write;// 事件关联句柄int fd = 0;// 注册事件Event events = NONE;};
};