| // 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_SHELL_RUNTIME_ISOLATE_CONFIGURATION_H_ | |
| #define FLUTTER_SHELL_RUNTIME_ISOLATE_CONFIGURATION_H_ | |
| #include <future> | |
| #include <memory> | |
| #include <string> | |
| #include "flutter/assets/asset_manager.h" | |
| #include "flutter/assets/asset_resolver.h" | |
| #include "flutter/common/settings.h" | |
| #include "flutter/fml/macros.h" | |
| #include "flutter/fml/mapping.h" | |
| #include "flutter/fml/memory/weak_ptr.h" | |
| #include "flutter/runtime/dart_isolate.h" | |
| namespace flutter { | |
| //------------------------------------------------------------------------------ | |
| /// @brief An isolate configuration is a collection of snapshots and asset | |
| /// managers that the engine will use to configure the isolate | |
| /// before invoking its root entrypoint. The set of snapshots must | |
| /// be sufficient for the engine to move the isolate from the | |
| /// |DartIsolate::Phase::LibrariesSetup| phase to the | |
| /// |DartIsolate::Phase::Ready| phase. Note that the isolate | |
| /// configuration will not be collected till the isolate tied to the | |
| /// configuration as well as any and all child isolates of that | |
| /// isolate are collected. The engine may ask the configuration to | |
| /// prepare multiple isolates. All subclasses of this class must be | |
| /// thread safe as the configuration may be created, collected and | |
| /// used on multiple threads. Usually these threads are engine or VM | |
| /// managed so care must be taken to ensure that subclasses do not | |
| /// reference any thread local state. | |
| /// | |
| class IsolateConfiguration { | |
| public: | |
| //---------------------------------------------------------------------------- | |
| /// @brief Attempts to infer the isolate configuration from the | |
| /// `Settings` object. If the VM is configured for AOT mode, | |
| /// snapshot resolution is attempted with predefined symbols | |
| /// present in the currently loaded process. In JIT mode, Dart | |
| /// kernel file resolution is attempted in the assets directory. | |
| /// If an IO worker is specified, snapshot resolution may be | |
| /// attempted on the serial worker task runner. The worker task | |
| /// runner thread must remain valid and running till after the | |
| /// shell associated with the engine used to launch the isolate | |
| /// for which this run configuration is used is collected. | |
| /// | |
| /// @param[in] settings The settings | |
| /// @param[in] asset_manager The optional asset manager. This is used when | |
| /// using the legacy settings fields that specify | |
| /// the asset by name instead of a mappings | |
| /// callback. | |
| /// @param[in] io_worker An optional IO worker. Specify `nullptr` if a | |
| /// worker should not be used or one is not | |
| /// available. | |
| /// | |
| /// @return An isolate configuration if one can be inferred from the | |
| /// settings. If not, returns `nullptr`. | |
| /// | |
| [[nodiscard]] static std::unique_ptr<IsolateConfiguration> InferFromSettings( | |
| const Settings& settings, | |
| const std::shared_ptr<AssetManager>& asset_manager = nullptr, | |
| const fml::RefPtr<fml::TaskRunner>& io_worker = nullptr); | |
| //---------------------------------------------------------------------------- | |
| /// @brief Creates an AOT isolate configuration using snapshot symbols | |
| /// present in the currently loaded process. These symbols need to | |
| /// be given to the Dart VM on bootstrap and hence have already | |
| /// been resolved. | |
| /// | |
| /// @return An AOT isolate configuration. | |
| /// | |
| static std::unique_ptr<IsolateConfiguration> CreateForAppSnapshot(); | |
| //---------------------------------------------------------------------------- | |
| /// @brief Creates a JIT isolate configuration using a list of futures to | |
| /// snapshots defining the ready isolate state. In environments | |
| /// where snapshot resolution is extremely expensive, embedders | |
| /// attempt to resolve snapshots on worker thread(s) and return | |
| /// the future of the promise of snapshot resolution to this | |
| /// method. That way, snapshot resolution begins well before | |
| /// isolate launch is attempted by the engine. | |
| /// | |
| /// @param[in] kernel_pieces The list of futures to Dart kernel snapshots. | |
| /// | |
| /// @return A JIT isolate configuration. | |
| /// | |
| static std::unique_ptr<IsolateConfiguration> CreateForKernelList( | |
| std::vector<std::future<std::unique_ptr<const fml::Mapping>>> | |
| kernel_pieces); | |
| //---------------------------------------------------------------------------- | |
| /// @brief Creates a JIT isolate configuration using the specified | |
| /// snapshot. This is a convenience method for the | |
| /// `CreateForKernelList` method that takes a list of futures to | |
| /// Dart kernel snapshots. | |
| /// | |
| /// @see CreateForKernelList() | |
| /// | |
| /// @param[in] kernel The kernel snapshot. | |
| /// | |
| /// @return A JIT isolate configuration. | |
| /// | |
| static std::unique_ptr<IsolateConfiguration> CreateForKernel( | |
| std::unique_ptr<const fml::Mapping> kernel); | |
| //---------------------------------------------------------------------------- | |
| /// @brief Creates a JIT isolate configuration using the specified | |
| /// snapshots. This is a convenience method for the | |
| /// `CreateForKernelList` method that takes a list of futures to | |
| /// Dart kernel snapshots. | |
| /// | |
| /// @see CreateForKernelList() | |
| /// | |
| /// @param[in] kernel_pieces The kernel pieces | |
| /// | |
| /// @return { description_of_the_return_value } | |
| /// | |
| static std::unique_ptr<IsolateConfiguration> CreateForKernelList( | |
| std::vector<std::unique_ptr<const fml::Mapping>> kernel_pieces); | |
| //---------------------------------------------------------------------------- | |
| /// @brief Create an isolate configuration. This has no threading | |
| /// restrictions. | |
| /// | |
| IsolateConfiguration(); | |
| //---------------------------------------------------------------------------- | |
| /// @brief Destroys an isolate configuration. This has no threading | |
| /// restrictions and may be collection of configurations may occur | |
| /// on any thread (and usually happens on an internal VM managed | |
| /// thread pool thread). | |
| /// | |
| virtual ~IsolateConfiguration(); | |
| //---------------------------------------------------------------------------- | |
| /// @brief When an isolate is created and sufficiently initialized to | |
| /// move it into the `DartIsolate::Phase::LibrariesSetup` phase, | |
| /// this method is invoked on the isolate to then move the isolate | |
| /// into the `DartIsolate::Phase::Ready` phase. Then isolate's | |
| /// main entrypoint is then invoked to move it into the | |
| /// `DartIsolate::Phase::Running` phase. This method will be | |
| /// called each time the root isolate is launched (which may be | |
| /// multiple times in cold-restart scenarios) as well as one each | |
| /// for any child isolates referenced by that isolate. | |
| /// | |
| /// @param isolate The isolate which is already in the | |
| /// `DartIsolate::Phase::LibrariesSetup` phase. | |
| /// | |
| /// @return Returns true if the isolate could be configured. Unless this | |
| /// returns true, the engine will not move the isolate to the | |
| /// `DartIsolate::Phase::Ready` phase for subsequent run. | |
| /// | |
| [[nodiscard]] bool PrepareIsolate(DartIsolate& isolate); | |
| virtual bool IsNullSafetyEnabled(const DartSnapshot& snapshot) = 0; | |
| protected: | |
| virtual bool DoPrepareIsolate(DartIsolate& isolate) = 0; | |
| private: | |
| FML_DISALLOW_COPY_AND_ASSIGN(IsolateConfiguration); | |
| }; | |
| } // namespace flutter | |
| #endif // FLUTTER_SHELL_RUNTIME_ISOLATE_CONFIGURATION_H_ |