aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/cpp/common/completion_queue_cc.cc
diff options
context:
space:
mode:
authorGravatar Craig Tiller <ctiller@google.com>2016-12-05 17:50:27 -0800
committerGravatar GitHub <noreply@github.com>2016-12-05 17:50:27 -0800
commiteac8af73337485e4475ad6c543d3c16dfe5e255c (patch)
treef94b2203783ade45ea55ac335c2541943c8e10ce /src/cpp/common/completion_queue_cc.cc
parentbc74e1b2083ed16bfbc415b18aabbdde687e0b50 (diff)
parent7e499aa3fbc9b7baa6571ed4a2c595f6c06e8faa (diff)
Merge pull request #8959 from vjpai/track_cq_finalize
Don't allow core CQ shutdown whille C++ CQ tags may still trigger new ops
Diffstat (limited to 'src/cpp/common/completion_queue_cc.cc')
-rw-r--r--src/cpp/common/completion_queue_cc.cc14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/cpp/common/completion_queue_cc.cc b/src/cpp/common/completion_queue_cc.cc
index 00cc102f92..0408a41085 100644
--- a/src/cpp/common/completion_queue_cc.cc
+++ b/src/cpp/common/completion_queue_cc.cc
@@ -43,11 +43,21 @@ namespace grpc {
static internal::GrpcLibraryInitializer g_gli_initializer;
-CompletionQueue::CompletionQueue(grpc_completion_queue* take) : cq_(take) {}
+CompletionQueue::CompletionQueue(grpc_completion_queue* take) : cq_(take) {
+ InitialAvalanching();
+}
void CompletionQueue::Shutdown() {
g_gli_initializer.summon();
- grpc_completion_queue_shutdown(cq_);
+ CompleteAvalanching();
+}
+
+void CompletionQueue::CompleteAvalanching() {
+ // Check if this was the last avalanching operation
+ if (gpr_atm_no_barrier_fetch_add(&avalanches_in_flight_,
+ static_cast<gpr_atm>(-1)) == 1) {
+ grpc_completion_queue_shutdown(cq_);
+ }
}
CompletionQueue::NextStatus CompletionQueue::AsyncNextInternal(