code
static VALUE grpc_rb_fork_unsafe_begin_api() { grpc_rb_fork_unsafe_begin(); }
static VALUE grpc_rb_fork_unsafe_end_api() { grpc_rb_fork_unsafe_end(); }
// One-time initialization
void Init_grpc_c() {
if (!grpc_rb_load_core()) {
rb_raise(rb_eLoadError, "Couldn't find or load gRPC's dynamic C core");
return;
}
rb_global_variable(&g_bg_thread_init_rb_mu);
g_bg_thread_init_rb_mu = rb_mutex_new();
grpc_rb_mGRPC = rb_define_module("GRPC");
grpc_rb_mGrpcCore = rb_define_module_under(grpc_rb_mGRPC, "Core");
grpc_rb_sNewServerRpc = rb_struct_define(
"NewServerRpc", "method", "host", "deadline", "metadata", "call", NULL);
rb_global_variable(&grpc_rb_sStatus);
grpc_rb_sStatus = rb_const_get(rb_cStruct, rb_intern("Status"));
sym_code = ID2SYM(rb_intern("code"));
sym_details = ID2SYM(rb_intern("details"));
sym_metadata = ID2SYM(rb_intern("metadata"));
// init C-defined classes
Init_grpc_channel();
Init_grpc_call();
Init_grpc_call_credentials();
Init_grpc_channel_credentials();
Init_grpc_xds_channel_credentials();
Init_grpc_server();
Init_grpc_server_credentials();
Init_grpc_xds_server_credentials();
Init_grpc_time_consts();
Init_grpc_compression_options();
// define fork APIs
rb_define_module_function(grpc_rb_mGRPC, "prefork", grpc_rb_prefork, 0);
rb_define_module_function(grpc_rb_mGRPC, "postfork_child",
grpc_rb_postfork_child, 0);
rb_define_module_function(grpc_rb_mGRPC, "postfork_parent",
grpc_rb_postfork_parent, 0);
rb_define_module_function(grpc_rb_mGrpcCore, "fork_unsafe_begin",
grpc_rb_fork_unsafe_begin_api, 0);
rb_define_module_function(grpc_rb_mGrpcCore, "fork_unsafe_end",
grpc_rb_fork_unsafe_end_api, 0);
}