aboutsummaryrefslogtreecommitdiffstats
path: root/staging_vespalib/src/vespa/vespalib/util/sequencedtaskexecutorobserver.h
diff options
context:
space:
mode:
Diffstat (limited to 'staging_vespalib/src/vespa/vespalib/util/sequencedtaskexecutorobserver.h')
-rw-r--r--staging_vespalib/src/vespa/vespalib/util/sequencedtaskexecutorobserver.h38
1 files changed, 38 insertions, 0 deletions
diff --git a/staging_vespalib/src/vespa/vespalib/util/sequencedtaskexecutorobserver.h b/staging_vespalib/src/vespa/vespalib/util/sequencedtaskexecutorobserver.h
new file mode 100644
index 00000000000..9307a7ddb37
--- /dev/null
+++ b/staging_vespalib/src/vespa/vespalib/util/sequencedtaskexecutorobserver.h
@@ -0,0 +1,38 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include "isequencedtaskexecutor.h"
+#include <atomic>
+
+namespace vespalib {
+
+/**
+ * Observer class to observe class to run multiple tasks in parallel,
+ * but tasks with same id has to be run in sequence.
+ */
+class SequencedTaskExecutorObserver : public ISequencedTaskExecutor
+{
+ ISequencedTaskExecutor &_executor;
+ std::atomic<uint32_t> _executeCnt;
+ std::atomic<uint32_t> _syncCnt;
+ std::vector<uint32_t> _executeHistory;
+ std::mutex _mutex;
+public:
+ using ISequencedTaskExecutor::getExecutorId;
+
+ SequencedTaskExecutorObserver(ISequencedTaskExecutor &executor);
+ ~SequencedTaskExecutorObserver() override;
+
+ void executeTask(ExecutorId id, vespalib::Executor::Task::UP task) override;
+ void sync() override;
+
+ uint32_t getExecuteCnt() const { return _executeCnt; }
+ uint32_t getSyncCnt() const { return _syncCnt; }
+ std::vector<uint32_t> getExecuteHistory();
+
+ void setTaskLimit(uint32_t taskLimit) override;
+
+ vespalib::ExecutorStats getStats() override;
+};
+
+} // namespace search