1*6777b538SAndroid Build Coastguard Worker // Copyright 2021 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include "base/fuchsia/process_lifecycle.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #include <lib/async/default.h> 8*6777b538SAndroid Build Coastguard Worker #include <zircon/process.h> 9*6777b538SAndroid Build Coastguard Worker #include <zircon/processargs.h> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include "base/check.h" 12*6777b538SAndroid Build Coastguard Worker #include "base/fuchsia/fuchsia_logging.h" 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker namespace base { 15*6777b538SAndroid Build Coastguard Worker ProcessLifecycle(base::OnceClosure on_stop)16*6777b538SAndroid Build Coastguard WorkerProcessLifecycle::ProcessLifecycle(base::OnceClosure on_stop) 17*6777b538SAndroid Build Coastguard Worker : on_stop_(std::move(on_stop)) { 18*6777b538SAndroid Build Coastguard Worker // Sanity-check that an instance was not already created. 19*6777b538SAndroid Build Coastguard Worker static bool was_created = false; 20*6777b538SAndroid Build Coastguard Worker DCHECK(!was_created); 21*6777b538SAndroid Build Coastguard Worker was_created = true; 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker // Under Components Framework v2 the ELF runner provides PA_LIFECYCLE. 24*6777b538SAndroid Build Coastguard Worker zx::channel lifecycle_server_channel(zx_take_startup_handle(PA_LIFECYCLE)); 25*6777b538SAndroid Build Coastguard Worker CHECK(lifecycle_server_channel.is_valid()); 26*6777b538SAndroid Build Coastguard Worker fidl::ServerEnd<fuchsia_process_lifecycle::Lifecycle> lifecycle_server_end( 27*6777b538SAndroid Build Coastguard Worker std::move(lifecycle_server_channel)); 28*6777b538SAndroid Build Coastguard Worker binding_.emplace(async_get_default_dispatcher(), 29*6777b538SAndroid Build Coastguard Worker std::move(lifecycle_server_end), this, 30*6777b538SAndroid Build Coastguard Worker fidl::kIgnoreBindingClosure); 31*6777b538SAndroid Build Coastguard Worker } 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker ProcessLifecycle::~ProcessLifecycle() = default; 34*6777b538SAndroid Build Coastguard Worker Stop(ProcessLifecycle::StopCompleter::Sync & completer)35*6777b538SAndroid Build Coastguard Workervoid ProcessLifecycle::Stop(ProcessLifecycle::StopCompleter::Sync& completer) { 36*6777b538SAndroid Build Coastguard Worker if (on_stop_) { 37*6777b538SAndroid Build Coastguard Worker std::move(on_stop_).Run(); 38*6777b538SAndroid Build Coastguard Worker } 39*6777b538SAndroid Build Coastguard Worker } 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker } // namespace base 42