Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 1b2b9c4

Browse files
committed
Confirm shutdown
1 parent ba0a3d0 commit 1b2b9c4

File tree

1 file changed

+35
-24
lines changed

1 file changed

+35
-24
lines changed

runtime/dart_isolate_unittests.cc

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)