summaryrefslogtreecommitdiff
path: root/src/mongo/util/concurrency/thread_pool.cpp
diff options
context:
space:
mode:
authorBen Caimano <ben.caimano@10gen.com>2019-03-05 13:40:25 -0500
committerBen Caimano <ben.caimano@10gen.com>2019-04-05 14:28:40 -0400
commita08bac3e29cd9ec3d030623894928e80c2f572dd (patch)
treea82304a07e67909a8d8a40ec08959f4f1c8ccace /src/mongo/util/concurrency/thread_pool.cpp
parentb1aa248f71ffb197c6576fd90ff7571ee9a96c3f (diff)
downloadmongo-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.cpp24
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) {