diff options
Diffstat (limited to 'staging_vespalib/src/vespa/vespalib/util/sequencedtaskexecutor.cpp')
-rw-r--r-- | staging_vespalib/src/vespa/vespalib/util/sequencedtaskexecutor.cpp | 29 |
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 |