aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/transport/chttp2_transport.c
diff options
context:
space:
mode:
authorGravatar Craig Tiller <craig.tiller@gmail.com>2015-03-02 07:48:50 -0800
committerGravatar Craig Tiller <craig.tiller@gmail.com>2015-03-02 07:48:50 -0800
commit748fe3ffe29a97a5f3dc1ca8daac9c9e18ac3cd0 (patch)
tree994502644ccc98bd65be7efba8918df8b7b24de6 /src/core/transport/chttp2_transport.c
parent7a89026886e9da28194ecdff840040980634ef99 (diff)
Potential fix for stuck RPCs at shutdown
Diffstat (limited to 'src/core/transport/chttp2_transport.c')
-rw-r--r--src/core/transport/chttp2_transport.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/core/transport/chttp2_transport.c b/src/core/transport/chttp2_transport.c
index 476cc4b226..4230b523b1 100644
--- a/src/core/transport/chttp2_transport.c
+++ b/src/core/transport/chttp2_transport.c
@@ -309,6 +309,7 @@ static void push_setting(transport *t, grpc_chttp2_setting_id id,
static int prepare_callbacks(transport *t);
static void run_callbacks(transport *t, const grpc_transport_callbacks *cb);
+static void call_cb_closed(transport *t, const grpc_transport_callbacks *cb);
static int prepare_write(transport *t);
static void perform_write(transport *t, grpc_endpoint *ep);
@@ -516,13 +517,13 @@ static void init_transport(transport *t, grpc_transport_setup_callback setup,
static void destroy_transport(grpc_transport *gt) {
transport *t = (transport *)gt;
- gpr_mu_lock(&t->mu);
+ lock(t);
t->destroying = 1;
while (t->calling_back) {
gpr_cv_wait(&t->cv, &t->mu, gpr_inf_future);
}
- t->cb = NULL;
- gpr_mu_unlock(&t->mu);
+ drop_connection(t);
+ unlock(t);
unref_transport(t);
}
@@ -772,7 +773,7 @@ static void unlock(transport *t) {
}
if (call_closed) {
- cb->closed(t->cb_user_data, &t->base);
+ call_cb_closed(t, cb);
}
/* write some bytes if necessary */
@@ -1765,6 +1766,10 @@ static void run_callbacks(transport *t, const grpc_transport_callbacks *cb) {
}
}
+static void call_cb_closed(transport *t, const grpc_transport_callbacks *cb) {
+ cb->closed(t->cb_user_data, &t->base);
+}
+
static void add_to_pollset(grpc_transport *gt, grpc_pollset *pollset) {
transport *t = (transport *)gt;
lock(t);