diff options
Diffstat (limited to 'src/buildtool/progress_reporting/task_tracker.hpp')
-rw-r--r-- | src/buildtool/progress_reporting/task_tracker.hpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/buildtool/progress_reporting/task_tracker.hpp b/src/buildtool/progress_reporting/task_tracker.hpp new file mode 100644 index 00000000..dc127190 --- /dev/null +++ b/src/buildtool/progress_reporting/task_tracker.hpp @@ -0,0 +1,64 @@ +// Copyright 2023 Huawei Cloud Computing Technology Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef INCLUDED_SRC_BUILDTOOL_PROGRESS_REPORTING_TASK_TRACKER_HPP +#define INCLUDED_SRC_BUILDTOOL_PROGRESS_REPORTING_TASK_TRACKER_HPP + +#include <cstdint> +#include <mutex> +#include <string> +#include <unordered_map> + +#include "src/buildtool/logging/log_level.hpp" +#include "src/buildtool/logging/logger.hpp" + +class TaskTracker { + public: + auto Start(const std::string& id) noexcept -> void { + std::unique_lock lock(m_); + ++prio_; + try { + running_.emplace(id, prio_); + } catch (...) { + Logger::Log(LogLevel::Warning, + "Internal error in progress tracking; progress reports " + "might be incorrect."); + } + } + + auto Stop(const std::string& id) noexcept -> void { + std::unique_lock lock(m_); + running_.erase(id); + } + + [[nodiscard]] auto Sample() noexcept -> std::string { + std::unique_lock lock(m_); + std::string result{}; + uint64_t started = prio_ + 1; + for (auto const& it : running_) { + if (it.second < started) { + result = it.first; + started = it.second; + } + } + return result; + } + + private: + uint64_t prio_{}; + std::mutex m_{}; + std::unordered_map<std::string, uint64_t> running_{}; +}; + +#endif // INCLUDED_SRC_BUILDTOOL_PROGRESS_REPORTING_TASK_TRACKER_HPP |