// 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. #ifndef FLUTTER_RUNTIME_PLATFORM_ISOLATE_MANAGER_H_ #define FLUTTER_RUNTIME_PLATFORM_ISOLATE_MANAGER_H_ #include #include #include #include "third_party/dart/runtime/include/dart_api.h" namespace flutter { /// Maintains a list of registered platform isolates, so that they can be /// proactively shutdown as a group during shell shutdown. class PlatformIsolateManager { public: /// Returns whether the PlatformIsolateManager is shutdown. New isolates /// cannot be registered after the manager is shutdown. Must be called on the /// platform thread. bool HasShutdown(); /// Returns whether the PlatformIsolateManager is shutdown. New isolates /// cannot be registered after the manager is shutdown. Callable from any /// thread. The result may be obsolete immediately after the call. bool HasShutdownMaybeFalseNegative(); /// Register an isolate in the list of platform isolates. Callable from any /// thread. bool RegisterPlatformIsolate(Dart_Isolate isolate); /// Remove an isolate from the list of platform isolates. Must be called from /// the platform thread. void RemovePlatformIsolate(Dart_Isolate isolate); /// Shuts down all registered isolates, and the manager itself. Must be called /// from the platform thread. void ShutdownPlatformIsolates(); /// Returns whether an isolate is registered. For testing only. Callable from /// any thread. bool IsRegisteredForTestingOnly(Dart_Isolate isolate); private: // This lock must be recursive because ShutdownPlatformIsolates indirectly // calls RemovePlatformIsolate. std::recursive_mutex lock_; std::unordered_set platform_isolates_; bool is_shutdown_ = false; }; } // namespace flutter #endif // FLUTTER_RUNTIME_PLATFORM_ISOLATE_MANAGER_H_