aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/tsi/alts_transport_security.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/tsi/alts_transport_security.cc')
-rw-r--r--src/core/tsi/alts_transport_security.cc31
1 files changed, 25 insertions, 6 deletions
diff --git a/src/core/tsi/alts_transport_security.cc b/src/core/tsi/alts_transport_security.cc
index ddd75cbd02..1654d893d0 100644
--- a/src/core/tsi/alts_transport_security.cc
+++ b/src/core/tsi/alts_transport_security.cc
@@ -26,17 +26,36 @@ alts_shared_resource* alts_get_shared_resource(void) {
return &g_alts_resource;
}
+static void grpc_tsi_alts_wait_for_cq_drain() {
+ gpr_mu_lock(&g_alts_resource.mu);
+ while (!g_alts_resource.is_cq_drained) {
+ gpr_cv_wait(&g_alts_resource.cv, &g_alts_resource.mu,
+ gpr_inf_future(GPR_CLOCK_REALTIME));
+ }
+ gpr_mu_unlock(&g_alts_resource.mu);
+}
+
+void grpc_tsi_alts_signal_for_cq_destroy() {
+ gpr_mu_lock(&g_alts_resource.mu);
+ g_alts_resource.is_cq_drained = true;
+ gpr_cv_signal(&g_alts_resource.cv);
+ gpr_mu_unlock(&g_alts_resource.mu);
+}
+
void grpc_tsi_alts_init() {
memset(&g_alts_resource, 0, sizeof(alts_shared_resource));
gpr_mu_init(&g_alts_resource.mu);
+ gpr_cv_init(&g_alts_resource.cv);
}
void grpc_tsi_alts_shutdown() {
- gpr_mu_destroy(&g_alts_resource.mu);
- if (g_alts_resource.cq == nullptr) {
- return;
+ if (g_alts_resource.cq != nullptr) {
+ grpc_completion_queue_shutdown(g_alts_resource.cq);
+ grpc_tsi_alts_wait_for_cq_drain();
+ grpc_completion_queue_destroy(g_alts_resource.cq);
+ grpc_channel_destroy(g_alts_resource.channel);
+ gpr_thd_join(g_alts_resource.thread_id);
}
- grpc_completion_queue_destroy(g_alts_resource.cq);
- grpc_channel_destroy(g_alts_resource.channel);
- gpr_thd_join(g_alts_resource.thread_id);
+ gpr_cv_destroy(&g_alts_resource.cv);
+ gpr_mu_destroy(&g_alts_resource.mu);
}