aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ruby/ext/grpc/rb_channel.c
diff options
context:
space:
mode:
authorGravatar Alexander Polcyn <apolcyn@google.com>2017-05-17 20:25:38 -0700
committerGravatar Alexander Polcyn <apolcyn@google.com>2017-05-17 21:20:34 -0700
commitc24d53b0cfffe2cd78d53c0c86de43346dcc7ee7 (patch)
tree8c83abdbcf9bda51ad0444ec22da1f7de38357ae /src/ruby/ext/grpc/rb_channel.c
parent42d858a99d8b978e75ea48af9d4c556ac53598cc (diff)
api watch unblock func kills only its own channel
Diffstat (limited to 'src/ruby/ext/grpc/rb_channel.c')
-rw-r--r--src/ruby/ext/grpc/rb_channel.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/ruby/ext/grpc/rb_channel.c b/src/ruby/ext/grpc/rb_channel.c
index e02dd0805d..6e7baa3122 100644
--- a/src/ruby/ext/grpc/rb_channel.c
+++ b/src/ruby/ext/grpc/rb_channel.c
@@ -366,6 +366,16 @@ static void *wait_for_watch_state_op_complete_without_gvl(void *arg) {
return success;
}
+static void wait_for_watch_state_op_complete_unblocking_func(void *arg) {
+ bg_watched_channel *bg = (bg_watched_channel *)arg;
+ gpr_mu_lock(&global_connection_polling_mu);
+ if (!bg->channel_destroyed) {
+ grpc_channel_destroy(bg->channel);
+ bg->channel_destroyed = 1;
+ }
+ gpr_mu_unlock(&global_connection_polling_mu);
+}
+
/* Wait until the channel's connectivity state becomes different from
* "last_state", or "deadline" expires.
* Returns true if the the channel's connectivity state becomes
@@ -400,7 +410,7 @@ static VALUE grpc_rb_channel_watch_connectivity_state(VALUE self,
op_success = rb_thread_call_without_gvl(
wait_for_watch_state_op_complete_without_gvl, &stack,
- run_poll_channels_loop_unblocking_func, NULL);
+ wait_for_watch_state_op_complete_unblocking_func, wrapper->bg_wrapped);
return op_success ? Qtrue : Qfalse;
}
@@ -577,11 +587,7 @@ static void grpc_rb_channel_try_register_connection_polling(
return;
}
GPR_ASSERT(bg->refcount == 1);
- if (bg->channel_destroyed) {
- GPR_ASSERT(abort_channel_polling);
- return;
- }
- if (abort_channel_polling) {
+ if (bg->channel_destroyed || abort_channel_polling) {
return;
}