| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "flutter/runtime/platform_isolate_manager.h" |
| |
| #include "flutter/runtime/dart_isolate.h" |
| |
| namespace flutter { |
| |
| bool PlatformIsolateManager::HasShutdown() { |
| // TODO(flutter/flutter#136314): Assert that we're on the platform thread. |
| std::scoped_lock lock(lock_); |
| return is_shutdown_; |
| } |
| |
| bool PlatformIsolateManager::HasShutdownMaybeFalseNegative() { |
| std::scoped_lock lock(lock_); |
| return is_shutdown_; |
| } |
| |
| bool PlatformIsolateManager::RegisterPlatformIsolate(Dart_Isolate isolate) { |
| std::scoped_lock lock(lock_); |
| if (is_shutdown_) { |
| // It's possible shutdown occured while we were trying to aquire the lock. |
| return false; |
| } |
| FML_DCHECK(platform_isolates_.find(isolate) == platform_isolates_.end()); |
| platform_isolates_.insert(isolate); |
| return true; |
| } |
| |
| void PlatformIsolateManager::RemovePlatformIsolate(Dart_Isolate isolate) { |
| // This method is only called by DartIsolate::OnShutdownCallback() during |
| // isolate shutdown. This can happen either during the ordinary platform |
| // isolate shutdown, or during ShutdownPlatformIsolates(). In either case |
| // we're on the platform thread. |
| // TODO(flutter/flutter#136314): Assert that we're on the platform thread. |
| // Need a method that works for ShutdownPlatformIsolates() too. |
| std::scoped_lock lock(lock_); |
| if (is_shutdown_) { |
| // Removal during ShutdownPlatformIsolates. Ignore, to avoid modifying |
| // platform_isolates_ during iteration. |
| FML_DCHECK(platform_isolates_.empty()); |
| return; |
| } |
| FML_DCHECK(platform_isolates_.find(isolate) != platform_isolates_.end()); |
| platform_isolates_.erase(isolate); |
| } |
| |
| void PlatformIsolateManager::ShutdownPlatformIsolates() { |
| // TODO(flutter/flutter#136314): Assert that we're on the platform thread. |
| // There's no current UIDartState here, so platform_isolate.cc's method won't |
| // work. |
| std::scoped_lock lock(lock_); |
| is_shutdown_ = true; |
| std::unordered_set<Dart_Isolate> platform_isolates; |
| std::swap(platform_isolates_, platform_isolates); |
| for (Dart_Isolate isolate : platform_isolates) { |
| Dart_EnterIsolate(isolate); |
| Dart_ShutdownIsolate(); |
| } |
| } |
| |
| bool PlatformIsolateManager::IsRegisteredForTestingOnly(Dart_Isolate isolate) { |
| std::scoped_lock lock(lock_); |
| return platform_isolates_.find(isolate) != platform_isolates_.end(); |
| } |
| |
| } // namespace flutter |