THRIFT-3233 fix accounting of workers in thread manager
Client: C++
Patch: Jim King <jim.king@simplivity.com>
This closes #992
diff --git a/lib/cpp/src/thrift/concurrency/ThreadManager.cpp b/lib/cpp/src/thrift/concurrency/ThreadManager.cpp
index 71b8fec..24bfeec 100644
--- a/lib/cpp/src/thrift/concurrency/ThreadManager.cpp
+++ b/lib/cpp/src/thrift/concurrency/ThreadManager.cpp
@@ -213,8 +213,6 @@
*/
void run() {
bool active = false;
- bool notifyManager = false;
-
/**
* Increment worker semaphore and notify manager if worker count reached
* desired max
@@ -223,18 +221,20 @@
* since that is what the manager blocks on for worker add/remove
*/
{
- Synchronized s(manager_->monitor_);
- active = manager_->workerCount_ < manager_->workerMaxCount_;
- if (active) {
- manager_->workerCount_++;
- notifyManager = manager_->workerCount_ == manager_->workerMaxCount_;
+ bool notifyManager = false;
+ {
+ Synchronized s(manager_->monitor_);
+ active = manager_->workerCount_ < manager_->workerMaxCount_;
+ if (active) {
+ manager_->workerCount_++;
+ notifyManager = manager_->workerCount_ == manager_->workerMaxCount_;
+ }
}
- }
- if (notifyManager) {
- Synchronized s(manager_->workerMonitor_);
- manager_->workerMonitor_.notify();
- notifyManager = false;
+ if (notifyManager) {
+ Synchronized s(manager_->workerMonitor_);
+ manager_->workerMonitor_.notify();
+ }
}
while (active) {
@@ -279,10 +279,6 @@
&& manager_->tasks_.size() <= manager_->pendingTaskCountMax_ - 1) {
manager_->maxMonitor_.notify();
}
- } else {
- idle_ = true;
- manager_->workerCount_--;
- notifyManager = (manager_->workerCount_ == manager_->workerMaxCount_);
}
}
@@ -302,6 +298,9 @@
{
Synchronized s(manager_->workerMonitor_);
manager_->deadWorkers_.insert(this->thread());
+ idle_ = true;
+ manager_->workerCount_--;
+ bool notifyManager = (manager_->workerCount_ == manager_->workerMaxCount_);
if (notifyManager) {
manager_->workerMonitor_.notify();
}