grpc 1.18.0 → 1.19.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +301 -33
  3. data/include/grpc/grpc_security.h +195 -0
  4. data/include/grpc/impl/codegen/grpc_types.h +17 -1
  5. data/include/grpc/impl/codegen/port_platform.h +36 -0
  6. data/include/grpc/impl/codegen/slice.h +1 -1
  7. data/src/core/ext/filters/client_channel/channel_connectivity.cc +2 -0
  8. data/src/core/ext/filters/client_channel/client_channel.cc +74 -69
  9. data/src/core/ext/filters/client_channel/client_channel.h +2 -2
  10. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +5 -6
  11. data/src/core/ext/filters/client_channel/client_channel_channelz.h +5 -4
  12. data/src/core/ext/filters/client_channel/client_channel_factory.cc +2 -2
  13. data/src/core/ext/filters/client_channel/client_channel_factory.h +4 -4
  14. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +3 -3
  15. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +176 -0
  16. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +68 -0
  17. data/src/core/ext/filters/client_channel/health/health_check_client.cc +10 -8
  18. data/src/core/ext/filters/client_channel/health/health_check_client.h +1 -1
  19. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +146 -156
  20. data/src/core/ext/filters/client_channel/lb_policy.cc +30 -1
  21. data/src/core/ext/filters/client_channel/lb_policy.h +29 -1
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +28 -30
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -8
  24. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +5 -8
  25. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +23 -24
  26. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +80 -15
  27. data/src/core/ext/filters/client_channel/lb_policy_factory.h +6 -1
  28. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +2 -2
  29. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  30. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +96 -0
  31. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +56 -0
  32. data/src/core/ext/filters/client_channel/parse_address.cc +24 -5
  33. data/src/core/ext/filters/client_channel/request_routing.cc +13 -3
  34. data/src/core/ext/filters/client_channel/request_routing.h +5 -1
  35. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -6
  36. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +2 -2
  37. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -35
  38. data/src/core/ext/filters/client_channel/subchannel.cc +698 -791
  39. data/src/core/ext/filters/client_channel/subchannel.h +213 -123
  40. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +97 -0
  41. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +94 -0
  42. data/src/core/ext/filters/http/client_authority_filter.cc +5 -2
  43. data/src/core/ext/filters/max_age/max_age_filter.cc +1 -1
  44. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +13 -12
  45. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +5 -7
  46. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +19 -27
  47. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +18 -19
  48. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +27 -6
  49. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -1
  50. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +3 -2
  51. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
  52. data/src/core/ext/transport/chttp2/transport/writing.cc +8 -5
  53. data/src/core/lib/channel/handshaker.cc +141 -214
  54. data/src/core/lib/channel/handshaker.h +110 -101
  55. data/src/core/lib/channel/handshaker_factory.h +11 -19
  56. data/src/core/lib/channel/handshaker_registry.cc +64 -52
  57. data/src/core/lib/channel/handshaker_registry.h +21 -16
  58. data/src/core/lib/gpr/log_posix.cc +2 -1
  59. data/src/core/lib/gpr/time.cc +8 -0
  60. data/src/core/lib/gpr/time_posix.cc +8 -2
  61. data/src/core/lib/gprpp/optional.h +47 -0
  62. data/src/core/lib/http/httpcli_security_connector.cc +13 -14
  63. data/src/core/lib/iomgr/buffer_list.cc +182 -24
  64. data/src/core/lib/iomgr/buffer_list.h +70 -8
  65. data/src/core/lib/iomgr/combiner.cc +11 -3
  66. data/src/core/lib/iomgr/error.cc +9 -5
  67. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -0
  68. data/src/core/lib/iomgr/ev_epollex_linux.cc +136 -162
  69. data/src/core/lib/iomgr/ev_poll_posix.cc +3 -0
  70. data/src/core/lib/iomgr/ev_posix.cc +4 -0
  71. data/src/core/lib/iomgr/ev_posix.h +4 -0
  72. data/src/core/lib/iomgr/exec_ctx.cc +1 -0
  73. data/src/core/lib/iomgr/exec_ctx.h +137 -8
  74. data/src/core/lib/iomgr/executor.cc +122 -87
  75. data/src/core/lib/iomgr/executor.h +53 -48
  76. data/src/core/lib/iomgr/fork_posix.cc +6 -4
  77. data/src/core/lib/iomgr/{network_status_tracker.cc → grpc_if_nametoindex.h} +8 -14
  78. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +42 -0
  79. data/src/core/lib/iomgr/{network_status_tracker.h → grpc_if_nametoindex_unsupported.cc} +15 -9
  80. data/src/core/lib/iomgr/internal_errqueue.h +105 -3
  81. data/src/core/lib/iomgr/iomgr.cc +6 -5
  82. data/src/core/lib/iomgr/iomgr.h +8 -0
  83. data/src/core/lib/iomgr/iomgr_custom.cc +6 -2
  84. data/src/core/lib/iomgr/iomgr_internal.cc +4 -0
  85. data/src/core/lib/iomgr/iomgr_internal.h +4 -0
  86. data/src/core/lib/iomgr/iomgr_posix.cc +10 -1
  87. data/src/core/lib/iomgr/iomgr_windows.cc +8 -1
  88. data/src/core/lib/iomgr/port.h +1 -0
  89. data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
  90. data/src/core/lib/iomgr/resolve_address_windows.cc +2 -1
  91. data/src/core/lib/iomgr/tcp_custom.cc +0 -4
  92. data/src/core/lib/iomgr/tcp_posix.cc +58 -44
  93. data/src/core/lib/iomgr/tcp_uv.cc +0 -1
  94. data/src/core/lib/iomgr/tcp_windows.cc +0 -4
  95. data/src/core/lib/iomgr/timer_manager.cc +8 -0
  96. data/src/core/lib/iomgr/udp_server.cc +6 -4
  97. data/src/core/lib/json/json.cc +1 -4
  98. data/src/core/lib/security/credentials/alts/alts_credentials.cc +1 -1
  99. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
  100. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -0
  101. data/src/core/lib/security/credentials/credentials.h +9 -1
  102. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -2
  103. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -0
  104. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  105. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -0
  106. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +3 -2
  107. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +2 -2
  108. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -0
  109. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +192 -0
  110. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +213 -0
  111. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -8
  112. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +6 -10
  113. data/src/core/lib/security/security_connector/local/local_security_connector.cc +10 -8
  114. data/src/core/lib/security/security_connector/security_connector.h +2 -2
  115. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -6
  116. data/src/core/lib/security/security_connector/ssl_utils.h +33 -0
  117. data/src/core/lib/security/transport/security_handshaker.cc +267 -300
  118. data/src/core/lib/security/transport/security_handshaker.h +11 -2
  119. data/src/core/lib/security/transport/server_auth_filter.cc +1 -0
  120. data/src/core/lib/surface/call.cc +5 -1
  121. data/src/core/lib/surface/channel_init.h +5 -0
  122. data/src/core/lib/surface/completion_queue.cc +4 -7
  123. data/src/core/lib/surface/init.cc +5 -3
  124. data/src/core/lib/surface/init_secure.cc +1 -1
  125. data/src/core/lib/surface/server.cc +19 -17
  126. data/src/core/lib/surface/version.cc +1 -1
  127. data/src/core/lib/transport/service_config.h +1 -0
  128. data/src/core/lib/transport/static_metadata.cc +279 -279
  129. data/src/core/lib/transport/transport.cc +5 -3
  130. data/src/core/tsi/ssl_transport_security.cc +10 -4
  131. data/src/ruby/ext/grpc/extconf.rb +12 -4
  132. data/src/ruby/ext/grpc/rb_call_credentials.c +8 -5
  133. data/src/ruby/ext/grpc/rb_channel.c +14 -10
  134. data/src/ruby/ext/grpc/rb_channel_credentials.c +8 -4
  135. data/src/ruby/ext/grpc/rb_compression_options.c +9 -7
  136. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  137. data/src/ruby/ext/grpc/rb_grpc.c +22 -23
  138. data/src/ruby/ext/grpc/rb_grpc.h +4 -2
  139. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +18 -0
  140. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +27 -0
  141. data/src/ruby/ext/grpc/rb_server.c +8 -4
  142. data/src/ruby/lib/grpc/version.rb +1 -1
  143. metadata +46 -39
  144. data/src/core/ext/filters/client_channel/subchannel_index.cc +0 -248
  145. data/src/core/ext/filters/client_channel/subchannel_index.h +0 -76
  146. data/src/core/lib/channel/handshaker_factory.cc +0 -42
@@ -30,6 +30,7 @@
30
30
  #include "src/core/lib/gpr/alloc.h"
31
31
  #include "src/core/lib/gpr/string.h"
32
32
  #include "src/core/lib/iomgr/executor.h"
33
+ #include "src/core/lib/iomgr/iomgr.h"
33
34
  #include "src/core/lib/slice/slice_internal.h"
34
35
  #include "src/core/lib/slice/slice_string_helpers.h"
35
36
  #include "src/core/lib/transport/transport_impl.h"
@@ -63,8 +64,9 @@ void grpc_stream_unref(grpc_stream_refcount* refcount, const char* reason) {
63
64
  void grpc_stream_unref(grpc_stream_refcount* refcount) {
64
65
  #endif
65
66
  if (gpr_unref(&refcount->refs)) {
66
- if (grpc_core::ExecCtx::Get()->flags() &
67
- GRPC_EXEC_CTX_FLAG_THREAD_RESOURCE_LOOP) {
67
+ if (!grpc_iomgr_is_any_background_poller_thread() &&
68
+ (grpc_core::ExecCtx::Get()->flags() &
69
+ GRPC_EXEC_CTX_FLAG_THREAD_RESOURCE_LOOP)) {
68
70
  /* Ick.
69
71
  The thread we're running on MAY be owned (indirectly) by a call-stack.
70
72
  If that's the case, destroying the call-stack MAY try to destroy the
@@ -73,7 +75,7 @@ void grpc_stream_unref(grpc_stream_refcount* refcount) {
73
75
  Throw this over to the executor (on a core-owned thread) and process it
74
76
  there. */
75
77
  refcount->destroy.scheduler =
76
- grpc_executor_scheduler(GRPC_EXECUTOR_SHORT);
78
+ grpc_core::Executor::Scheduler(grpc_core::ExecutorJobType::SHORT);
77
79
  }
78
80
  GRPC_CLOSURE_SCHED(&refcount->destroy, GRPC_ERROR_NONE);
79
81
  }
@@ -619,15 +619,19 @@ static tsi_result x509_store_load_certs(X509_STORE* cert_store,
619
619
  sk_X509_NAME_push(*root_names, root_name);
620
620
  root_name = nullptr;
621
621
  }
622
+ ERR_clear_error();
622
623
  if (!X509_STORE_add_cert(cert_store, root)) {
623
- gpr_log(GPR_ERROR, "Could not add root certificate to ssl context.");
624
- result = TSI_INTERNAL_ERROR;
625
- break;
624
+ unsigned long error = ERR_get_error();
625
+ if (ERR_GET_LIB(error) != ERR_LIB_X509 ||
626
+ ERR_GET_REASON(error) != X509_R_CERT_ALREADY_IN_HASH_TABLE) {
627
+ gpr_log(GPR_ERROR, "Could not add root certificate to ssl context.");
628
+ result = TSI_INTERNAL_ERROR;
629
+ break;
630
+ }
626
631
  }
627
632
  X509_free(root);
628
633
  num_roots++;
629
634
  }
630
-
631
635
  if (num_roots == 0) {
632
636
  gpr_log(GPR_ERROR, "Could not load any root certificate.");
633
637
  result = TSI_INVALID_ARGUMENT;
@@ -651,6 +655,8 @@ static tsi_result ssl_ctx_load_verification_certs(SSL_CTX* context,
651
655
  STACK_OF(X509_NAME) *
652
656
  *root_name) {
653
657
  X509_STORE* cert_store = SSL_CTX_get_cert_store(context);
658
+ X509_STORE_set_flags(cert_store,
659
+ X509_V_FLAG_PARTIAL_CHAIN | X509_V_FLAG_TRUSTED_FIRST);
654
660
  return x509_store_load_certs(cert_store, pem_roots, pem_roots_size,
655
661
  root_name);
656
662
  }
@@ -24,10 +24,18 @@ grpc_config = ENV['GRPC_CONFIG'] || 'opt'
24
24
 
25
25
  ENV['MACOSX_DEPLOYMENT_TARGET'] = '10.7'
26
26
 
27
- ENV['AR'] = RbConfig::CONFIG['AR'] + ' rcs'
28
- ENV['CC'] = RbConfig::CONFIG['CC']
29
- ENV['CXX'] = RbConfig::CONFIG['CXX']
30
- ENV['LD'] = ENV['CC']
27
+ if ENV['AR'].nil? || ENV['AR'].size == 0
28
+ ENV['AR'] = RbConfig::CONFIG['AR'] + ' rcs'
29
+ end
30
+ if ENV['CC'].nil? || ENV['CC'].size == 0
31
+ ENV['CC'] = RbConfig::CONFIG['CC']
32
+ end
33
+ if ENV['CXX'].nil? || ENV['CXX'].size == 0
34
+ ENV['CXX'] = RbConfig::CONFIG['CXX']
35
+ end
36
+ if ENV['LD'].nil? || ENV['LD'].size == 0
37
+ ENV['LD'] = ENV['CC']
38
+ end
31
39
 
32
40
  ENV['AR'] = 'libtool -o' if RUBY_PLATFORM =~ /darwin/
33
41
 
@@ -134,8 +134,7 @@ static void grpc_rb_call_credentials_plugin_destroy(void* state) {
134
134
  // Not sure what needs to be done here
135
135
  }
136
136
 
137
- /* Destroys the credentials instances. */
138
- static void grpc_rb_call_credentials_free(void* p) {
137
+ static void grpc_rb_call_credentials_free_internal(void* p) {
139
138
  grpc_rb_call_credentials* wrapper;
140
139
  if (p == NULL) {
141
140
  return;
@@ -143,10 +142,15 @@ static void grpc_rb_call_credentials_free(void* p) {
143
142
  wrapper = (grpc_rb_call_credentials*)p;
144
143
  grpc_call_credentials_release(wrapper->wrapped);
145
144
  wrapper->wrapped = NULL;
146
-
147
145
  xfree(p);
148
146
  }
149
147
 
148
+ /* Destroys the credentials instances. */
149
+ static void grpc_rb_call_credentials_free(void* p) {
150
+ grpc_rb_call_credentials_free_internal(p);
151
+ grpc_ruby_shutdown();
152
+ }
153
+
150
154
  /* Protects the mark object from GC */
151
155
  static void grpc_rb_call_credentials_mark(void* p) {
152
156
  grpc_rb_call_credentials* wrapper = NULL;
@@ -175,6 +179,7 @@ static rb_data_type_t grpc_rb_call_credentials_data_type = {
175
179
  /* Allocates CallCredentials instances.
176
180
  Provides safe initial defaults for the instance fields. */
177
181
  static VALUE grpc_rb_call_credentials_alloc(VALUE cls) {
182
+ grpc_ruby_init();
178
183
  grpc_rb_call_credentials* wrapper = ALLOC(grpc_rb_call_credentials);
179
184
  wrapper->wrapped = NULL;
180
185
  wrapper->mark = Qnil;
@@ -212,8 +217,6 @@ static VALUE grpc_rb_call_credentials_init(VALUE self, VALUE proc) {
212
217
  grpc_call_credentials* creds = NULL;
213
218
  grpc_metadata_credentials_plugin plugin;
214
219
 
215
- grpc_ruby_once_init();
216
-
217
220
  TypedData_Get_Struct(self, grpc_rb_call_credentials,
218
221
  &grpc_rb_call_credentials_data_type, wrapper);
219
222
 
@@ -143,26 +143,29 @@ static void* channel_safe_destroy_without_gil(void* arg) {
143
143
  return NULL;
144
144
  }
145
145
 
146
- /* Destroys Channel instances. */
147
- static void grpc_rb_channel_free(void* p) {
146
+ static void grpc_rb_channel_free_internal(void* p) {
148
147
  grpc_rb_channel* ch = NULL;
149
148
  if (p == NULL) {
150
149
  return;
151
150
  };
152
151
  ch = (grpc_rb_channel*)p;
153
-
154
152
  if (ch->bg_wrapped != NULL) {
155
153
  /* assumption made here: it's ok to directly gpr_mu_lock the global
156
- * connection polling mutex becuse we're in a finalizer,
154
+ * connection polling mutex because we're in a finalizer,
157
155
  * and we can count on this thread to not be interrupted or
158
156
  * yield the gil. */
159
157
  grpc_rb_channel_safe_destroy(ch->bg_wrapped);
160
158
  ch->bg_wrapped = NULL;
161
159
  }
162
-
163
160
  xfree(p);
164
161
  }
165
162
 
163
+ /* Destroys Channel instances. */
164
+ static void grpc_rb_channel_free(void* p) {
165
+ grpc_rb_channel_free_internal(p);
166
+ grpc_ruby_shutdown();
167
+ }
168
+
166
169
  /* Protects the mark object from GC */
167
170
  static void grpc_rb_channel_mark(void* p) {
168
171
  grpc_rb_channel* channel = NULL;
@@ -189,6 +192,7 @@ static rb_data_type_t grpc_channel_data_type = {"grpc_channel",
189
192
 
190
193
  /* Allocates grpc_rb_channel instances. */
191
194
  static VALUE grpc_rb_channel_alloc(VALUE cls) {
195
+ grpc_ruby_init();
192
196
  grpc_rb_channel* wrapper = ALLOC(grpc_rb_channel);
193
197
  wrapper->bg_wrapped = NULL;
194
198
  wrapper->credentials = Qnil;
@@ -216,7 +220,6 @@ static VALUE grpc_rb_channel_init(int argc, VALUE* argv, VALUE self) {
216
220
  int stop_waiting_for_thread_start = 0;
217
221
  MEMZERO(&args, grpc_channel_args, 1);
218
222
 
219
- grpc_ruby_once_init();
220
223
  grpc_ruby_fork_guard();
221
224
  rb_thread_call_without_gvl(
222
225
  wait_until_channel_polling_thread_started_no_gil,
@@ -292,7 +295,7 @@ static void* get_state_without_gil(void* arg) {
292
295
  Indicates the current state of the channel, whose value is one of the
293
296
  constants defined in GRPC::Core::ConnectivityStates.
294
297
 
295
- It also tries to connect if the chennel is idle in the second form. */
298
+ It also tries to connect if the channel is idle in the second form. */
296
299
  static VALUE grpc_rb_channel_get_connectivity_state(int argc, VALUE* argv,
297
300
  VALUE self) {
298
301
  VALUE try_to_connect_param = Qfalse;
@@ -327,8 +330,8 @@ static void* wait_for_watch_state_op_complete_without_gvl(void* arg) {
327
330
  void* success = (void*)0;
328
331
 
329
332
  gpr_mu_lock(&global_connection_polling_mu);
330
- // its unsafe to do a "watch" after "channel polling abort" because the cq has
331
- // been shut down.
333
+ // it's unsafe to do a "watch" after "channel polling abort" because the cq
334
+ // has been shut down.
332
335
  if (abort_channel_polling || stack->bg_wrapped->channel_destroyed) {
333
336
  gpr_mu_unlock(&global_connection_polling_mu);
334
337
  return (void*)0;
@@ -682,9 +685,10 @@ static VALUE run_poll_channels_loop(VALUE arg) {
682
685
  gpr_log(
683
686
  GPR_DEBUG,
684
687
  "GRPC_RUBY: run_poll_channels_loop - create connection polling thread");
688
+ grpc_ruby_init();
685
689
  rb_thread_call_without_gvl(run_poll_channels_loop_no_gil, NULL,
686
690
  run_poll_channels_loop_unblocking_func, NULL);
687
-
691
+ grpc_ruby_shutdown();
688
692
  return Qnil;
689
693
  }
690
694
 
@@ -48,8 +48,7 @@ typedef struct grpc_rb_channel_credentials {
48
48
  grpc_channel_credentials* wrapped;
49
49
  } grpc_rb_channel_credentials;
50
50
 
51
- /* Destroys the credentials instances. */
52
- static void grpc_rb_channel_credentials_free(void* p) {
51
+ static void grpc_rb_channel_credentials_free_internal(void* p) {
53
52
  grpc_rb_channel_credentials* wrapper = NULL;
54
53
  if (p == NULL) {
55
54
  return;
@@ -61,6 +60,12 @@ static void grpc_rb_channel_credentials_free(void* p) {
61
60
  xfree(p);
62
61
  }
63
62
 
63
+ /* Destroys the credentials instances. */
64
+ static void grpc_rb_channel_credentials_free(void* p) {
65
+ grpc_rb_channel_credentials_free_internal(p);
66
+ grpc_ruby_shutdown();
67
+ }
68
+
64
69
  /* Protects the mark object from GC */
65
70
  static void grpc_rb_channel_credentials_mark(void* p) {
66
71
  grpc_rb_channel_credentials* wrapper = NULL;
@@ -90,6 +95,7 @@ static rb_data_type_t grpc_rb_channel_credentials_data_type = {
90
95
  /* Allocates ChannelCredential instances.
91
96
  Provides safe initial defaults for the instance fields. */
92
97
  static VALUE grpc_rb_channel_credentials_alloc(VALUE cls) {
98
+ grpc_ruby_init();
93
99
  grpc_rb_channel_credentials* wrapper = ALLOC(grpc_rb_channel_credentials);
94
100
  wrapper->wrapped = NULL;
95
101
  wrapper->mark = Qnil;
@@ -147,8 +153,6 @@ static VALUE grpc_rb_channel_credentials_init(int argc, VALUE* argv,
147
153
  const char* pem_root_certs_cstr = NULL;
148
154
  MEMZERO(&key_cert_pair, grpc_ssl_pem_key_cert_pair, 1);
149
155
 
150
- grpc_ruby_once_init();
151
-
152
156
  /* "03" == no mandatory arg, 3 optional */
153
157
  rb_scan_args(argc, argv, "03", &pem_root_certs, &pem_private_key,
154
158
  &pem_cert_chain);
@@ -52,23 +52,26 @@ typedef struct grpc_rb_compression_options {
52
52
  grpc_compression_options* wrapped;
53
53
  } grpc_rb_compression_options;
54
54
 
55
- /* Destroys the compression options instances and free the
56
- * wrapped grpc compression options. */
57
- static void grpc_rb_compression_options_free(void* p) {
55
+ static void grpc_rb_compression_options_free_internal(void* p) {
58
56
  grpc_rb_compression_options* wrapper = NULL;
59
57
  if (p == NULL) {
60
58
  return;
61
59
  };
62
60
  wrapper = (grpc_rb_compression_options*)p;
63
-
64
61
  if (wrapper->wrapped != NULL) {
65
62
  gpr_free(wrapper->wrapped);
66
63
  wrapper->wrapped = NULL;
67
64
  }
68
-
69
65
  xfree(p);
70
66
  }
71
67
 
68
+ /* Destroys the compression options instances and free the
69
+ * wrapped grpc compression options. */
70
+ static void grpc_rb_compression_options_free(void* p) {
71
+ grpc_rb_compression_options_free_internal(p);
72
+ grpc_ruby_shutdown();
73
+ }
74
+
72
75
  /* Ruby recognized data type for the CompressionOptions class. */
73
76
  static rb_data_type_t grpc_rb_compression_options_data_type = {
74
77
  "grpc_compression_options",
@@ -87,10 +90,9 @@ static rb_data_type_t grpc_rb_compression_options_data_type = {
87
90
  Allocate the wrapped grpc compression options and
88
91
  initialize it here too. */
89
92
  static VALUE grpc_rb_compression_options_alloc(VALUE cls) {
93
+ grpc_ruby_init();
90
94
  grpc_rb_compression_options* wrapper = NULL;
91
95
 
92
- grpc_ruby_once_init();
93
-
94
96
  wrapper = gpr_malloc(sizeof(grpc_rb_compression_options));
95
97
  wrapper->wrapped = NULL;
96
98
  wrapper->wrapped = gpr_malloc(sizeof(grpc_compression_options));
@@ -115,6 +115,7 @@ static void grpc_rb_event_unblocking_func(void* arg) {
115
115
  static VALUE grpc_rb_event_thread(VALUE arg) {
116
116
  grpc_rb_event* event;
117
117
  (void)arg;
118
+ grpc_ruby_init();
118
119
  while (true) {
119
120
  event = (grpc_rb_event*)rb_thread_call_without_gvl(
120
121
  grpc_rb_wait_for_event_no_gil, NULL, grpc_rb_event_unblocking_func,
@@ -128,6 +129,7 @@ static VALUE grpc_rb_event_thread(VALUE arg) {
128
129
  }
129
130
  }
130
131
  grpc_rb_event_queue_destroy();
132
+ grpc_ruby_shutdown();
131
133
  return Qnil;
132
134
  }
133
135
 
@@ -276,10 +276,6 @@ static bool grpc_ruby_forked_after_init(void) {
276
276
  }
277
277
  #endif
278
278
 
279
- static void grpc_rb_shutdown(void) {
280
- if (!grpc_ruby_forked_after_init()) grpc_shutdown();
281
- }
282
-
283
279
  /* Initialize the GRPC module structs */
284
280
 
285
281
  /* grpc_rb_sNewServerRpc is the struct that holds new server rpc details. */
@@ -298,12 +294,6 @@ VALUE sym_metadata = Qundef;
298
294
 
299
295
  static gpr_once g_once_init = GPR_ONCE_INIT;
300
296
 
301
- static void grpc_ruby_once_init_internal() {
302
- grpc_ruby_set_init_pid();
303
- grpc_init();
304
- atexit(grpc_rb_shutdown);
305
- }
306
-
307
297
  void grpc_ruby_fork_guard() {
308
298
  if (grpc_ruby_forked_after_init()) {
309
299
  rb_raise(rb_eRuntimeError, "grpc cannot be used before and after forking");
@@ -313,19 +303,7 @@ void grpc_ruby_fork_guard() {
313
303
  static VALUE bg_thread_init_rb_mu = Qundef;
314
304
  static int bg_thread_init_done = 0;
315
305
 
316
- void grpc_ruby_once_init() {
317
- /* ruby_vm_at_exit doesn't seem to be working. It would crash once every
318
- * blue moon, and some users are getting it repeatedly. See the discussions
319
- * - https://github.com/grpc/grpc/pull/5337
320
- * - https://bugs.ruby-lang.org/issues/12095
321
- *
322
- * In order to still be able to handle the (unlikely) situation where the
323
- * extension is loaded by a first Ruby VM that is subsequently destroyed,
324
- * then loaded again by another VM within the same process, we need to
325
- * schedule our initialization and destruction only once.
326
- */
327
- gpr_once_init(&g_once_init, grpc_ruby_once_init_internal);
328
-
306
+ static void grpc_ruby_init_threads() {
329
307
  // Avoid calling calling into ruby library (when creating threads here)
330
308
  // in gpr_once_init. In general, it appears to be unsafe to call
331
309
  // into the ruby library while holding a non-ruby mutex, because a gil yield
@@ -339,6 +317,27 @@ void grpc_ruby_once_init() {
339
317
  rb_mutex_unlock(bg_thread_init_rb_mu);
340
318
  }
341
319
 
320
+ static int64_t g_grpc_ruby_init_count;
321
+
322
+ void grpc_ruby_init() {
323
+ gpr_once_init(&g_once_init, grpc_ruby_set_init_pid);
324
+ grpc_init();
325
+ grpc_ruby_init_threads();
326
+ // (only gpr_log after logging has been initialized)
327
+ gpr_log(GPR_DEBUG,
328
+ "GRPC_RUBY: grpc_ruby_init - prev g_grpc_ruby_init_count:%" PRId64,
329
+ g_grpc_ruby_init_count++);
330
+ }
331
+
332
+ void grpc_ruby_shutdown() {
333
+ GPR_ASSERT(g_grpc_ruby_init_count > 0);
334
+ if (!grpc_ruby_forked_after_init()) grpc_shutdown();
335
+ gpr_log(
336
+ GPR_DEBUG,
337
+ "GRPC_RUBY: grpc_ruby_shutdown - prev g_grpc_ruby_init_count:%" PRId64,
338
+ g_grpc_ruby_init_count--);
339
+ }
340
+
342
341
  void Init_grpc_c() {
343
342
  if (!grpc_rb_load_core()) {
344
343
  rb_raise(rb_eLoadError, "Couldn't find or load gRPC's dynamic C core");
@@ -67,8 +67,10 @@ VALUE grpc_rb_cannot_init_copy(VALUE copy, VALUE self);
67
67
  /* grpc_rb_time_timeval creates a gpr_timespec from a ruby time object. */
68
68
  gpr_timespec grpc_rb_time_timeval(VALUE time, int interval);
69
69
 
70
- void grpc_ruby_once_init();
71
-
72
70
  void grpc_ruby_fork_guard();
73
71
 
72
+ void grpc_ruby_init();
73
+
74
+ void grpc_ruby_shutdown();
75
+
74
76
  #endif /* GRPC_RB_H_ */
@@ -154,6 +154,15 @@ grpc_alts_credentials_create_type grpc_alts_credentials_create_import;
154
154
  grpc_alts_server_credentials_create_type grpc_alts_server_credentials_create_import;
155
155
  grpc_local_credentials_create_type grpc_local_credentials_create_import;
156
156
  grpc_local_server_credentials_create_type grpc_local_server_credentials_create_import;
157
+ grpc_tls_credentials_options_create_type grpc_tls_credentials_options_create_import;
158
+ grpc_tls_credentials_options_set_cert_request_type_type grpc_tls_credentials_options_set_cert_request_type_import;
159
+ grpc_tls_credentials_options_set_key_materials_config_type grpc_tls_credentials_options_set_key_materials_config_import;
160
+ grpc_tls_credentials_options_set_credential_reload_config_type grpc_tls_credentials_options_set_credential_reload_config_import;
161
+ grpc_tls_credentials_options_set_server_authorization_check_config_type grpc_tls_credentials_options_set_server_authorization_check_config_import;
162
+ grpc_tls_key_materials_config_create_type grpc_tls_key_materials_config_create_import;
163
+ grpc_tls_key_materials_config_set_key_materials_type grpc_tls_key_materials_config_set_key_materials_import;
164
+ grpc_tls_credential_reload_config_create_type grpc_tls_credential_reload_config_create_import;
165
+ grpc_tls_server_authorization_check_config_create_type grpc_tls_server_authorization_check_config_create_import;
157
166
  grpc_raw_byte_buffer_create_type grpc_raw_byte_buffer_create_import;
158
167
  grpc_raw_compressed_byte_buffer_create_type grpc_raw_compressed_byte_buffer_create_import;
159
168
  grpc_byte_buffer_copy_type grpc_byte_buffer_copy_import;
@@ -412,6 +421,15 @@ void grpc_rb_load_imports(HMODULE library) {
412
421
  grpc_alts_server_credentials_create_import = (grpc_alts_server_credentials_create_type) GetProcAddress(library, "grpc_alts_server_credentials_create");
413
422
  grpc_local_credentials_create_import = (grpc_local_credentials_create_type) GetProcAddress(library, "grpc_local_credentials_create");
414
423
  grpc_local_server_credentials_create_import = (grpc_local_server_credentials_create_type) GetProcAddress(library, "grpc_local_server_credentials_create");
424
+ grpc_tls_credentials_options_create_import = (grpc_tls_credentials_options_create_type) GetProcAddress(library, "grpc_tls_credentials_options_create");
425
+ grpc_tls_credentials_options_set_cert_request_type_import = (grpc_tls_credentials_options_set_cert_request_type_type) GetProcAddress(library, "grpc_tls_credentials_options_set_cert_request_type");
426
+ grpc_tls_credentials_options_set_key_materials_config_import = (grpc_tls_credentials_options_set_key_materials_config_type) GetProcAddress(library, "grpc_tls_credentials_options_set_key_materials_config");
427
+ grpc_tls_credentials_options_set_credential_reload_config_import = (grpc_tls_credentials_options_set_credential_reload_config_type) GetProcAddress(library, "grpc_tls_credentials_options_set_credential_reload_config");
428
+ grpc_tls_credentials_options_set_server_authorization_check_config_import = (grpc_tls_credentials_options_set_server_authorization_check_config_type) GetProcAddress(library, "grpc_tls_credentials_options_set_server_authorization_check_config");
429
+ grpc_tls_key_materials_config_create_import = (grpc_tls_key_materials_config_create_type) GetProcAddress(library, "grpc_tls_key_materials_config_create");
430
+ grpc_tls_key_materials_config_set_key_materials_import = (grpc_tls_key_materials_config_set_key_materials_type) GetProcAddress(library, "grpc_tls_key_materials_config_set_key_materials");
431
+ grpc_tls_credential_reload_config_create_import = (grpc_tls_credential_reload_config_create_type) GetProcAddress(library, "grpc_tls_credential_reload_config_create");
432
+ grpc_tls_server_authorization_check_config_create_import = (grpc_tls_server_authorization_check_config_create_type) GetProcAddress(library, "grpc_tls_server_authorization_check_config_create");
415
433
  grpc_raw_byte_buffer_create_import = (grpc_raw_byte_buffer_create_type) GetProcAddress(library, "grpc_raw_byte_buffer_create");
416
434
  grpc_raw_compressed_byte_buffer_create_import = (grpc_raw_compressed_byte_buffer_create_type) GetProcAddress(library, "grpc_raw_compressed_byte_buffer_create");
417
435
  grpc_byte_buffer_copy_import = (grpc_byte_buffer_copy_type) GetProcAddress(library, "grpc_byte_buffer_copy");
@@ -437,6 +437,33 @@ extern grpc_local_credentials_create_type grpc_local_credentials_create_import;
437
437
  typedef grpc_server_credentials*(*grpc_local_server_credentials_create_type)(grpc_local_connect_type type);
438
438
  extern grpc_local_server_credentials_create_type grpc_local_server_credentials_create_import;
439
439
  #define grpc_local_server_credentials_create grpc_local_server_credentials_create_import
440
+ typedef grpc_tls_credentials_options*(*grpc_tls_credentials_options_create_type)();
441
+ extern grpc_tls_credentials_options_create_type grpc_tls_credentials_options_create_import;
442
+ #define grpc_tls_credentials_options_create grpc_tls_credentials_options_create_import
443
+ typedef int(*grpc_tls_credentials_options_set_cert_request_type_type)(grpc_tls_credentials_options* options, grpc_ssl_client_certificate_request_type type);
444
+ extern grpc_tls_credentials_options_set_cert_request_type_type grpc_tls_credentials_options_set_cert_request_type_import;
445
+ #define grpc_tls_credentials_options_set_cert_request_type grpc_tls_credentials_options_set_cert_request_type_import
446
+ typedef int(*grpc_tls_credentials_options_set_key_materials_config_type)(grpc_tls_credentials_options* options, grpc_tls_key_materials_config* config);
447
+ extern grpc_tls_credentials_options_set_key_materials_config_type grpc_tls_credentials_options_set_key_materials_config_import;
448
+ #define grpc_tls_credentials_options_set_key_materials_config grpc_tls_credentials_options_set_key_materials_config_import
449
+ typedef int(*grpc_tls_credentials_options_set_credential_reload_config_type)(grpc_tls_credentials_options* options, grpc_tls_credential_reload_config* config);
450
+ extern grpc_tls_credentials_options_set_credential_reload_config_type grpc_tls_credentials_options_set_credential_reload_config_import;
451
+ #define grpc_tls_credentials_options_set_credential_reload_config grpc_tls_credentials_options_set_credential_reload_config_import
452
+ typedef int(*grpc_tls_credentials_options_set_server_authorization_check_config_type)(grpc_tls_credentials_options* options, grpc_tls_server_authorization_check_config* config);
453
+ extern grpc_tls_credentials_options_set_server_authorization_check_config_type grpc_tls_credentials_options_set_server_authorization_check_config_import;
454
+ #define grpc_tls_credentials_options_set_server_authorization_check_config grpc_tls_credentials_options_set_server_authorization_check_config_import
455
+ typedef grpc_tls_key_materials_config*(*grpc_tls_key_materials_config_create_type)();
456
+ extern grpc_tls_key_materials_config_create_type grpc_tls_key_materials_config_create_import;
457
+ #define grpc_tls_key_materials_config_create grpc_tls_key_materials_config_create_import
458
+ typedef int(*grpc_tls_key_materials_config_set_key_materials_type)(grpc_tls_key_materials_config* config, const char* pem_root_certs, const grpc_ssl_pem_key_cert_pair** pem_key_cert_pairs, size_t num_key_cert_pairs);
459
+ extern grpc_tls_key_materials_config_set_key_materials_type grpc_tls_key_materials_config_set_key_materials_import;
460
+ #define grpc_tls_key_materials_config_set_key_materials grpc_tls_key_materials_config_set_key_materials_import
461
+ typedef grpc_tls_credential_reload_config*(*grpc_tls_credential_reload_config_create_type)(const void* config_user_data, int (*schedule)(void* config_user_data, grpc_tls_credential_reload_arg* arg), void (*cancel)(void* config_user_data, grpc_tls_credential_reload_arg* arg), void (*destruct)(void* config_user_data));
462
+ extern grpc_tls_credential_reload_config_create_type grpc_tls_credential_reload_config_create_import;
463
+ #define grpc_tls_credential_reload_config_create grpc_tls_credential_reload_config_create_import
464
+ typedef grpc_tls_server_authorization_check_config*(*grpc_tls_server_authorization_check_config_create_type)(const void* config_user_data, int (*schedule)(void* config_user_data, grpc_tls_server_authorization_check_arg* arg), void (*cancel)(void* config_user_data, grpc_tls_server_authorization_check_arg* arg), void (*destruct)(void* config_user_data));
465
+ extern grpc_tls_server_authorization_check_config_create_type grpc_tls_server_authorization_check_config_create_import;
466
+ #define grpc_tls_server_authorization_check_config_create grpc_tls_server_authorization_check_config_create_import
440
467
  typedef grpc_byte_buffer*(*grpc_raw_byte_buffer_create_type)(grpc_slice* slices, size_t nslices);
441
468
  extern grpc_raw_byte_buffer_create_type grpc_raw_byte_buffer_create_import;
442
469
  #define grpc_raw_byte_buffer_create grpc_raw_byte_buffer_create_import