前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GRPC-C++源码分析(十五)--Start续

GRPC-C++源码分析(十五)--Start续

原创
作者头像
路小饭
修改2019-04-25 18:34:34
1.7K0
修改2019-04-25 18:34:34
举报

2.2 具体函数逻辑

2.2.1 PollForWork

先看PollForWork部分逻辑,PollForWork在for循环中epoll_wait等待client链接

下面先介绍accept描述符的建立和注册

15-1
15-1
  • 当前在epoll中注册的是listen描述符,当有请求链接时,会触发fd_become_readable,继而调用on_read方法
  • 在十三章的1.1-4图中已经介绍了on_read方法是怎样被调用的,红框的grpc_fd_notify_on_read已经提前设置了该方法
  • 箭头2:蓝色框中的代码描述了把accept描述放到不同的pollsets中,也就是放到不同的epoll模型中
  • 箭头3:创建了新的epollfd,并把listenfd和acceptfd都注册到了新的epollfd中
  • 箭头5:前面已经建立了accept描述符,后续会调用on_accept为接受数据做准备
    • 注意,在grpc_tcp_create中,有个vtable和tcp_handle_read会在后面用到,看代码时候不要忽略掉

继续看下箭头5on_accept函数的流程

15-2
15-2
  • 把pollset放到了pollset_set中

继续看箭头3 on_handshake_done流程

15-3
15-3
  • 15-3图只是一个简图,其中很多细节逻辑并没有标出来。只是为了说明主流程
  • 注意蓝色的箭头,分别是write_action_begin_locked任务进入combiner_data里,read_action_locked任务进入clousre_list里,这样在后面grpc_core::ExecCtx::Get()->Flush()时候,就会执行到它们
  • 可以对照第十四章的14-2图进行理解

当上面的accept工作完成后,epoll会继续等待具体请求内容的到来并处理,这一部分的工作模式与上面是一样的,由于个人精力问题,没有再去详细整理,欢迎小伙伴补充。抓住两个核心:tcp_send(tcp_posix.cc)、tcp_do_read(tcp_posix.cc),它们别分负责写和读

后面剩下的一点内容是DoWork,将在十六章说明

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.2 具体函数逻辑
    • 2.2.1 PollForWork
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档