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

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

原创
作者头像
路小饭
修改2019-04-24 10:42:23
1.4K0
修改2019-04-24 10:42:23
举报

1.1 server_start_listener

这个函数完成了epoll的创建,listen描述符的注册

1.1-1
1.1-1
  • server_start_listener最终调用的是tcp_server_start
  • 分段解释下tcp_server_start
//tcp_server_posix.cc
  static void tcp_server_start(grpc_tcp_server* s, grpc_pollset** pollsets,
                             size_t pollset_count,
                             grpc_tcp_server_cb on_accept_cb,
                             void* on_accept_cb_arg) {
  size_t i;
  grpc_tcp_listener* sp;
  GPR_ASSERT(on_accept_cb);
  gpr_mu_lock(&s->mu);
  GPR_ASSERT(!s->on_accept_cb);
  GPR_ASSERT(s->active_ports == 0);
  s->on_accept_cb = on_accept_cb;
  s->on_accept_cb_arg = on_accept_cb_arg;
  s->pollsets = pollsets;
  s->pollset_count = pollset_count;
  sp = s->head;

1.1-2
1.1-2
  • 上图没有复杂东西,画出来帮助理解赋值关系而已
  • 注意右边的active_pollable,后面继续调用的grpc_pollset_add_fd方法,把创建epoll的描述符epfd放到了这里
      for (i = 0; i < pollset_count; i++) {
        grpc_pollset_add_fd(pollsets[i], sp->emfd);
      }

1.1-3
1.1-3
  • epoll的创建,描述符的注册见上图的蓝色框
  • epoll的描述符epfd保存在了1.1-2图里的pollable里
      GRPC_CLOSURE_INIT(&sp->read_closure, on_read, sp,
                        grpc_schedule_on_exec_ctx);
      grpc_fd_notify_on_read(sp->emfd, &sp->read_closure);
  • GRPC_CLOSURE_INIT简单的理解为将on_read方法绑定在sp->read_closure中即可
  • grpc_fd_notify_on_read的实现见1.1-4
1.1-4
1.1-4
  • grpc_fd_notify_on_read设置完的东西,在1.1-4图中粉色虚线框里的fd_become_readable方法中使用
  • 大体意思是将on_read方法绑定在sp->read_closure,然后将sp->read_closure再绑定在sp->emfd->read_closure里。这些绑定会在后面的fd_become_readable中用到

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

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

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

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

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