muduo库的学习5---loop的基本设计---Channel细节

来源:互联网 发布:淘宝图片怎么上传清晰 编辑:程序博客网 时间:2024/06/08 05:58

类似于EventLoop的分析,忽略一些次要成员。

1.类定义

class Channel{typedef boost::function<void()> EventCallback;typedef boost::function<void(Timestamp)> ReadEventCallback;/***************Function Member******************///bind with loop and fdChannel(EventLoop* loop, int fd);~Channel();//bind with callbackvoid setReadCallBack(const ReadEventCallback& cb);void setWriteCallBack(const EventCallback& cb);void setCloseCallBack(cosnt EventCallback& cb);void setErrorCallBack(const EventCallback& cb);//change channel in Pollervoid enableReading();void enableWriting();void disableReading();void disableWriting();void update();void remove();//key functionvoid handleEvent(Timerstamp receiveTime);/*************Data Member***********************///bind with loop and fdEventLoop* loop;const int fd;//bind with callbackReadEventCallback readCallback;EventCallback writeCallback;EventCallback closeCallback;EventCallback errorCallback;//change channel in Pollerconst int fd;int events;int revents;}


2.channel与libev中的watcher对比

①init               <------------>         Channel::setXXXCallback()        

②set               <------------>         Channel::enablingXXX()

③start             <------------>         Channel::update()

④stop             <------------>         Channel::remove()


当然这只是功能上大体对应,并不是严格对应。

比如enablingXXX本身就包含了设定监听的具体内容(read/write)以及调用update


3.三种channel

在loop这几个文件的学习之中,目前共遇到3种channel(从处理fd上来说)

IO channel---socketfd

Timer channel---timerfd

wakeup channel---eventfd

(1)IO channel

其操作由用户来指定,各种功能操作被封装到更高层的类里面

(2)Timer channel

①New

TimerQueue::TimerQueue()

②SetCallback

TimerQueue::TimerQueue()

③Enablingxxx

TimerQueue::TimerQueue()

TimerQueue::addTimer()

④HandleEvent

TimerQueue::handleRead()

⑤Remove

TimerQueue::cancel()

TimerQueue::~TimerQueue()


(3)Wakeup channel

①New

EventLoop::EventLoop()

②SetCallback

EventLoop::EventLoop()

③Enablingxxx

EventLoop::EventLoop()

EventLoop::runInLoop()

④HandleEvent

EventLoop::doPendingFunctors()

⑤Remove

EventLoop::RemoveChannel()

EventLoop::~EventLoop()


0 0