From b76f3ada1177f8ae4ce749a6305b55c3552fb92a Mon Sep 17 00:00:00 2001
From: vjpai <vpai@google.com>
Date: Thu, 23 Jul 2015 14:41:23 -0700
Subject: [PATCH] Fix bug on shutdown case

---
 include/grpc++/dynamic_thread_pool.h  |  1 +
 src/cpp/server/dynamic_thread_pool.cc | 13 ++++++++-----
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/include/grpc++/dynamic_thread_pool.h b/include/grpc++/dynamic_thread_pool.h
index 7519a47726..e01063ced2 100644
--- a/include/grpc++/dynamic_thread_pool.h
+++ b/include/grpc++/dynamic_thread_pool.h
@@ -64,6 +64,7 @@ class DynamicThreadPool GRPC_FINAL : public ThreadPoolInterface {
   };
   grpc::mutex mu_;
   grpc::condition_variable cv_;
+  grpc::condition_variable shutdown_cv_;
   bool shutdown_;
   std::queue<std::function<void()>> callbacks_;
   int reserve_threads_;
diff --git a/src/cpp/server/dynamic_thread_pool.cc b/src/cpp/server/dynamic_thread_pool.cc
index bc0d16f170..c42563103c 100644
--- a/src/cpp/server/dynamic_thread_pool.cc
+++ b/src/cpp/server/dynamic_thread_pool.cc
@@ -58,6 +58,9 @@ void DynamicThreadPool::DynamicThread::ThreadFunc() {
       pool_->dead_threads_.push_back(this);
     }
   }
+  if ((pool_->shutdown_) && (pool_->nthreads_ == 0)) {
+    pool_->shutdown_cv_.notify_one();
+  }
 }
   
 void DynamicThreadPool::ThreadFunc() {
@@ -103,12 +106,12 @@ void DynamicThreadPool::ReapThreads(std::list<DynamicThread*>* tlist) {
 }
   
 DynamicThreadPool::~DynamicThreadPool() {
-  {
-    grpc::lock_guard<grpc::mutex> lock(mu_);
-    shutdown_ = true;
-    cv_.notify_all();
+  grpc::unique_lock<grpc::mutex> lock(mu_);
+  shutdown_ = true;
+  cv_.notify_all();
+  while (nthreads_ != 0) {
+    shutdown_cv_.wait(lock);
   }
-  ReapThreads(&live_threads_);
   ReapThreads(&dead_threads_);
 }
 
-- 
GitLab