[FDBUS4.2] watcher的使用
fdbus的CFdbContext线程主要用于处理消息收发,是通过CFdEventLoop::dispatch()中的poll方法来触发。
本文主要介绍fdbus中watcher的使用及poll触发。
poll()中的pollfds的创建是在buildFdArray()方法中,通过轮询mWatchWorkingList中的watcher来实现,而watcher为CSysFdWatch实例出的对象。
CSysFdWatch实例出的对象主要为CServerSocket、CFdbSession和CNotifyFdWatch。
1、CServerSocket
server执行bind后,这里的worker为FDB_CONTEXT
将CAttachWatchJob同步添加到job队列中
在run()方法中将当前CServerSocket添加到CFdEventLoop的mWatchList和mWatchWorkingList中
- 将当前CServerSocket添加到CFdEventLoop的mWatchList中
- 将当前CServerSocket添加到CFdEventLoop的mWatchList和mWatchWorkingList中
这里默认是立刻使能
enb最终传到enable
下面就是对于mWatchWorkingList的处理
其中主要为如下操作,构建mPollFds和mPollWatches
注意这里的第151行。
poll时会根据events的标志位来设置fd,进而触发select()方法。而events=flags
而flags的标志位,主要设置在构造函数中
CServerSocket构造函数
CFdbSession构造函数
CNotifyFdWatch构造函数
如上,目前还没有POLLOUT。
触发poll()后,接下来就进行timers或watchers的处理。
在watcher又会用到这个events的标志位
2、CFdbSession
CFdbSession的onInput()方法如下,主要是消息的接收处理,并触发onInvoke,onReply,onBroadcast,onStatus,onSubscribe的回调
而CFdbSession的创建,主要在CBaseClient和CBaseServer中
在Client端connect操作时创建CFdbSession
在Server端bind成功后,触发onInput时创建CFdbSession
3、CNotifyFdWatch
在CFdEventLoop::init方法中创建了CNotifyFdWatch并添加watch
当FDB_CONTEXT执行send操作进而触发job入队时
就会触发notify
与CNotifyFdWatch::onInput中的mEventFd.pickEvent()相呼应