Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 14 additions & 8 deletions shell/platform/fuchsia/dart_runner/dart_component_controller_v2.cc
Original file line number Diff line number Diff line change
Expand Up @@ -354,14 +354,20 @@ void DartComponentControllerV2::Run() {
loop_->Run();

if (binding_.is_bound()) {
// TODO(fxb/79871): This is likely a bug. We're taking the return_code
// of the process (a uint32_t) and implicitly converting it into a
// zx_status_t that is used as the epitaph. The uint32_t return code is
// unlikely to correspond to the epitaph status that is expected to close
// the connection (with the exception of 0 == ZX_OK). For the documentation
// of what epitaph status we should choose, see
// https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.component.runner/component_runner.fidl;l=118;drc=e3b39f2b57e720770773b857feca4f770ee0619e
binding_.Close(return_code_);
// From the documentation for ComponentController, ZX_OK should be sent when
// the ComponentController receives a termination request. However, if the
// component exited with a non-zero return code, we indicate this by sending
// an INTERNAL epitaph instead.
//
// TODO(fxb/86666): Communicate return code from the ComponentController
// once v2 has support.
if (return_code_ == 0) {
binding_.Close(ZX_OK);
} else {
FML_LOG(ERROR) << "Component exited with non-zero return code: "
<< return_code_;
binding_.Close(zx_status_t(fuchsia::component::Error::INTERNAL));
}
}
}

Expand Down
32 changes: 20 additions & 12 deletions shell/platform/fuchsia/flutter/component_v2.cc
Original file line number Diff line number Diff line change
Expand Up @@ -483,20 +483,28 @@ const std::string& ComponentV2::GetDebugLabel() const {
}

void ComponentV2::Kill() {
FML_VLOG(-1) << "ComponentController: received Kill";
FML_VLOG(-1) << "received Kill event";

// From the documentation for ComponentController, ZX_OK should be sent when
// the ComponentController receives a termination request.
// the ComponentController receives a termination request. However, if the
// component exited with a non-zero return code, we indicate this by sending
// an INTERNAL epitaph instead.
//
// TODO(fxb/50694): How should we communicate the return code of the process
// with the epitaph? Should we avoid sending ZX_OK if the return code is not
// 0?
//
// CF v1 logic for reference (the OnTerminated event no longer exists):
// component_controller_.events().OnTerminated(
// last_return_code_.second, fuchsia::sys::TerminationReason::EXITED);
// TODO(fxb/86666): Communicate return code from the ComponentController once
// v2 has support.
auto [got_return_code, return_code] = last_return_code_;
if (got_return_code && return_code == 0) {
KillWithEpitaph(ZX_OK);
} else {
if (got_return_code) {
FML_LOG(ERROR) << "Component exited with non-zero return code: "
<< return_code;
} else {
FML_LOG(ERROR) << "Failed to get return code for component";
}

KillWithEpitaph(ZX_OK);
KillWithEpitaph(zx_status_t(fuchsia::component::Error::INTERNAL));
}

// WARNING: Don't do anything past this point as this instance may have been
// collected.
Expand All @@ -512,7 +520,7 @@ void ComponentV2::KillWithEpitaph(zx_status_t epitaph_status) {
}

void ComponentV2::Stop() {
FML_VLOG(-1) << "ComponentController v2: received Stop";
FML_VLOG(-1) << "received Stop event";

// TODO(fxb/50694): Any other cleanup logic we should do that's appropriate
// for Stop but not for Kill?
Expand All @@ -529,7 +537,7 @@ void ComponentV2::OnEngineTerminate(const Engine* shell_holder) {
return;
}

// We may launch multiple shell in this component. However, we will
// We may launch multiple shells in this component. However, we will
// terminate when the last shell goes away. The error code returned to the
// component controller will be the last isolate that had an error.
auto return_code = shell_holder->GetEngineReturnCode();
Expand Down