首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

GRPC-C++源码分析(七)--ServerCompletionQueue续

3.2.1 cq初始化

代码语言:txt
复制
cq = static_cast<grpc_completion_queue*>(
      gpr_zalloc(sizeof(grpc_completion_queue) + vtable->data_size +
                 poller_vtable->size()));
  • vtable->data_size为 sizeof(cq_next_data)
  • poller_vtable->size为 grpc_pollset_size

稍微解释下grpc_pollset_size:

代码语言:txt
复制
size_t grpc_pollset_size(void) { return grpc_pollset_impl->pollset_size(); }
  • 这里的grpc_pollset_impl的值来自2.1.2节 grpc_determine_iomgr_platform中定义的方法grpc_set_pollset_vtable
  • grpc_pollset_impl->pollset_size()调用的是下面代码中的pollset_size
代码语言:txt
复制
//ev_posix.cc
  grpc_pollset_vtable grpc_posix_pollset_vtable = {
    pollset_global_init, pollset_global_shutdown,
    pollset_init,        pollset_shutdown,
    pollset_destroy,     pollset_work,
    pollset_kick,        pollset_size};
  • 蛋疼的是这还不算完事儿,pollset_size也是个方法
代码语言:txt
复制
static size_t pollset_size(void) { return g_event_engine->pollset_size; }
  • 是不是终于看到了熟悉的面孔:g_event_engine,是的,它就是2.1.4节 grpc_iomgr_platform_init方法后得到的全局变量
  • 所以最终 grpc_pollset_size的取值是sizeof(grpc_pollset)
代码语言:txt
复制
//ev_epollex_linux.cc
static const grpc_event_engine_vtable vtable = {
    sizeof(grpc_pollset),//第一个
    ………………

3.2.2 vtable的初始化

先来看第一句:

代码语言:txt
复制
poller_vtable->init(POLLSET_FROM_CQ(cq), &cq->mu);
  • POLLSET_FROM_CQ本质是个grpc_pollset* pollset,指向的是cq额外开辟的空间

  • 可以这样理解,poller_vtable->init其实是在初始化cq中的grpc_pollset
  • 箭头3中又遇到了3.2.1节中老朋友grpc_pollset_impl,所以调用关系参看上图就可以了
  • poller_vtable->init最终调用的是ev_epollex_linux.cc文件中的pollset_init方法

再来看第二句

代码语言:javascript
复制
vtable->init(DATA_FROM_CQ(cq), shutdown_callback);

  • 没啥好说的,代码很清晰
下一篇
举报
领券