mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Ensure that the isolate shutdown callback occurs in an isolate scope. (flutter/engine#6572)
This commit is contained in:
parent
cd7f7da9ff
commit
fa0ee74d36
@ -477,6 +477,7 @@ bool DartIsolate::Shutdown() {
|
||||
// the isolate to shutdown as a parameter.
|
||||
FML_DCHECK(Dart_CurrentIsolate() == nullptr);
|
||||
Dart_EnterIsolate(vm_isolate);
|
||||
shutdown_callbacks_.clear();
|
||||
Dart_ShutdownIsolate();
|
||||
FML_DCHECK(Dart_CurrentIsolate() == nullptr);
|
||||
}
|
||||
|
||||
@ -46,4 +46,39 @@ TEST_F(DartIsolateTest, RootIsolateCreationAndShutdown) {
|
||||
ASSERT_TRUE(root_isolate->Shutdown());
|
||||
}
|
||||
|
||||
TEST_F(DartIsolateTest, IsolateShutdownCallbackIsInIsolateScope) {
|
||||
Settings settings = {};
|
||||
settings.task_observer_add = [](intptr_t, fml::closure) {};
|
||||
settings.task_observer_remove = [](intptr_t) {};
|
||||
auto vm = DartVM::ForProcess(settings);
|
||||
ASSERT_TRUE(vm);
|
||||
TaskRunners task_runners(CURRENT_TEST_NAME, //
|
||||
GetCurrentTaskRunner(), //
|
||||
GetCurrentTaskRunner(), //
|
||||
GetCurrentTaskRunner(), //
|
||||
GetCurrentTaskRunner() //
|
||||
);
|
||||
auto weak_isolate = DartIsolate::CreateRootIsolate(
|
||||
vm.get(), // vm
|
||||
vm->GetIsolateSnapshot(), // isolate snapshot
|
||||
vm->GetSharedSnapshot(), // shared snapshot
|
||||
std::move(task_runners), // task runners
|
||||
nullptr, // window
|
||||
{}, // resource context
|
||||
nullptr, // unref qeueue
|
||||
"main.dart", // advisory uri
|
||||
"main" // advisory entrypoint
|
||||
);
|
||||
auto root_isolate = weak_isolate.lock();
|
||||
ASSERT_TRUE(root_isolate);
|
||||
ASSERT_EQ(root_isolate->GetPhase(), DartIsolate::Phase::LibrariesSetup);
|
||||
size_t destruction_callback_count = 0;
|
||||
root_isolate->AddIsolateShutdownCallback([&destruction_callback_count]() {
|
||||
ASSERT_NE(Dart_CurrentIsolate(), nullptr);
|
||||
destruction_callback_count++;
|
||||
});
|
||||
ASSERT_TRUE(root_isolate->Shutdown());
|
||||
ASSERT_EQ(destruction_callback_count, 1u);
|
||||
}
|
||||
|
||||
} // namespace blink
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user