diff options
author | 2018-02-05 09:30:32 -0800 | |
---|---|---|
committer | 2018-02-05 09:30:32 -0800 | |
commit | 6d55db03bec2a08380482ea54244e0ba68aa137b (patch) | |
tree | da7308a71b631ceebc310c2d60de4c99211174c3 /src/core/tsi/alts_transport_security.cc | |
parent | b1f5d59b4fb567cdcc6786122d7bfcbd698f9af0 (diff) |
fix race condition in grpc_tsi_alts_shutdown()
Diffstat (limited to 'src/core/tsi/alts_transport_security.cc')
-rw-r--r-- | src/core/tsi/alts_transport_security.cc | 31 |
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); } |