@@ -99,21 +99,27 @@ class AutoIsolateShutdown {
9999 AutoIsolateShutdown () = default ;
100100
101101 AutoIsolateShutdown (std::shared_ptr<DartIsolate> isolate,
102- fml::RefPtr<fml::TaskRunner> runner)
103- : isolate_(std::move(isolate)), runner_(std::move(runner)) {}
102+ fml::RefPtr<fml::TaskRunner> runner,
103+ bool confirm_shutdown)
104+ : isolate_(std::move(isolate)),
105+ runner_ (std::move(runner)),
106+ confirm_shutdown_(confirm_shutdown) {}
104107
105108 ~AutoIsolateShutdown () {
106109 if (!IsValid ()) {
107110 return ;
108111 }
109112 fml::AutoResetWaitableEvent latch;
110- fml::TaskRunner::RunNowOrPostTask (runner_, [isolate = isolate_, &latch]() {
111- FML_LOG (INFO) << " Shutting down isolate." ;
112- if (!isolate->Shutdown ()) {
113- FML_LOG (ERROR) << " Could not shutdown isolate." ;
114- }
115- latch.Signal ();
116- });
113+ fml::TaskRunner::RunNowOrPostTask (
114+ runner_,
115+ [isolate = isolate_, &latch, confirm_shutdown = confirm_shutdown_]() {
116+ FML_LOG (INFO) << " Shutting down isolate." ;
117+ if (!isolate->Shutdown () && confirm_shutdown) {
118+ FML_LOG (ERROR) << " Could not shutdown isolate." ;
119+ FML_CHECK (false );
120+ }
121+ latch.Signal ();
122+ });
117123 latch.Wait ();
118124 }
119125
@@ -148,6 +154,7 @@ class AutoIsolateShutdown {
148154 private:
149155 std::shared_ptr<DartIsolate> isolate_;
150156 fml::RefPtr<fml::TaskRunner> runner_;
157+ bool confirm_shutdown_;
151158
152159 FML_DISALLOW_COPY_AND_ASSIGN (AutoIsolateShutdown);
153160};
@@ -157,7 +164,8 @@ static void RunDartCodeInIsolate(DartVMRef& vm_ref,
157164 const Settings& settings,
158165 fml::RefPtr<fml::TaskRunner> task_runner,
159166 std::string entrypoint,
160- const std::vector<std::string>& args) {
167+ const std::vector<std::string>& args,
168+ bool confirm_shutdown) {
161169 FML_CHECK (task_runner->RunsTasksOnCurrentThread ());
162170
163171 if (!vm_ref) {
@@ -192,8 +200,8 @@ static void RunDartCodeInIsolate(DartVMRef& vm_ref,
192200 settings.isolate_shutdown_callback // isolate shutdown callback
193201 );
194202
195- auto root_isolate =
196- std::make_unique<AutoIsolateShutdown>( weak_isolate.lock (), task_runner);
203+ auto root_isolate = std::make_unique<AutoIsolateShutdown>(
204+ weak_isolate.lock (), task_runner, confirm_shutdown );
197205
198206 if (!root_isolate->IsValid ()) {
199207 FML_LOG (ERROR) << " Could not create isolate." ;
@@ -266,13 +274,14 @@ static std::unique_ptr<AutoIsolateShutdown> RunDartCodeInIsolate(
266274 const Settings& settings,
267275 fml::RefPtr<fml::TaskRunner> task_runner,
268276 std::string entrypoint,
269- const std::vector<std::string>& args) {
277+ const std::vector<std::string>& args,
278+ bool confirm_shutdown) {
270279 std::unique_ptr<AutoIsolateShutdown> result;
271280 fml::AutoResetWaitableEvent latch;
272281 fml::TaskRunner::RunNowOrPostTask (
273282 task_runner, fml::MakeCopyable ([&]() mutable {
274283 RunDartCodeInIsolate (vm_ref, result, settings, task_runner, entrypoint,
275- args);
284+ args, confirm_shutdown );
276285 latch.Signal ();
277286 }));
278287 latch.Wait ();
@@ -284,7 +293,7 @@ TEST_F(DartIsolateTest, IsolateCanLoadAndRunDartCode) {
284293 const auto settings = CreateSettingsForFixture ();
285294 auto vm_ref = DartVMRef::Create (settings);
286295 auto isolate = RunDartCodeInIsolate (vm_ref, settings, GetCurrentTaskRunner (),
287- " main" , {});
296+ " main" , {}, true );
288297 ASSERT_TRUE (isolate);
289298 ASSERT_EQ (isolate->get ()->GetPhase (), DartIsolate::Phase::Running);
290299}
@@ -294,7 +303,7 @@ TEST_F(DartIsolateTest, IsolateCannotLoadAndRunUnknownDartEntrypoint) {
294303 const auto settings = CreateSettingsForFixture ();
295304 auto vm_ref = DartVMRef::Create (settings);
296305 auto isolate = RunDartCodeInIsolate (vm_ref, settings, GetCurrentTaskRunner (),
297- " thisShouldNotExist" , {});
306+ " thisShouldNotExist" , {}, true );
298307 ASSERT_FALSE (isolate);
299308}
300309
@@ -303,7 +312,7 @@ TEST_F(DartIsolateTest, CanRunDartCodeCodeSynchronously) {
303312 const auto settings = CreateSettingsForFixture ();
304313 auto vm_ref = DartVMRef::Create (settings);
305314 auto isolate = RunDartCodeInIsolate (vm_ref, settings, GetCurrentTaskRunner (),
306- " main" , {});
315+ " main" , {}, true );
307316
308317 ASSERT_TRUE (isolate);
309318 ASSERT_EQ (isolate->get ()->GetPhase (), DartIsolate::Phase::Running);
@@ -327,7 +336,7 @@ TEST_F(DartIsolateTest, CanRegisterNativeCallback) {
327336 const auto settings = CreateSettingsForFixture ();
328337 auto vm_ref = DartVMRef::Create (settings);
329338 auto isolate = RunDartCodeInIsolate (vm_ref, settings, CreateNewThread (),
330- " canRegisterNativeCallback" , {});
339+ " canRegisterNativeCallback" , {}, true );
331340 ASSERT_TRUE (isolate);
332341 ASSERT_EQ (isolate->get ()->GetPhase (), DartIsolate::Phase::Running);
333342 latch.Wait ();
@@ -350,7 +359,7 @@ TEST_F(DartIsolateTest, CanSaveCompilationTrace) {
350359 const auto settings = CreateSettingsForFixture ();
351360 auto vm_ref = DartVMRef::Create (settings);
352361 auto isolate = RunDartCodeInIsolate (vm_ref, settings, CreateNewThread (),
353- " testCanSaveCompilationTrace" , {});
362+ " testCanSaveCompilationTrace" , {}, true );
354363 ASSERT_TRUE (isolate);
355364 ASSERT_EQ (isolate->get ()->GetPhase (), DartIsolate::Phase::Running);
356365
@@ -376,8 +385,9 @@ TEST_F(DartIsolateTest, CanLaunchSecondaryIsolates) {
376385 child_shutdown_latch.Signal ();
377386 };
378387 auto vm_ref = DartVMRef::Create (settings);
379- auto isolate = RunDartCodeInIsolate (vm_ref, settings, CreateNewThread (),
380- " testCanLaunchSecondaryIsolate" , {});
388+ auto isolate =
389+ RunDartCodeInIsolate (vm_ref, settings, CreateNewThread (),
390+ " testCanLaunchSecondaryIsolate" , {}, true );
381391 ASSERT_TRUE (isolate);
382392 ASSERT_EQ (isolate->get ()->GetPhase (), DartIsolate::Phase::Running);
383393 child_shutdown_latch.Wait (); // wait for child isolate to shutdown first
@@ -396,8 +406,9 @@ TEST_F(DartIsolateTest, CanRecieveArguments) {
396406
397407 const auto settings = CreateSettingsForFixture ();
398408 auto vm_ref = DartVMRef::Create (settings);
399- auto isolate = RunDartCodeInIsolate (vm_ref, settings, CreateNewThread (),
400- " testCanRecieveArguments" , {" arg1" });
409+ auto isolate =
410+ RunDartCodeInIsolate (vm_ref, settings, CreateNewThread (),
411+ " testCanRecieveArguments" , {" arg1" }, true );
401412 ASSERT_TRUE (isolate);
402413 ASSERT_EQ (isolate->get ()->GetPhase (), DartIsolate::Phase::Running);
403414
@@ -435,7 +446,7 @@ TEST_F(DartIsolateTest, RootIsolateShutdownStopsChildIsolates) {
435446 fml::TaskRunner::RunNowOrPostTask (
436447 task_runner, fml::MakeCopyable ([&]() mutable {
437448 RunDartCodeInIsolate (vm_ref, isolate, settings, task_runner,
438- " testSecondaryIsolateShutdown" , {});
449+ " testSecondaryIsolateShutdown" , {}, false );
439450 }));
440451 latch.Wait (); // wait for last NotifyNative called by main isolate
441452 ASSERT_TRUE (isolate->get ()->Shutdown () || true );
0 commit comments