| // 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 |