diff --git a/lib/cpp/src/thrift/concurrency/ThreadManager.cpp b/lib/cpp/src/thrift/concurrency/ThreadManager.cpp index 255d237..9954a8a 100644 --- a/lib/cpp/src/thrift/concurrency/ThreadManager.cpp +++ b/lib/cpp/src/thrift/concurrency/ThreadManager.cpp @@ -409,6 +409,8 @@ void ThreadManager::Impl::removeWorker(size_t value) { workerMaxCount_ -= value; + shutdown_mutex_.unlock(); + if (idleCount_ < value) { for (size_t ix = 0; ix < idleCount_; ix++) { monitor_.notify(); diff --git a/lib/cpp/src/thrift/concurrency/ThreadManager.h b/lib/cpp/src/thrift/concurrency/ThreadManager.h index 7bb71d1..e97fd25 100644 --- a/lib/cpp/src/thrift/concurrency/ThreadManager.h +++ b/lib/cpp/src/thrift/concurrency/ThreadManager.h @@ -24,6 +24,7 @@ #include <thrift/cxxfunctional.h> #include <sys/types.h> #include <thrift/concurrency/Thread.h> +#include <thrift/concurrency/Mutex.h> namespace apache { namespace thrift { @@ -59,6 +60,7 @@ protected: ThreadManager() {} public: + Mutex shutdown_mutex_; typedef apache::thrift::stdcxx::function<void(boost::shared_ptr<Runnable>)> ExpireCallback; virtual ~ThreadManager() {} diff --git a/lib/cpp/src/thrift/server/TThreadPoolServer.cpp b/lib/cpp/src/thrift/server/TThreadPoolServer.cpp index 0530d8d..d6b73dc 100644 --- a/lib/cpp/src/thrift/server/TThreadPoolServer.cpp +++ b/lib/cpp/src/thrift/server/TThreadPoolServer.cpp @@ -194,19 +194,28 @@ void TThreadPoolServer::serve() { } } - // If stopped manually, join the existing threads - if (stop_) { - try { - serverTransport_->close(); - threadManager_->join(); - } catch (TException& tx) { - string errStr = string("TThreadPoolServer: Exception shutting down: ") + tx.what(); - GlobalOutput(errStr.c_str()); + { + Guard g(threadManager_->shutdown_mutex_); + // If stopped manually, join the existing threads + if (stop_) { + try { + serverTransport_->close(); + threadManager_->join(); + } catch (TException& tx) { + string errStr = string("TThreadPoolServer: Exception shutting down: ") + tx.what(); + GlobalOutput(errStr.c_str()); + } + stop_ = false; } - stop_ = false; } } +void TThreadPoolServer::stop() { + threadManager_->shutdown_mutex_.lock(); + stop_ = true; + serverTransport_->interrupt(); +} + int64_t TThreadPoolServer::getTimeout() const { return timeout_; } diff --git a/lib/cpp/src/thrift/server/TThreadPoolServer.h b/lib/cpp/src/thrift/server/TThreadPoolServer.h index ad7e7ef..9b89846 100644 --- a/lib/cpp/src/thrift/server/TThreadPoolServer.h +++ b/lib/cpp/src/thrift/server/TThreadPoolServer.h @@ -24,6 +24,7 @@ #include <thrift/server/TServer.h> #include <thrift/transport/TServerTransport.h> + #include <boost/shared_ptr.hpp> namespace apache { @@ -113,10 +114,7 @@ public: virtual void setTimeout(int64_t value); - virtual void stop() { - stop_ = true; - serverTransport_->interrupt(); - } + virtual void stop(); virtual int64_t getTaskExpiration() const;