diff --git a/runtime/dart_isolate.cc b/runtime/dart_isolate.cc index 55ac852edacd39daf45ae3f16f00980b977d2193..b8119b139da347581b29a2bbf37ccbb71c6eafad 100644 --- a/runtime/dart_isolate.cc +++ b/runtime/dart_isolate.cc @@ -774,6 +774,10 @@ DartIsolate::CreateDartVMAndEmbedderObjectPair( void DartIsolate::DartIsolateShutdownCallback( std::shared_ptr* isolate_group_data, std::shared_ptr* isolate_data) { + TRACE_EVENT0("flutter", "DartIsolate::DartIsolateShutdownCallback"); + FML_DLOG(INFO) << "DartIsolateShutdownCallback" + << " isolate_group_data " << isolate_group_data + << " isolate_data " << isolate_data; isolate_group_data->get()->OnShutdownCallback(); } diff --git a/runtime/dart_isolate_unittests.cc b/runtime/dart_isolate_unittests.cc index 73da3c6a9678e177df348060f434546c7d7c1a17..83a140737324bc3922aac454b0dfa38997fb7bb1 100644 --- a/runtime/dart_isolate_unittests.cc +++ b/runtime/dart_isolate_unittests.cc @@ -360,6 +360,7 @@ TEST_F(DartIsolateTest, CanSaveCompilationTrace) { TEST_F(DartIsolateTest, CanLaunchSecondaryIsolates) { fml::CountDownLatch latch(3); + fml::AutoResetWaitableEvent child_shutdown_latch; AddNativeCallback("NotifyNative", CREATE_NATIVE_ENTRY(([&latch](Dart_NativeArguments args) { latch.CountDown(); @@ -371,14 +372,18 @@ TEST_F(DartIsolateTest, CanLaunchSecondaryIsolates) { ASSERT_EQ("Hello from code is secondary isolate.", message); latch.CountDown(); }))); - const auto settings = CreateSettingsForFixture(); + auto settings = CreateSettingsForFixture(); + settings.isolate_shutdown_callback = [&child_shutdown_latch]() { + child_shutdown_latch.Signal(); + }; auto vm_ref = DartVMRef::Create(settings); auto isolate = RunDartCodeInIsolate(vm_ref, settings, CreateNewThread(), "testCanLaunchSecondaryIsolate", {}); ASSERT_TRUE(isolate); ASSERT_EQ(isolate->get()->GetPhase(), DartIsolate::Phase::Running); - - latch.Wait(); + child_shutdown_latch.Wait(); // wait for child isolate to shutdown first + latch.Wait(); // wait for last NotifyNative called by main isolate + // root isolate will be auto-shutdown } TEST_F(DartIsolateTest, CanRecieveArguments) { diff --git a/runtime/fixtures/runtime_test.dart b/runtime/fixtures/runtime_test.dart index da3f176c41c971d2763abac67906152776516c73..821e01e8fa433804e2bebe7118c0be5ee796c6fc 100644 --- a/runtime/fixtures/runtime_test.dart +++ b/runtime/fixtures/runtime_test.dart @@ -52,8 +52,8 @@ void secondaryIsolateMain(String message) { @pragma('vm:entry-point') void testCanLaunchSecondaryIsolate() { - Isolate.spawn(secondaryIsolateMain, 'Hello from root isolate.'); - notifyNative(); + final onExit = RawReceivePort((_) { notifyNative(); }); + Isolate.spawn(secondaryIsolateMain, 'Hello from root isolate.', onExit: onExit.sendPort); } @pragma('vm:entry-point')