blob: 02a88a51a24ef7a449a1d7d5021326c1e784e5e1 [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_SUSPEND_HANDLER_H_
#define SRC_DEVICES_BIN_DRIVER_MANAGER_SUSPEND_HANDLER_H_
#include <fuchsia/fshost/llcpp/fidl.h>
#include "suspend_matching_task.h"
#include "suspend_task.h"
using SuspendCallback = fit::callback<void(zx_status_t)>;
class SuspendHandler {
public:
enum class Flags : uint32_t {
// The system is running, nothing is suspended.
kRunning = 0u,
// The entire system is suspended or in the middle of being suspended.
kSuspend = 1u,
// The devices whose's drivers live in storage are suspended or in the middle of being
// suspended.
kStorageSuspend = 2u,
};
// Create a SuspendHandler. `coordinator` is a weak pointer that must outlive `SuspendHandler`.
SuspendHandler(Coordinator* coordinator, bool suspend_fallback, zx::duration suspend_timeout);
bool InSuspend() const { return flags_ != SuspendHandler::Flags::kRunning; }
void Suspend(uint32_t flags, SuspendCallback callback);
// Shut down all filesystems (and fshost itself) by calling
// fuchsia.fshost.Admin.Shutdown(). Note that this is called from multiple
// different locations; during suspension, and in a low-memory situation.
// Currently, both of these calls happen on the same dispatcher thread, but
// consider thread safety when refactoring.
void ShutdownFilesystems(fit::callback<void(zx_status_t)> callback);
// Suspend all of the devices where the device driver lives in storage. This should be called
// by fshost as it is shutting down.
void UnregisterSystemStorageForShutdown(SuspendCallback callback);
// For testing only: Set the fshost admin client.
void set_fshost_admin_client(fidl::Client<fuchsia_fshost::Admin> client) {
fshost_admin_client_ = std::move(client);
}
private:
bool AnyTasksInProgress();
void SuspendAfterFilesystemShutdown();
Coordinator* coordinator_;
bool suspend_fallback_;
zx::duration suspend_timeout_;
SuspendCallback suspend_callback_;
fbl::RefPtr<SuspendTask> suspend_task_;
fbl::RefPtr<SuspendMatchingTask> unregister_system_storage_task_;
std::unique_ptr<async::TaskClosure> suspend_watchdog_task_;
fidl::Client<fuchsia_fshost::Admin> fshost_admin_client_;
Flags flags_ = Flags::kRunning;
// suspend flags
uint32_t sflags_ = 0u;
};
#endif // SRC_DEVICES_BIN_DRIVER_MANAGER_SUSPEND_HANDLER_H_