From 404cf028e58cfe7f367532be6428901db40b78e4 Mon Sep 17 00:00:00 2001
From: David Garcia Quintas <dgq@google.com>
Date: Wed, 30 Sep 2015 11:31:21 -0700
Subject: [PATCH] Subchannel cleanup on iomgr shutdown

---
 src/core/client_config/subchannel.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/src/core/client_config/subchannel.c b/src/core/client_config/subchannel.c
index 740389003a..e6c05c9319 100644
--- a/src/core/client_config/subchannel.c
+++ b/src/core/client_config/subchannel.c
@@ -645,11 +645,24 @@ static void on_alarm(grpc_exec_ctx *exec_ctx, void *arg, int iomgr_success) {
     iomgr_success = 0;
   }
   connectivity_state_changed_locked(exec_ctx, c, "alarm");
-  gpr_mu_unlock(&c->mu);
   if (iomgr_success) {
+    gpr_mu_unlock(&c->mu);
     update_reconnect_parameters(c);
     continue_connect(exec_ctx, c);
   } else {
+    waiting_for_connect *w4c;
+    w4c = c->waiting;
+    c->waiting = NULL;
+    gpr_mu_unlock(&c->mu);
+    while (w4c != NULL) {
+      waiting_for_connect *next = w4c->next;
+      grpc_subchannel_del_interested_party(exec_ctx, w4c->subchannel,
+                                           w4c->pollset);
+      w4c->notify->cb(exec_ctx, w4c->notify->cb_arg, 0);
+      GRPC_SUBCHANNEL_UNREF(exec_ctx, w4c->subchannel, "waiting_for_connect");
+      gpr_free(w4c);
+      w4c = next;
+    }
     GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, c->master, "connecting");
     GRPC_SUBCHANNEL_UNREF(exec_ctx, c, "connecting");
   }
-- 
GitLab