From 2555ddade23a5fd8a05c4a94e9cdfe3c939e2d5e Mon Sep 17 00:00:00 2001 From: Chinmay Garde Date: Wed, 17 Oct 2018 12:58:43 -0700 Subject: [PATCH] Ensure that the isolate shutdown callback occurs in an isolate scope. --- runtime/dart_isolate.cc | 1 + runtime/dart_isolate_unittests.cc | 35 +++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/runtime/dart_isolate.cc b/runtime/dart_isolate.cc index db01e619cba32..ef62d141b3e77 100644 --- a/runtime/dart_isolate.cc +++ b/runtime/dart_isolate.cc @@ -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); } diff --git a/runtime/dart_isolate_unittests.cc b/runtime/dart_isolate_unittests.cc index cb7797abdcb74..f876d349a2648 100644 --- a/runtime/dart_isolate_unittests.cc +++ b/runtime/dart_isolate_unittests.cc @@ -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