| // 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_DART_SNAPSHOT_H_ | |
| #define FLUTTER_RUNTIME_DART_SNAPSHOT_H_ | |
| #include <memory> | |
| #include <string> | |
| #include "flutter/common/settings.h" | |
| #include "flutter/fml/macros.h" | |
| #include "flutter/fml/memory/ref_counted.h" | |
| namespace flutter { | |
| //------------------------------------------------------------------------------ | |
| /// @brief A read-only Dart heap snapshot, or, read-executable mapping of | |
| /// AOT compiled Dart code. | |
| /// | |
| /// To make Dart code startup more performant, the Flutter tools on | |
| /// the host snapshot the state of the Dart heap at specific points | |
| /// and package the same with the Flutter application. When the Dart | |
| /// VM on the target is configured to run AOT compiled Dart code, | |
| /// the tools also compile the developer's Flutter application code | |
| /// to target specific machine code (instructions). This class deals | |
| /// with the mapping of both these buffers at runtime on the target. | |
| /// | |
| /// A Flutter application typically needs two instances of this | |
| /// class at runtime to run Dart code. One instance is for the VM | |
| /// and is called the "core snapshot". The other is the isolate | |
| /// and called the "isolate snapshot". Different root isolates can | |
| /// be launched with different isolate snapshots. | |
| /// | |
| /// These snapshots are typically memory-mapped at runtime, or, | |
| /// referenced directly as symbols present in Mach or ELF binaries. | |
| /// | |
| /// In the case of the core snapshot, the snapshot is collected when | |
| /// the VM shuts down. The isolate snapshot is collected when the | |
| /// isolate group shuts down. | |
| /// | |
| class DartSnapshot : public fml::RefCountedThreadSafe<DartSnapshot> { | |
| public: | |
| //---------------------------------------------------------------------------- | |
| /// The symbol name of the heap data of the core snapshot in a dynamic library | |
| /// or currently loaded process. | |
| /// | |
| static const char* kVMDataSymbol; | |
| //---------------------------------------------------------------------------- | |
| /// The symbol name of the instructions data of the core snapshot in a dynamic | |
| /// library or currently loaded process. | |
| /// | |
| static const char* kVMInstructionsSymbol; | |
| //---------------------------------------------------------------------------- | |
| /// The symbol name of the heap data of the isolate snapshot in a dynamic | |
| /// library or currently loaded process. | |
| /// | |
| static const char* kIsolateDataSymbol; | |
| //---------------------------------------------------------------------------- | |
| /// The symbol name of the instructions data of the isolate snapshot in a | |
| /// dynamic library or currently loaded process. | |
| /// | |
| static const char* kIsolateInstructionsSymbol; | |
| //---------------------------------------------------------------------------- | |
| /// @brief From the fields present in the given settings object, infer | |
| /// the core snapshot. | |
| /// | |
| /// @attention Depending on the runtime mode of the Flutter application and | |
| /// the target that Flutter is running on, a complex fallback | |
| /// mechanism is in place to infer the locations of each snapshot | |
| /// buffer. If the caller wants to explicitly specify the buffers | |
| /// of the core snapshot, the `Settings::vm_snapshot_data` and | |
| /// `Settings::vm_snapshots_instr` mapping fields may be used. | |
| /// This specification takes precedence over all fallback search | |
| /// paths. | |
| /// | |
| /// @param[in] settings The settings to infer the core snapshot from. | |
| /// | |
| /// @return A valid core snapshot or nullptr. | |
| /// | |
| static fml::RefPtr<const DartSnapshot> VMSnapshotFromSettings( | |
| const Settings& settings); | |
| //---------------------------------------------------------------------------- | |
| /// @brief From the fields present in the given settings object, infer | |
| /// the isolate snapshot. | |
| /// | |
| /// @attention Depending on the runtime mode of the Flutter application and | |
| /// the target that Flutter is running on, a complex fallback | |
| /// mechanism is in place to infer the locations of each snapshot | |
| /// buffer. If the caller wants to explicitly specify the buffers | |
| /// of the isolate snapshot, the `Settings::isolate_snapshot_data` | |
| /// and `Settings::isolate_snapshots_instr` mapping fields may be | |
| /// used. This specification takes precedence over all fallback | |
| /// search paths. | |
| /// | |
| /// @param[in] settings The settings to infer the isolate snapshot from. | |
| /// | |
| /// @return A valid isolate snapshot or nullptr. | |
| /// | |
| static fml::RefPtr<const DartSnapshot> IsolateSnapshotFromSettings( | |
| const Settings& settings); | |
| //---------------------------------------------------------------------------- | |
| /// @brief Create an isolate snapshot from existing fml::Mappings. | |
| /// | |
| /// @param[in] snapshot_data The mapping for the heap snapshot. | |
| /// @param[in] snapshot_instructions The mapping for the instructions | |
| /// snapshot. | |
| /// | |
| /// @return A valid isolate snapshot or nullptr. | |
| static fml::RefPtr<DartSnapshot> IsolateSnapshotFromMappings( | |
| const std::shared_ptr<const fml::Mapping>& snapshot_data, | |
| const std::shared_ptr<const fml::Mapping>& snapshot_instructions); | |
| //---------------------------------------------------------------------------- | |
| /// @brief Create an isolate snapshot specialized for launching the | |
| /// service isolate. Returns nullptr if no such snapshot is | |
| /// available. | |
| /// | |
| /// @return A valid isolate snapshot or nullptr. | |
| static fml::RefPtr<DartSnapshot> VMServiceIsolateSnapshotFromSettings( | |
| const Settings& settings); | |
| //---------------------------------------------------------------------------- | |
| /// @brief Determines if this snapshot contains a heap component. Since | |
| /// the instructions component is optional, the method does not | |
| /// check for its presence. Use `IsValidForAOT` to determine if | |
| /// both the heap and instructions components of the snapshot are | |
| /// present. | |
| /// | |
| /// @return Returns if the snapshot contains a heap component. | |
| /// | |
| bool IsValid() const; | |
| //---------------------------------------------------------------------------- | |
| /// @brief Determines if this snapshot contains both the heap and | |
| /// instructions components. This is only useful when determining | |
| /// if the snapshot may be used to run AOT code. The instructions | |
| /// component will be absent in JIT modes. | |
| /// | |
| /// @return Returns if the snapshot contains both a heap and instructions | |
| /// component. | |
| /// | |
| bool IsValidForAOT() const; | |
| //---------------------------------------------------------------------------- | |
| /// @brief Get a pointer to the read-only mapping to the heap snapshot. | |
| /// | |
| /// @return The data mapping. | |
| /// | |
| const uint8_t* GetDataMapping() const; | |
| //---------------------------------------------------------------------------- | |
| /// @brief Get a pointer to the read-execute mapping to the instructions | |
| /// snapshot. | |
| /// | |
| /// @return The instructions mapping. | |
| /// | |
| const uint8_t* GetInstructionsMapping() const; | |
| //---------------------------------------------------------------------------- | |
| /// @brief Returns whether both the data and instructions mappings are | |
| /// safe to use with madvise(DONTNEED). | |
| bool IsDontNeedSafe() const; | |
| bool IsNullSafetyEnabled( | |
| const fml::Mapping* application_kernel_mapping) const; | |
| private: | |
| std::shared_ptr<const fml::Mapping> data_; | |
| std::shared_ptr<const fml::Mapping> instructions_; | |
| DartSnapshot(std::shared_ptr<const fml::Mapping> data, | |
| std::shared_ptr<const fml::Mapping> instructions); | |
| ~DartSnapshot(); | |
| FML_FRIEND_REF_COUNTED_THREAD_SAFE(DartSnapshot); | |
| FML_FRIEND_MAKE_REF_COUNTED(DartSnapshot); | |
| FML_DISALLOW_COPY_AND_ASSIGN(DartSnapshot); | |
| }; | |
| } // namespace flutter | |
| #endif // FLUTTER_RUNTIME_DART_SNAPSHOT_H_ |