对应《GRPC-C++源码分析(三)--main线程》中的1.1节 初始化ServerCompletionQueue
先来看下ServerCompletionQueue的整体结构
ServerCompletionQueue的核心在于创建了grpc_completion_queue* cq_,见其父类CompletionQueue的构造函数
CompletionQueue(const grpc_completion_queue_attributes& attributes) {
cq_ = g_core_codegen_interface->grpc_completion_queue_create(
g_core_codegen_interface->grpc_completion_queue_factory_lookup(
&attributes),
&attributes, NULL);
InitialAvalanching(); // reserve this for the future shutdown
}
而CompletionQueue则继承了GrpcLibraryCodegen。了解ServerCompletionQueue类需要我们从顶级父类一层层分析
class GrpcLibraryCodegen {
public:
GrpcLibraryCodegen(bool call_grpc_init = true) : grpc_init_called_(false) {
if (call_grpc_init) {
GPR_CODEGEN_ASSERT(g_glip &&
"gRPC library not initialized. See "
"grpc::internal::GrpcLibraryInitializer.");
g_glip->init();
grpc_init_called_ = true;
}
}
GrpcLibraryCodegen极为简单,仅仅调用了g_glip->init();所以重点在g_glip上,让我们看看它的来源
class GrpcLibraryInitializer final {
public:
GrpcLibraryInitializer() {
if (grpc::g_glip == nullptr) {
static auto* const g_gli = new GrpcLibrary();
grpc::g_glip = g_gli;
}
if (grpc::g_core_codegen_interface == nullptr) {
static auto* const g_core_codegen = new CoreCodegen();
grpc::g_core_codegen_interface = g_core_codegen;
}
}
class GrpcLibrary final : public GrpcLibraryInterface {
public:
void init() override { grpc_init(); }
void shutdown() override { grpc_shutdown(); }
};
顾名思义,grpc_init代表的是初始化grpc核心参数,所以在此方法中,可以看到n多*_init()方法,目前先把注意力放在grpc_iomgr_init();
//executor.cc
void Executor::InitAll() {
EXECUTOR_TRACE0("Executor::InitAll() enter");
// Return if Executor::InitAll() is already called earlier
if (executors[static_cast<size_t>(ExecutorType::DEFAULT)] != nullptr) {
GPR_ASSERT(executors[static_cast<size_t>(ExecutorType::RESOLVER)] !=
nullptr);
return;
}
executors[static_cast<size_t>(ExecutorType::DEFAULT)] =
grpc_core::New<Executor>("default-executor");
executors[static_cast<size_t>(ExecutorType::RESOLVER)] =
grpc_core::New<Executor>("resolver-executor");
executors[static_cast<size_t>(ExecutorType::DEFAULT)]->Init();
executors[static_cast<size_t>(ExecutorType::RESOLVER)]->Init();
EXECUTOR_TRACE0("Executor::InitAll() done");
}
grpc_determine_iomgr_platform和grpc_iomgr_platform_init方法我们放在下一章统一说明
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。