Flutter Engine
The Flutter Engine
Public Member Functions | Static Public Member Functions | Protected Member Functions | List of all members
flutter::IsolateConfiguration Class Referenceabstract

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. More...

#include <isolate_configuration.h>

Inheritance diagram for flutter::IsolateConfiguration:
flutter::AppSnapshotIsolateConfiguration flutter::KernelIsolateConfiguration flutter::KernelListIsolateConfiguration

Public Member Functions

 IsolateConfiguration ()
 Create an isolate configuration. This has no threading restrictions. More...
 
virtual ~IsolateConfiguration ()
 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). More...
 
bool PrepareIsolate (DartIsolate &isolate)
 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. More...
 
virtual bool IsNullSafetyEnabled (const DartSnapshot &snapshot)=0
 

Static Public Member Functions

static std::unique_ptr< IsolateConfigurationInferFromSettings (const Settings &settings, const std::shared_ptr< AssetManager > &asset_manager=nullptr, const fml::RefPtr< fml::TaskRunner > &io_worker=nullptr, IsolateLaunchType launch_type=IsolateLaunchType::kNewGroup)
 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. More...
 
static std::unique_ptr< IsolateConfigurationCreateForAppSnapshot ()
 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. More...
 
static std::unique_ptr< IsolateConfigurationCreateForKernelList (std::vector< std::future< std::unique_ptr< const fml::Mapping > > > kernel_pieces)
 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. More...
 
static std::unique_ptr< IsolateConfigurationCreateForKernel (std::unique_ptr< const fml::Mapping > kernel)
 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. More...
 
static std::unique_ptr< IsolateConfigurationCreateForKernelList (std::vector< std::unique_ptr< const fml::Mapping > > kernel_pieces)
 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. More...
 

Protected Member Functions

virtual bool DoPrepareIsolate (DartIsolate &isolate)=0
 

Detailed Description

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.

Definition at line 49 of file isolate_configuration.h.

Constructor & Destructor Documentation

◆ IsolateConfiguration()

flutter::IsolateConfiguration::IsolateConfiguration ( )
default

Create an isolate configuration. This has no threading restrictions.

◆ ~IsolateConfiguration()

flutter::IsolateConfiguration::~IsolateConfiguration ( )
virtualdefault

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).

Member Function Documentation

◆ CreateForAppSnapshot()

std::unique_ptr< IsolateConfiguration > flutter::IsolateConfiguration::CreateForAppSnapshot ( )
static

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.

Returns
An AOT isolate configuration.

Definition at line 269 of file isolate_configuration.cc.

269 {
270 return std::make_unique<AppSnapshotIsolateConfiguration>();
271}

◆ CreateForKernel()

std::unique_ptr< IsolateConfiguration > flutter::IsolateConfiguration::CreateForKernel ( std::unique_ptr< const fml::Mapping kernel)
static

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 also
CreateForKernelList()
Parameters
[in]kernelThe kernel snapshot.
Returns
A JIT isolate configuration.

Definition at line 273 of file isolate_configuration.cc.

274 {
275 return std::make_unique<KernelIsolateConfiguration>(std::move(kernel));
276}

◆ CreateForKernelList() [1/2]

std::unique_ptr< IsolateConfiguration > flutter::IsolateConfiguration::CreateForKernelList ( std::vector< std::future< std::unique_ptr< const fml::Mapping > > >  kernel_pieces)
static

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.

Parameters
[in]kernel_piecesThe list of futures to Dart kernel snapshots.
Returns
A JIT isolate configuration.

Definition at line 293 of file isolate_configuration.cc.

295 {
296 return std::make_unique<KernelListIsolateConfiguration>(
297 std::move(kernel_pieces));
298}

◆ CreateForKernelList() [2/2]

std::unique_ptr< IsolateConfiguration > flutter::IsolateConfiguration::CreateForKernelList ( std::vector< std::unique_ptr< const fml::Mapping > >  kernel_pieces)
static

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 also
CreateForKernelList()
Parameters
[in]kernel_piecesThe kernel pieces
Returns
{ description_of_the_return_value }

Definition at line 278 of file isolate_configuration.cc.

279 {
280 std::vector<std::future<std::unique_ptr<const fml::Mapping>>> pieces;
281 for (auto& piece : kernel_pieces) {
282 if (!piece) {
283 FML_DLOG(ERROR) << "Invalid kernel piece.";
284 continue;
285 }
286 std::promise<std::unique_ptr<const fml::Mapping>> promise;
287 pieces.push_back(promise.get_future());
288 promise.set_value(std::move(piece));
289 }
290 return CreateForKernelList(std::move(pieces));
291}
static std::unique_ptr< IsolateConfiguration > CreateForKernelList(std::vector< std::future< std::unique_ptr< const fml::Mapping > > > kernel_pieces)
Creates a JIT isolate configuration using a list of futures to snapshots defining the ready isolate s...
#define FML_DLOG(severity)
Definition: logging.h:102
#define ERROR(message)
Definition: elf_loader.cc:260

◆ DoPrepareIsolate()

virtual bool flutter::IsolateConfiguration::DoPrepareIsolate ( DartIsolate isolate)
protectedpure virtual

◆ InferFromSettings()

std::unique_ptr< IsolateConfiguration > flutter::IsolateConfiguration::InferFromSettings ( const Settings settings,
const std::shared_ptr< AssetManager > &  asset_manager = nullptr,
const fml::RefPtr< fml::TaskRunner > &  io_worker = nullptr,
IsolateLaunchType  launch_type = IsolateLaunchType::kNewGroup 
)
static

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.

Parameters
[in]settingsThe settings
[in]asset_managerThe optional asset manager. This is used when using the legacy settings fields that specify the asset by name instead of a mappings callback.
[in]io_workerAn optional IO worker. Specify nullptr if a worker should not be used or one is not available.
[in]launch_typeWhether the isolate is launching to form a new group or as part of an existing group. If it is part of an existing group, the isolate will reuse resources if it can.
Returns
An isolate configuration if one can be inferred from the settings. If not, returns nullptr.

Definition at line 203 of file isolate_configuration.cc.

207 {
208 // Running in AOT mode.
210 return CreateForAppSnapshot();
211 }
212
213 if (launch_type == IsolateLaunchType::kExistingGroup) {
214 return CreateForKernel(nullptr);
215 }
216
217 if (settings.application_kernels) {
218 return CreateForKernelList(settings.application_kernels());
219 }
220
221 if (settings.application_kernel_asset.empty() &&
222 settings.application_kernel_list_asset.empty()) {
223 FML_DLOG(ERROR) << "application_kernel_asset or "
224 "application_kernel_list_asset must be set";
225 return nullptr;
226 }
227
228 if (!asset_manager) {
229 FML_DLOG(ERROR) << "No asset manager specified when attempting to create "
230 "isolate configuration.";
231 return nullptr;
232 }
233
234 // Running from kernel snapshot. Requires asset manager.
235 {
236 std::unique_ptr<fml::Mapping> kernel =
237 asset_manager->GetAsMapping(settings.application_kernel_asset);
238 if (kernel) {
239 return CreateForKernel(std::move(kernel));
240 }
241 }
242
243 // Running from kernel divided into several pieces (for sharing). Requires
244 // asset manager and io worker.
245
246 if (!io_worker) {
247 FML_DLOG(ERROR) << "No IO worker specified to load kernel pieces.";
248 return nullptr;
249 }
250
251 {
252 std::unique_ptr<fml::Mapping> kernel_list =
253 asset_manager->GetAsMapping(settings.application_kernel_list_asset);
254 if (!kernel_list) {
255 FML_LOG(ERROR) << "Failed to load: "
256 << settings.application_kernel_list_asset;
257 return nullptr;
258 }
259 auto kernel_pieces_paths = ParseKernelListPaths(std::move(kernel_list));
260 auto kernel_mappings =
261 PrepareKernelMappings(kernel_pieces_paths, asset_manager, io_worker);
262 return CreateForKernelList(std::move(kernel_mappings));
263 }
264
265 return nullptr;
266}
static bool IsRunningPrecompiledCode()
Checks if VM instances in the process can run precompiled code. This call can be made at any time and...
Definition: dart_vm.cc:205
static std::unique_ptr< IsolateConfiguration > CreateForAppSnapshot()
Creates an AOT isolate configuration using snapshot symbols present in the currently loaded process....
static std::unique_ptr< IsolateConfiguration > CreateForKernel(std::unique_ptr< const fml::Mapping > kernel)
Creates a JIT isolate configuration using the specified snapshot. This is a convenience method for th...
#define FML_LOG(severity)
Definition: logging.h:82
static std::vector< std::string > ParseKernelListPaths(std::unique_ptr< fml::Mapping > kernel_list)
static std::vector< std::future< std::unique_ptr< const fml::Mapping > > > PrepareKernelMappings(const std::vector< std::string > &kernel_pieces_paths, const std::shared_ptr< AssetManager > &asset_manager, const fml::RefPtr< fml::TaskRunner > &io_worker)

◆ IsNullSafetyEnabled()

virtual bool flutter::IsolateConfiguration::IsNullSafetyEnabled ( const DartSnapshot snapshot)
pure virtual

◆ PrepareIsolate()

bool flutter::IsolateConfiguration::PrepareIsolate ( DartIsolate isolate)

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.

Parameters
isolateThe isolate which is already in the DartIsolate::Phase::LibrariesSetup phase.
Returns
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.

Definition at line 16 of file isolate_configuration.cc.

16 {
17 if (isolate.GetPhase() != DartIsolate::Phase::LibrariesSetup) {
19 << "Isolate was in incorrect phase to be prepared for running.";
20 return false;
21 }
22
23 return DoPrepareIsolate(isolate);
24}
virtual bool DoPrepareIsolate(DartIsolate &isolate)=0

The documentation for this class was generated from the following files: