diff --git a/runtime/dart_isolate.cc b/runtime/dart_isolate.cc index 9cb2fce5e91a6..bdcd42999bb44 100644 --- a/runtime/dart_isolate.cc +++ b/runtime/dart_isolate.cc @@ -143,7 +143,8 @@ std::weak_ptr DartIsolate::CreateRunningRootIsolate( isolate_flags, // isolate_create_callback, // isolate_shutdown_callback, // - std::move(volatile_path_tracker) // + std::move(volatile_path_tracker), // + spawning_isolate // ) .lock(); @@ -251,23 +252,41 @@ std::weak_ptr DartIsolate::CreateRootIsolate( DartErrorString error; Dart_Isolate vm_isolate = nullptr; auto isolate_flags = flags.Get(); - /// TODO(b/72025) This will be where we call Dart_CreateIsolateInGroup if - /// spawning_isolate != nullptr. - vm_isolate = CreateDartIsolateGroup( - std::move(isolate_group_data), std::move(isolate_data), &isolate_flags, - error.error(), - [](std::shared_ptr* isolate_group_data, - std::shared_ptr* isolate_data, Dart_IsolateFlags* flags, - char** error) { - return Dart_CreateIsolateGroup( - (*isolate_group_data)->GetAdvisoryScriptURI().c_str(), - (*isolate_group_data)->GetAdvisoryScriptEntrypoint().c_str(), - (*isolate_group_data)->GetIsolateSnapshot()->GetDataMapping(), - (*isolate_group_data) - ->GetIsolateSnapshot() - ->GetInstructionsMapping(), - flags, isolate_group_data, isolate_data, error); - }); + + IsolateMaker isolate_maker; + // TODO(74520): Remove IsRunningPrecompiledCode conditional once isolate + // groups are supported by JIT. + if (spawning_isolate && DartVM::IsRunningPrecompiledCode()) { + isolate_maker = [spawning_isolate]( + std::shared_ptr* + isolate_group_data, + std::shared_ptr* isolate_data, + Dart_IsolateFlags* flags, char** error) { + return Dart_CreateIsolateInGroup( + /*group_member=*/spawning_isolate->isolate(), + /*name=*/(*isolate_group_data)->GetAdvisoryScriptEntrypoint().c_str(), + /*shutdown_callback=*/nullptr, + /*cleanup_callback=*/nullptr, + /*child_isolate_data=*/isolate_data, + /*error=*/error); + }; + } else { + isolate_maker = [](std::shared_ptr* + isolate_group_data, + std::shared_ptr* isolate_data, + Dart_IsolateFlags* flags, char** error) { + return Dart_CreateIsolateGroup( + (*isolate_group_data)->GetAdvisoryScriptURI().c_str(), + (*isolate_group_data)->GetAdvisoryScriptEntrypoint().c_str(), + (*isolate_group_data)->GetIsolateSnapshot()->GetDataMapping(), + (*isolate_group_data)->GetIsolateSnapshot()->GetInstructionsMapping(), + flags, isolate_group_data, isolate_data, error); + }; + } + + vm_isolate = CreateDartIsolateGroup(std::move(isolate_group_data), + std::move(isolate_data), &isolate_flags, + error.error(), isolate_maker); if (error) { FML_LOG(ERROR) << "CreateRootIsolate failed: " << error.str(); @@ -992,10 +1011,7 @@ Dart_Isolate DartIsolate::CreateDartIsolateGroup( std::unique_ptr> isolate_data, Dart_IsolateFlags* flags, char** error, - std::function*, - std::shared_ptr*, - Dart_IsolateFlags*, - char**)> make_isolate) { + const DartIsolate::IsolateMaker& make_isolate) { TRACE_EVENT0("flutter", "DartIsolate::CreateDartIsolateGroup"); // Create the Dart VM isolate and give it the embedder object as the baton. diff --git a/runtime/dart_isolate.h b/runtime/dart_isolate.h index b4705ad9c7b76..de006125f03be 100644 --- a/runtime/dart_isolate.h +++ b/runtime/dart_isolate.h @@ -517,15 +517,18 @@ class DartIsolate : public UIDartState { Dart_IsolateFlags* flags, char** error); + typedef std::function*, + std::shared_ptr*, + Dart_IsolateFlags*, + char**)> + IsolateMaker; + static Dart_Isolate CreateDartIsolateGroup( std::unique_ptr> isolate_group_data, std::unique_ptr> isolate_data, Dart_IsolateFlags* flags, char** error, - std::function*, - std::shared_ptr*, - Dart_IsolateFlags*, - char**)> make_isolate); + const IsolateMaker& make_isolate); static bool InitializeIsolate(std::shared_ptr embedder_isolate, Dart_Isolate isolate, diff --git a/runtime/dart_isolate_unittests.cc b/runtime/dart_isolate_unittests.cc index 3b25c02dec0ae..bb6ada9e3e98d 100644 --- a/runtime/dart_isolate_unittests.cc +++ b/runtime/dart_isolate_unittests.cc @@ -136,6 +136,22 @@ TEST_F(DartIsolateTest, SpawnIsolate) { auto spawn = weak_spawn.lock(); ASSERT_TRUE(spawn); ASSERT_EQ(spawn->GetPhase(), DartIsolate::Phase::Running); + + // TODO(74520): Remove conditional once isolate groups are supported by JIT. + if (DartVM::IsRunningPrecompiledCode()) { + Dart_IsolateGroup isolate_group; + { + auto isolate_scope = tonic::DartIsolateScope(root_isolate->isolate()); + isolate_group = Dart_CurrentIsolateGroup(); + } + { + auto isolate_scope = tonic::DartIsolateScope(root_isolate->isolate()); + Dart_IsolateGroup spawn_isolate_group = Dart_CurrentIsolateGroup(); + ASSERT_TRUE(isolate_group != nullptr); + ASSERT_EQ(isolate_group, spawn_isolate_group); + } + } + ASSERT_TRUE(spawn->Shutdown()); ASSERT_TRUE(root_isolate->Shutdown()); } diff --git a/runtime/dart_vm.cc b/runtime/dart_vm.cc index b23fce230f454..331dfb82e2aa6 100644 --- a/runtime/dart_vm.cc +++ b/runtime/dart_vm.cc @@ -64,9 +64,10 @@ static const char* kDartLanguageArgs[] = { // clang-format on }; -static const char* kDartPrecompilationArgs[] = { - "--precompilation", -}; +// TODO(74520): Remove flag once isolate group work is completed (or add it to +// JIT mode). +static const char* kDartPrecompilationArgs[] = {"--precompilation", + "--enable-isolate-groups"}; FML_ALLOW_UNUSED_TYPE static const char* kDartWriteProtectCodeArgs[] = {