static void grpc_ruby_init_threads() { // Avoid calling into ruby library (when creating threads here) // in gpr_once_init. In general, it appears to be unsafe to call // into the ruby library while holding a non-ruby mutex, because a gil yield // could end up trying to lock onto that same mutex and deadlocking. rb_mutex_lock(bg_thread_init_rb_mu); if (!bg_thread_init_done) { grpc_rb_event_queue_thread_start(); grpc_rb_channel_polling_thread_start(); bg_thread_init_done = 1; } rb_mutex_unlock(bg_thread_init_rb_mu); }
void Init_grpc_call_credentials() { grpc_rb_cCallCredentials = rb_define_class_under(grpc_rb_mGrpcCore, "CallCredentials", rb_cObject); /* Allocates an object managed by the ruby runtime */ rb_define_alloc_func(grpc_rb_cCallCredentials, grpc_rb_call_credentials_alloc); /* Provides a ruby constructor and support for dup/clone. */ rb_define_method(grpc_rb_cCallCredentials, "initialize", grpc_rb_call_credentials_init, 1); rb_define_method(grpc_rb_cCallCredentials, "initialize_copy", grpc_rb_call_credentials_init_copy, 1); rb_define_method(grpc_rb_cCallCredentials, "compose", grpc_rb_call_credentials_compose, -1); id_callback = rb_intern("__callback"); grpc_rb_event_queue_thread_start(); }