专栏首页C++开源框架源码分析GRPC-C++源码分析(十二)--Start
原创

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

对应《GRPC-C++源码分析(三)--main线程》中1.6节

这一节可能才是最核心的部分,包括大家理解的怎样注册listen和accept描述符,怎样处理读写事件,怎样处理业务逻辑等等。

由于这部分涉及的方面太多了,笔者也只是梳理出了核心的部分供参考,欢迎有精力的小伙伴继续补充。

server->Start(cqs_data, cqs_.size());

在Server::Start的实现中,主要分两部分

//第一部分
grpc_server_start(server_);
  • 建立epoll,listen描述符注册
  //第二部分
  for (auto it = sync_req_mgrs_.begin(); it != sync_req_mgrs_.end(); it++) {
    (*it)->Start();
  }
  • accept描述符注册,读写事件响应,处理注册的service业务逻辑

下面对这两部分分别进行解释

1 grpc_server_start

在grpc_server_start函数中也分两部分说明:

//第一部分
  for (i = 0; i < server->cq_count; i++) {
    if (grpc_cq_can_listen(server->cqs[i])) {
      server->pollsets[server->pollset_count++] =
          grpc_cq_pollset(server->cqs[i]);
    }
  }
  • 重点理解server->pollsets[server->pollset_count++]=grpc_cq_pollset(server->cqs[i]);看下图

  • 一句话,把cqs中的grpc_pollset指针放到grpc_server的指针数组pollsets中
//第二部分
  GRPC_CLOSURE_SCHED(
      GRPC_CLOSURE_CREATE(
          start_listeners, server,
          grpc_core::Executor::Scheduler(grpc_core::ExecutorJobType::SHORT)),
      GRPC_ERROR_NONE);
  • 这块代码对应了《GRPC-C++源码分析(二)--线程模型》中将start_listeners放入default-excutor线程中执行
  • 跟踪下grpc_core::Executor::Scheduler可以清晰看到最终调用的是grpc_closure_list_append方法

  • 《GRPC-C++源码分析(十一)--bind&listen》中的server_start_listener在这里被调用了
  • 下面继续看server_start_listener方法

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • GRPC-C++源码分析(三)--main线程

    如果没有特殊喜好,推荐从example/cpp/helloworld/greeter_server.cc开始阅读。前期分析的是同步部分的代码。

    路小饭
  • GRPC-C++源码分析(十一)--bind&listen

    路小饭
  • GRPC-C++源码分析(九)--Server

    对应《GRPC-C++源码分析(三)--main线程》中的1.2节 创建Server

    路小饭
  • Github上基于lodash和lowdb json查询服务器json-server

    Github上基于lodash和lowdb json查询服务器json-server

    MiaoGIS
  • 创建Linux服务,轻松管理(自启动,恢复)进程

    有这样一个场景,在一台服务器上,我们想要启动一个简单的网络文件服务器,用来提供给内网的用户下载。

    技术小黑屋
  • 西湖论剑回顾 | 网络安全创新成果分享之智慧城市数据管理创新

    2018年4月27日,“西湖论剑·网络安全大会”在杭州国际博览中心隆重举办。大会积极响应习近平总书记在全国网络安全和信息化工作会议上“敏锐抓住信息化发展历史机遇...

    安恒信息
  • Linux中父进程为何要苦苦地知道子进程的死亡原因?

    一个普遍的常识是,在Linux里面总是“白发人送黑发人”,子进程死亡,父进程透过wait()等待子进程死亡,并清理子进程僵尸,当然父进程也可以因此而获得子进程的...

    Linux阅码场
  • Newtonsoft中Json和Xml的转换

    小狐狸
  • 二进制安装k8s集群(2)-制作ssl证书

    在上一篇文章里我们大致介绍了安装 k8s集群需要安装哪些组件以及我们的环境,在这篇文章里我们主要介绍制作ssl证书,我们以制作docker server和doc...

    TA码字
  • LintCode 插入区间题目分析代码

    给出一个无重叠的按照区间起始端点排序的区间列表。 在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠 (如果有必要的话,可以合并区间)。

    desperate633

扫码关注云+社区

领取腾讯云代金券