blob: 310c8529cb73a017ffdf71056fba691bf17d4130 [file] [log] [blame]
// Copyright 2016 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_SYS_SYSMGR_APP_H_
#define SRC_SYS_SYSMGR_APP_H_
#include <fuchsia/hardware/power/statecontrol/cpp/fidl.h>
#include <fuchsia/pkg/cpp/fidl.h>
#include <fuchsia/sys/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/sys/cpp/service_directory.h>
#include <lib/vfs/cpp/pseudo_dir.h>
#include <lib/zx/time.h>
#include <deque>
#include <map>
#include <memory>
#include <string>
#include <unordered_set>
#include "src/lib/fxl/macros.h"
#include "src/sys/sysmgr/config.h"
#include "src/sys/sysmgr/package_updating_loader.h"
namespace sysmgr {
// The sysmgr creates a nested environment within which it starts apps
// and wires up the UI services they require.
//
// The nested environment consists of the following system applications
// which are started on demand then retained as singletons for the lifetime
// of the environment.
class App {
public:
explicit App(Config config, std::shared_ptr<sys::ServiceDirectory> incoming_services,
async::Loop* loop);
~App();
// Launch component in the sys realm.
// If the component is marked as critical, it is tracked and restarted when it crashes.
void LaunchComponent(const fuchsia::sys::LaunchInfo& launch_info,
fuchsia::sys::ComponentController::OnTerminatedCallback on_terminate,
fit::function<void(zx_status_t)> on_ctrl_err);
private:
zx::channel OpenAsDirectory();
void ConnectToService(const std::string& service_name, zx::channel channel);
void RegisterSingleton(std::string service_name, fuchsia::sys::LaunchInfoPtr launch_info,
bool is_optional_service);
void RegisterLoader();
void RegisterDefaultServiceConnector();
void RebootFromCriticalComponent(const std::string& component_url);
void StartDiagnostics(fuchsia::sys::LaunchInfo launch_diagnostics, async::Loop* loop);
async::Loop* loop_;
std::shared_ptr<sys::ServiceDirectory> incoming_services_;
// Keep track of services provided by each component URL.
std::map<std::string, std::shared_ptr<sys::ServiceDirectory>> services_;
// Nested environment within which the apps started by sysmgr will run.
fuchsia::sys::EnvironmentPtr env_;
fuchsia::sys::EnvironmentControllerPtr env_controller_;
fuchsia::sys::LauncherPtr env_launcher_;
std::shared_ptr<sys::ServiceDirectory> env_services_;
vfs::PseudoDir svc_root_;
std::vector<std::string> svc_names_;
std::unique_ptr<PackageUpdatingLoader> package_updating_loader_;
fuchsia::sys::LoaderPtr loader_;
fidl::BindingSet<fuchsia::sys::Loader> loader_bindings_;
bool auto_updates_enabled_;
fuchsia::hardware::power::statecontrol::AdminPtr power_admin_;
// The set of critical components.
std::unordered_set<std::string> critical_components_;
// Contains the ComponentControllers of all component URLs launched by sysmgr.
// They are removed from this map when the associated component dies.
std::unordered_map<std::string, fuchsia::sys::ComponentControllerPtr> controllers_;
FXL_DISALLOW_COPY_AND_ASSIGN(App);
};
} // namespace sysmgr
#endif // SRC_SYS_SYSMGR_APP_H_