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

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

原创
作者头像
路小饭
修改2019-04-24 11:12:36
1.2K0
修改2019-04-24 11:12:36
举报
文章被收录于专栏:C++开源框架源码分析

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

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

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

代码语言:javascript
复制
server->Start(cqs_data, cqs_.size());

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

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

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

1 grpc_server_start

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

代码语言:javascript
复制
//第一部分
  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中
代码语言:javascript
复制
//第二部分
  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方法

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 grpc_server_start
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档