mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Bug: https://github.com/dart-lang/sdk/issues/44019 Bug: https://github.com/flutter/flutter/issues/92120
188 lines
8.3 KiB
C++
188 lines
8.3 KiB
C++
// 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(
|
|
std::shared_ptr<const fml::Mapping> snapshot_data,
|
|
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_
|