| // 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 <atomic> |
| #include <mutex> |
| #include <unordered_set> |
| |
| #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<Dart_Isolate> platform_isolates_; |
| bool is_shutdown_ = false; |
| }; |
| |
| } // namespace flutter |
| |
| #endif // FLUTTER_RUNTIME_PLATFORM_ISOLATE_MANAGER_H_ |