From 0610434185cd528b72e5be936075cae4c4a07a8e Mon Sep 17 00:00:00 2001
From: "Mark D. Roth" <roth@google.com>
Date: Tue, 29 Nov 2016 14:06:45 -0800
Subject: [PATCH] Always shut down endpoints before destroying them.

---
 src/core/ext/client_channel/http_connect_handshaker.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/core/ext/client_channel/http_connect_handshaker.c b/src/core/ext/client_channel/http_connect_handshaker.c
index 48990f9dac..61fec5cba9 100644
--- a/src/core/ext/client_channel/http_connect_handshaker.c
+++ b/src/core/ext/client_channel/http_connect_handshaker.c
@@ -122,6 +122,11 @@ static void on_write_done(grpc_exec_ctx* exec_ctx, void* arg,
       GRPC_ERROR_REF(error);  // Take ref for the handshake-done callback.
     }
     if (!handshaker->shutdown) {
+      // TODO(ctiller): It is currently necessary to shutdown endpoints
+      // before destroying them, even if we know that there are no
+      // pending read/write callbacks.  This should be fixed, at which
+      // point this can be removed.
+      grpc_endpoint_shutdown(exec_ctx, handshaker->args->endpoint);
       // Not shutting down, so the write failed.  Clean up before
       // invoking the callback.
       cleanup_args_for_failure_locked(handshaker);
@@ -156,6 +161,11 @@ static void on_read_done(grpc_exec_ctx* exec_ctx, void* arg,
       GRPC_ERROR_REF(error);  // Take ref for the handshake-done callback.
     }
     if (!handshaker->shutdown) {
+      // TODO(ctiller): It is currently necessary to shutdown endpoints
+      // before destroying them, even if we know that there are no
+      // pending read/write callbacks.  This should be fixed, at which
+      // point this can be removed.
+      grpc_endpoint_shutdown(exec_ctx, handshaker->args->endpoint);
       // Not shutting down, so the write failed.  Clean up before
       // invoking the callback.
       cleanup_args_for_failure_locked(handshaker);
-- 
GitLab