| // Copyright 2021 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "suspend_matching_task.h" |
| |
| #include "coordinator.h" |
| #include "src/devices/lib/log/log.h" |
| |
| SuspendMatchingTask::SuspendMatchingTask(fbl::RefPtr<Device> device, uint32_t flags, Match match, |
| Completion completion) |
| : Task(device->coordinator->dispatcher(), std::move(completion)), |
| matches_(std::move(match)), |
| device_(std::move(device)), |
| flags_(flags) {} |
| |
| SuspendMatchingTask::~SuspendMatchingTask() = default; |
| |
| fbl::RefPtr<SuspendMatchingTask> SuspendMatchingTask::Create(fbl::RefPtr<Device> device, |
| uint32_t flags, Match match, |
| Completion completion) { |
| auto task = fbl::MakeRefCounted<SuspendMatchingTask>(std::move(device), flags, std::move(match), |
| std::move(completion)); |
| task->MatchDeviceChildren(*task->device_); |
| return task; |
| } |
| |
| void SuspendMatchingTask::MatchDeviceChildren(Device& device) { |
| for (auto& child : device.children()) { |
| if (matches_(child)) { |
| if (child.GetActiveSuspend() == nullptr) { |
| AddDependency(child.RequestSuspendTask(flags_)); |
| continue; |
| } |
| } else { |
| MatchDeviceChildren(child); |
| } |
| } |
| } |
| |
| void SuspendMatchingTask::Run() { Complete(ZX_OK); } |