diff options
author | Ben Caimano <ben.caimano@10gen.com> | 2019-03-05 13:40:25 -0500 |
---|---|---|
committer | Ben Caimano <ben.caimano@10gen.com> | 2019-04-05 14:28:40 -0400 |
commit | a08bac3e29cd9ec3d030623894928e80c2f572dd (patch) | |
tree | a82304a07e67909a8d8a40ec08959f4f1c8ccace /src/mongo/util/concurrency/thread_pool.cpp | |
parent | b1aa248f71ffb197c6576fd90ff7571ee9a96c3f (diff) | |
download | mongo-a08bac3e29cd9ec3d030623894928e80c2f572dd.tar.gz |
SERVER-39965 OutOfLineExecutor Tasks are now unique_function(Status)
Diffstat (limited to 'src/mongo/util/concurrency/thread_pool.cpp')
-rw-r--r-- | src/mongo/util/concurrency/thread_pool.cpp | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/src/mongo/util/concurrency/thread_pool.cpp b/src/mongo/util/concurrency/thread_pool.cpp index 81f1e3c2285..5f732c1a1ed 100644 --- a/src/mongo/util/concurrency/thread_pool.cpp +++ b/src/mongo/util/concurrency/thread_pool.cpp @@ -185,15 +185,22 @@ void ThreadPool::_drainPendingTasks() { cleanThread.join(); } -Status ThreadPool::schedule(Task task) { - stdx::lock_guard<stdx::mutex> lk(_mutex); +void ThreadPool::schedule(Task task) { + stdx::unique_lock<stdx::mutex> lk(_mutex); + switch (_state) { case joinRequired: case joining: - case shutdownComplete: - return Status(ErrorCodes::ShutdownInProgress, - str::stream() << "Shutdown of thread pool " << _options.poolName - << " in progress"); + case shutdownComplete: { + auto status = Status(ErrorCodes::ShutdownInProgress, + str::stream() << "Shutdown of thread pool " << _options.poolName + << " in progress"); + + lk.unlock(); + task(status); + return; + } break; + case preStart: case running: break; @@ -202,7 +209,7 @@ Status ThreadPool::schedule(Task task) { } _pendingTasks.emplace_back(std::move(task)); if (_state == preStart) { - return Status::OK(); + return; } if (_numIdleThreads < _pendingTasks.size()) { _startWorkerThread_inlock(); @@ -211,7 +218,6 @@ Status ThreadPool::schedule(Task task) { _lastFullUtilizationDate = Date_t::now(); } _workAvailable.notify_one(); - return Status::OK(); } void ThreadPool::waitForIdle() { @@ -332,7 +338,7 @@ void ThreadPool::_doOneTask(stdx::unique_lock<stdx::mutex>* lk) noexcept { _pendingTasks.pop_front(); --_numIdleThreads; lk->unlock(); - task(); + task(Status::OK()); lk->lock(); ++_numIdleThreads; if (_pendingTasks.empty() && _threads.size() == _numIdleThreads) { |