[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()相呼应

