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.
- checksums.yaml +4 -4
- data/Makefile +301 -33
- data/include/grpc/grpc_security.h +195 -0
- data/include/grpc/impl/codegen/grpc_types.h +17 -1
- data/include/grpc/impl/codegen/port_platform.h +36 -0
- data/include/grpc/impl/codegen/slice.h +1 -1
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +2 -0
- data/src/core/ext/filters/client_channel/client_channel.cc +74 -69
- data/src/core/ext/filters/client_channel/client_channel.h +2 -2
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +5 -6
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +5 -4
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +2 -2
- data/src/core/ext/filters/client_channel/client_channel_factory.h +4 -4
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +3 -3
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +176 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +68 -0
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +10 -8
- data/src/core/ext/filters/client_channel/health/health_check_client.h +1 -1
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +146 -156
- data/src/core/ext/filters/client_channel/lb_policy.cc +30 -1
- data/src/core/ext/filters/client_channel/lb_policy.h +29 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +28 -30
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -8
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +5 -8
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +23 -24
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +80 -15
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +6 -1
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +2 -2
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
- data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +96 -0
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +56 -0
- data/src/core/ext/filters/client_channel/parse_address.cc +24 -5
- data/src/core/ext/filters/client_channel/request_routing.cc +13 -3
- data/src/core/ext/filters/client_channel/request_routing.h +5 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -6
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -35
- data/src/core/ext/filters/client_channel/subchannel.cc +698 -791
- data/src/core/ext/filters/client_channel/subchannel.h +213 -123
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +97 -0
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +94 -0
- data/src/core/ext/filters/http/client_authority_filter.cc +5 -2
- data/src/core/ext/filters/max_age/max_age_filter.cc +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +13 -12
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +5 -7
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +19 -27
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +18 -19
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +27 -6
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +3 -2
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/writing.cc +8 -5
- data/src/core/lib/channel/handshaker.cc +141 -214
- data/src/core/lib/channel/handshaker.h +110 -101
- data/src/core/lib/channel/handshaker_factory.h +11 -19
- data/src/core/lib/channel/handshaker_registry.cc +64 -52
- data/src/core/lib/channel/handshaker_registry.h +21 -16
- data/src/core/lib/gpr/log_posix.cc +2 -1
- data/src/core/lib/gpr/time.cc +8 -0
- data/src/core/lib/gpr/time_posix.cc +8 -2
- data/src/core/lib/gprpp/optional.h +47 -0
- data/src/core/lib/http/httpcli_security_connector.cc +13 -14
- data/src/core/lib/iomgr/buffer_list.cc +182 -24
- data/src/core/lib/iomgr/buffer_list.h +70 -8
- data/src/core/lib/iomgr/combiner.cc +11 -3
- data/src/core/lib/iomgr/error.cc +9 -5
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -0
- data/src/core/lib/iomgr/ev_epollex_linux.cc +136 -162
- data/src/core/lib/iomgr/ev_poll_posix.cc +3 -0
- data/src/core/lib/iomgr/ev_posix.cc +4 -0
- data/src/core/lib/iomgr/ev_posix.h +4 -0
- data/src/core/lib/iomgr/exec_ctx.cc +1 -0
- data/src/core/lib/iomgr/exec_ctx.h +137 -8
- data/src/core/lib/iomgr/executor.cc +122 -87
- data/src/core/lib/iomgr/executor.h +53 -48
- data/src/core/lib/iomgr/fork_posix.cc +6 -4
- data/src/core/lib/iomgr/{network_status_tracker.cc → grpc_if_nametoindex.h} +8 -14
- data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +42 -0
- data/src/core/lib/iomgr/{network_status_tracker.h → grpc_if_nametoindex_unsupported.cc} +15 -9
- data/src/core/lib/iomgr/internal_errqueue.h +105 -3
- data/src/core/lib/iomgr/iomgr.cc +6 -5
- data/src/core/lib/iomgr/iomgr.h +8 -0
- data/src/core/lib/iomgr/iomgr_custom.cc +6 -2
- data/src/core/lib/iomgr/iomgr_internal.cc +4 -0
- data/src/core/lib/iomgr/iomgr_internal.h +4 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +10 -1
- data/src/core/lib/iomgr/iomgr_windows.cc +8 -1
- data/src/core/lib/iomgr/port.h +1 -0
- data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
- data/src/core/lib/iomgr/resolve_address_windows.cc +2 -1
- data/src/core/lib/iomgr/tcp_custom.cc +0 -4
- data/src/core/lib/iomgr/tcp_posix.cc +58 -44
- data/src/core/lib/iomgr/tcp_uv.cc +0 -1
- data/src/core/lib/iomgr/tcp_windows.cc +0 -4
- data/src/core/lib/iomgr/timer_manager.cc +8 -0
- data/src/core/lib/iomgr/udp_server.cc +6 -4
- data/src/core/lib/json/json.cc +1 -4
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +1 -1
- data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
- data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -0
- data/src/core/lib/security/credentials/credentials.h +9 -1
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -2
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +3 -2
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +2 -2
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +192 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +213 -0
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -8
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +6 -10
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +10 -8
- data/src/core/lib/security/security_connector/security_connector.h +2 -2
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -6
- data/src/core/lib/security/security_connector/ssl_utils.h +33 -0
- data/src/core/lib/security/transport/security_handshaker.cc +267 -300
- data/src/core/lib/security/transport/security_handshaker.h +11 -2
- data/src/core/lib/security/transport/server_auth_filter.cc +1 -0
- data/src/core/lib/surface/call.cc +5 -1
- data/src/core/lib/surface/channel_init.h +5 -0
- data/src/core/lib/surface/completion_queue.cc +4 -7
- data/src/core/lib/surface/init.cc +5 -3
- data/src/core/lib/surface/init_secure.cc +1 -1
- data/src/core/lib/surface/server.cc +19 -17
- data/src/core/lib/surface/version.cc +1 -1
- data/src/core/lib/transport/service_config.h +1 -0
- data/src/core/lib/transport/static_metadata.cc +279 -279
- data/src/core/lib/transport/transport.cc +5 -3
- data/src/core/tsi/ssl_transport_security.cc +10 -4
- data/src/ruby/ext/grpc/extconf.rb +12 -4
- data/src/ruby/ext/grpc/rb_call_credentials.c +8 -5
- data/src/ruby/ext/grpc/rb_channel.c +14 -10
- data/src/ruby/ext/grpc/rb_channel_credentials.c +8 -4
- data/src/ruby/ext/grpc/rb_compression_options.c +9 -7
- data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc.c +22 -23
- data/src/ruby/ext/grpc/rb_grpc.h +4 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +18 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +27 -0
- data/src/ruby/ext/grpc/rb_server.c +8 -4
- data/src/ruby/lib/grpc/version.rb +1 -1
- metadata +46 -39
- data/src/core/ext/filters/client_channel/subchannel_index.cc +0 -248
- data/src/core/ext/filters/client_channel/subchannel_index.h +0 -76
- 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 (
|
67
|
-
|
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
|
-
|
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
|
-
|
624
|
-
|
625
|
-
|
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']
|
28
|
-
ENV['
|
29
|
-
|
30
|
-
ENV['
|
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
|
-
|
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
|
-
|
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
|
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
|
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
|
-
//
|
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
|
-
|
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
|
-
|
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
|
|
data/src/ruby/ext/grpc/rb_grpc.c
CHANGED
@@ -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
|
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");
|
data/src/ruby/ext/grpc/rb_grpc.h
CHANGED
@@ -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
|