文章目錄
- 設計
- 知識點
設計
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;};
};