summaryrefslogtreecommitdiffstats
path: root/staging_vespalib/src/vespa/vespalib/util/sequencedtaskexecutor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'staging_vespalib/src/vespa/vespalib/util/sequencedtaskexecutor.cpp')
-rw-r--r--staging_vespalib/src/vespa/vespalib/util/sequencedtaskexecutor.cpp29
1 files changed, 21 insertions, 8 deletions
diff --git a/staging_vespalib/src/vespa/vespalib/util/sequencedtaskexecutor.cpp b/staging_vespalib/src/vespa/vespalib/util/sequencedtaskexecutor.cpp
index 963264a62e7..cf385275bfb 100644
--- a/staging_vespalib/src/vespa/vespalib/util/sequencedtaskexecutor.cpp
+++ b/staging_vespalib/src/vespa/vespalib/util/sequencedtaskexecutor.cpp
@@ -14,8 +14,17 @@ namespace {
constexpr uint32_t stackSize = 128 * 1024;
constexpr uint8_t MAGIC = 255;
+bool
+isLazy(const std::vector<std::unique_ptr<vespalib::SyncableThreadExecutor>> & executors) {
+ for (const auto &executor : executors) {
+ if (dynamic_cast<const vespalib::SingleExecutor *>(executor.get()) == nullptr) {
+ return false;
+ }
+ }
+ return true;
}
+}
std::unique_ptr<ISequencedTaskExecutor>
SequencedTaskExecutor::create(uint32_t threads, uint32_t taskLimit, OptimizeFor optimize, uint32_t kindOfWatermark, duration reactionTime)
@@ -46,6 +55,7 @@ SequencedTaskExecutor::~SequencedTaskExecutor()
SequencedTaskExecutor::SequencedTaskExecutor(std::unique_ptr<std::vector<std::unique_ptr<vespalib::SyncableThreadExecutor>>> executors)
: ISequencedTaskExecutor(executors->size()),
_executors(std::move(executors)),
+ _lazyExecutors(isLazy(*_executors)),
_component2Id(vespalib::hashtable_base::getModuloStl(getNumExecutors()*8), MAGIC),
_mutex(),
_nextId(0)
@@ -70,18 +80,21 @@ SequencedTaskExecutor::executeTask(ExecutorId id, vespalib::Executor::Task::UP t
}
void
-SequencedTaskExecutor::sync()
-{
+SequencedTaskExecutor::sync() {
+ wakeup();
for (auto &executor : *_executors) {
- SingleExecutor * single = dynamic_cast<vespalib::SingleExecutor *>(executor.get());
- if (single) {
+ executor->sync();
+ }
+}
+
+void
+SequencedTaskExecutor::wakeup() {
+ if (_lazyExecutors) {
+ for (auto &executor : *_executors) {
//Enforce parallel wakeup of napping executors.
- single->startSync();
+ executor->wakeup();
}
}
- for (auto &executor : *_executors) {
- executor->sync();
- }
}
SequencedTaskExecutor::Stats