diff --git a/src/core/client_config/subchannel.c b/src/core/client_config/subchannel.c index 740389003a5..e6c05c93194 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"); }