当前位置: 首页 > news >正文

[FDBUS4.2] watcher的使用

fdbus的CFdbContext线程主要用于处理消息收发,是通过CFdEventLoop::dispatch()中的poll方法来触发。
本文主要介绍fdbus中watcher的使用及poll触发。
在这里插入图片描述
poll()中的pollfds的创建是在buildFdArray()方法中,通过轮询mWatchWorkingList中的watcher来实现,而watcher为CSysFdWatch实例出的对象。
在这里插入图片描述
CSysFdWatch实例出的对象主要为CServerSocketCFdbSessionCNotifyFdWatch

1、CServerSocket

server执行bind后,这里的worker为FDB_CONTEXT
在这里插入图片描述
将CAttachWatchJob同步添加到job队列中
在这里插入图片描述
在run()方法中将当前CServerSocket添加到CFdEventLoop的mWatchList和mWatchWorkingList中

  1. 将当前CServerSocket添加到CFdEventLoop的mWatchList中
    在这里插入图片描述
    在这里插入图片描述
  2. 将当前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()相呼应
在这里插入图片描述

http://www.lryc.cn/news/592726.html

相关文章:

  • 利用五边形几何关系计算cos36°及推导黄金比例
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | NotesApp(便签笔记组件)
  • 深入理解 Spring:事务管理与事件机制全解析
  • 如何将本地Git仓库推送到远程仓库的一个文件中并保留Commit记录
  • 借助AI学习开源代码git0.7之三git-init-db
  • RoboBrain 2.0(具身智能论文阅读)
  • Deep Multi-scale Convolutional Neural Network for Dynamic Scene Deblurring 论文阅读
  • Visual Studio C++编译器优化等级详解:配置、原理与编码实践
  • 【iOS】消息传递和消息转发
  • gitlab-runner配置问题记录
  • 洞见AI时代数据底座的思考——YashanDB亮相2025可信数据库发展大会
  • 【C++】——类和对象(中)——默认成员函数
  • LVS(Linux Virtual Server)详细笔记(实战篇)
  • 怎么判断一个对象是不是vue的实例
  • 前端自动化测试:Jest、Puppeteer
  • Rust交叉编译自动化实战
  • 车载监控录像系统:智能安全驾驶的守护者
  • 模式结构-微服务架构设计模式
  • CUPED (Controlled-experiment using Pre-Experiment Data) 论文学习笔记
  • web安全漏洞的原理、危害、利用方式及修复方法
  • AI 驱动的仪表板:从愿景到 Kibana
  • 游戏盾能否保护业务免受DDoS攻击吗?
  • 基于单片机直流电机测速中文液晶显示设计
  • 查找服务器上存在线程泄露的进程
  • 【c++】STL-容器 list 的实现
  • 【leetcode】3201. 找出有效子序列的最大长度(1)
  • C++ -- STL-- stack and queue
  • Python基础④-装饰器、迭代器及常用函数篇
  • [Linux]如何設置靜態IP位址?
  • setTimeout、setInterval、requestAnimationFrame的使用以及区别