| // Copyright 2024 The ChromiumOS Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "heartd/daemon/top_sheriff.h" |
| |
| #include <memory> |
| #include <utility> |
| |
| #include <base/logging.h> |
| #include <base/task/single_thread_task_runner.h> |
| |
| namespace heartd { |
| |
| TopSheriff::TopSheriff(base::OnceCallback<void()> quit_heartd_job) |
| : quit_heartd_job_(std::move(quit_heartd_job)) {} |
| |
| TopSheriff::~TopSheriff() = default; |
| |
| void TopSheriff::OneShotWork() { |
| // Asks the managed sheriffs get to work. |
| for (const auto& sheriff : sheriffs) { |
| sheriff->GetToWork(); |
| } |
| |
| // Run CleanUp() after two minutes from start up so that we can terminate |
| // heartd earlier when there are no active jobs. |
| base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask( |
| FROM_HERE, base::BindOnce(&TopSheriff::CleanUp, base::Unretained(this)), |
| base::Minutes(2)); |
| } |
| |
| bool TopSheriff::HasShiftWork() { |
| return true; |
| } |
| |
| void TopSheriff::AdjustSchedule() { |
| schedule_ = base::Hours(1); |
| } |
| |
| void TopSheriff::ShiftWork() { |
| CleanUp(); |
| for (const auto& sheriff : sheriffs) { |
| sheriff->CleanUp(); |
| } |
| } |
| |
| void TopSheriff::CleanUp() { |
| for (const auto& sheriff : sheriffs) { |
| if (sheriff->IsWorking()) { |
| return; |
| } |
| } |
| |
| LOG(INFO) << "There is no running jobs, stop heartd"; |
| std::move(quit_heartd_job_).Run(); |
| } |
| |
| void TopSheriff::AddSheriff(std::unique_ptr<Sheriff> sheriff) { |
| sheriffs.push_back(std::move(sheriff)); |
| } |
| |
| } // namespace heartd |