blob: 138e9c1492a05e956716c497f120315e5e8a8749 [file] [log] [blame]
// 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.
#ifndef SRC_DEVICES_BIN_DRIVER_MANAGER_V1_RESUME_CONTEXT_H_
#define SRC_DEVICES_BIN_DRIVER_MANAGER_V1_RESUME_CONTEXT_H_
#include <fidl/fuchsia.hardware.power.statecontrol/cpp/wire.h>
#include "src/devices/bin/driver_manager/device.h"
#include "src/devices/bin/driver_manager/v1/resume_task.h"
using statecontrol_fidl::wire::SystemPowerState;
// Tracks the global resume state that is currently in progress.
class ResumeContext {
public:
enum class Flags : uint32_t {
kResume = 0u,
kSuspended = 1u,
};
ResumeContext() = default;
ResumeContext(Flags flags, SystemPowerState resume_state)
: target_state_(resume_state), flags_(flags) {}
~ResumeContext() {}
ResumeContext(ResumeContext&&) = default;
ResumeContext& operator=(ResumeContext&&) = default;
Flags flags() const { return flags_; }
void set_flags(Flags flags) { flags_ = flags; }
void push_pending_task(fbl::RefPtr<ResumeTask> task) {
pending_resume_tasks_.push_back(std::move(task));
}
void push_completed_task(fbl::RefPtr<ResumeTask> task) {
completed_resume_tasks_.push_back(std::move(task));
}
bool pending_tasks_is_empty() const { return pending_resume_tasks_.is_empty(); }
bool completed_tasks_is_empty() const { return completed_resume_tasks_.is_empty(); }
std::optional<fbl::RefPtr<ResumeTask>> take_pending_task(Device& dev) {
for (size_t i = 0; i < pending_resume_tasks_.size(); i++) {
if (&pending_resume_tasks_[i]->device() == &dev) {
auto task = pending_resume_tasks_.erase(i);
return std::move(task);
}
}
return {};
}
void reset_completed_tasks() { completed_resume_tasks_.reset(); }
SystemPowerState target_state() const { return target_state_; }
private:
fbl::Vector<fbl::RefPtr<ResumeTask>> pending_resume_tasks_;
fbl::Vector<fbl::RefPtr<ResumeTask>> completed_resume_tasks_;
SystemPowerState target_state_;
Flags flags_ = Flags::kSuspended;
};
#endif // SRC_DEVICES_BIN_DRIVER_MANAGER_V1_RESUME_CONTEXT_H_