| // 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. |
| |
| #include "garnet/bin/appmgr/environment_controller_impl.h" |
| |
| #include <utility> |
| |
| #include <lib/fit/function.h> |
| |
| #include "garnet/bin/appmgr/realm.h" |
| |
| namespace component { |
| |
| EnvironmentControllerImpl::EnvironmentControllerImpl( |
| fidl::InterfaceRequest<fuchsia::sys::EnvironmentController> request, |
| std::unique_ptr<Realm> realm) |
| : binding_(this), realm_(std::move(realm)) { |
| if (request.is_valid()) { |
| binding_.Bind(std::move(request)); |
| binding_.set_error_handler([this](zx_status_t status) { |
| realm_->parent()->ExtractChild(realm_.get()); |
| // The destructor of the temporary returned by ExtractChild destroys |
| // |this| at the end of the previous statement. |
| }); |
| } |
| } |
| |
| EnvironmentControllerImpl::~EnvironmentControllerImpl() = default; |
| |
| void EnvironmentControllerImpl::Kill(KillCallback callback) { |
| std::unique_ptr<EnvironmentControllerImpl> self = |
| realm_->parent()->ExtractChild(realm_.get()); |
| realm_ = nullptr; |
| callback(); |
| // The |self| destructor destroys |this| when we unwind this stack frame. |
| } |
| |
| void EnvironmentControllerImpl::Detach() { |
| binding_.set_error_handler(nullptr); |
| } |
| |
| void EnvironmentControllerImpl::OnCreated() { binding_.events().OnCreated(); } |
| |
| } // namespace component |