Flutter Engine
 
Loading...
Searching...
No Matches
dart_isolate.h
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef FLUTTER_RUNTIME_DART_ISOLATE_H_
6#define FLUTTER_RUNTIME_DART_ISOLATE_H_
7
8#include <memory>
9#include <optional>
10#include <string>
11#include <unordered_set>
12
14#include "flutter/fml/macros.h"
15#include "flutter/fml/mapping.h"
19#include "third_party/dart/runtime/include/dart_api.h"
20
21namespace flutter {
22
23class DartVM;
24class DartIsolateGroupData;
25class IsolateConfiguration;
26
27//------------------------------------------------------------------------------
28/// @brief Represents an instance of a live isolate. An isolate is a
29/// separate Dart execution context. Different Dart isolates don't
30/// share memory and can be scheduled concurrently by the Dart VM on
31/// one of the Dart VM managed worker pool threads.
32///
33/// The entire lifecycle of a Dart isolate is controlled by the Dart
34/// VM. Because of this, the engine never holds a strong pointer to
35/// the Dart VM for extended periods of time. This allows the VM (or
36/// the isolates themselves) to terminate Dart execution without
37/// consulting the engine.
38///
39/// The isolate that the engine creates to act as the host for the
40/// Flutter application code with UI bindings is called the root
41/// isolate.
42///
43/// The root isolate is special in the following ways:
44/// * The root isolate forms a new isolate group. Child isolates are
45/// added to their parents groups. When the root isolate dies, all
46/// isolates in its group are terminated.
47/// * Only root isolates get UI bindings.
48/// * Root isolates execute their code on engine managed threads.
49/// All other isolates run their Dart code on Dart VM managed
50/// thread pool workers that the engine has no control over.
51/// * Since the engine does not know the thread on which non-root
52/// isolates are run, the engine has no opportunity to get a
53/// reference to non-root isolates. Such isolates can only be
54/// terminated if they terminate themselves or their isolate group
55/// is torn down.
56///
57class DartIsolate : public UIDartState {
58 public:
59 class Flags {
60 public:
61 Flags();
62
63 explicit Flags(const Dart_IsolateFlags* flags);
64
66
67 void SetNullSafetyEnabled(bool enabled);
68 void SetIsDontNeedSafe(bool value);
69
70 Dart_IsolateFlags Get() const;
71
72 private:
73 Dart_IsolateFlags flags_;
74 };
75
76 //----------------------------------------------------------------------------
77 /// @brief The engine represents all dart isolates as being in one of the
78 /// known phases. By invoking various methods on the Dart isolate,
79 /// the engine transition the Dart isolate from one phase to the
80 /// next. The Dart isolate will only move from one phase to the
81 /// next in the order specified in the `DartIsolate::Phase` enum.
82 /// That is, once the isolate has moved out of a particular phase,
83 /// it can never transition back to that phase in the future.
84 /// There is no error recovery mechanism and callers that find
85 /// their isolates in an undesirable phase must discard the
86 /// isolate and start over.
87 ///
88 enum class Phase {
89 // NOLINTBEGIN(readability-identifier-naming)
90 //--------------------------------------------------------------------------
91 /// The initial phase of all Dart isolates. This is an internal phase and
92 /// callers can never get a reference to a Dart isolate in this phase.
93 ///
94 Unknown,
95 //--------------------------------------------------------------------------
96 /// The Dart isolate has been created but none of the library tag or message
97 /// handers have been set yet. The is an internal phase and callers can
98 /// never get a reference to a Dart isolate in this phase.
99 ///
101 //--------------------------------------------------------------------------
102 /// The Dart isolate has been fully initialized but none of the
103 /// libraries referenced by that isolate have been loaded yet. This is an
104 /// internal phase and callers can never get a reference to a Dart isolate
105 /// in this phase.
106 ///
108 //--------------------------------------------------------------------------
109 /// The isolate has been fully initialized and is waiting for the caller to
110 /// associate isolate snapshots with the same. The isolate will only be
111 /// ready to execute Dart code once one of the `Prepare` calls are
112 /// successfully made.
113 ///
115 //--------------------------------------------------------------------------
116 /// The isolate is fully ready to start running Dart code. Callers can
117 /// transition the isolate to the next state by calling the `Run` or
118 /// `RunFromLibrary` methods.
119 ///
120 Ready,
121 //--------------------------------------------------------------------------
122 /// The isolate is currently running Dart code.
123 ///
124 Running,
125 //--------------------------------------------------------------------------
126 /// The isolate is no longer running Dart code and is in the middle of being
127 /// collected. This is in internal phase and callers can never get a
128 /// reference to a Dart isolate in this phase.
129 ///
130 Shutdown,
131 // NOLINTEND(readability-identifier-naming)
132 };
133
134 //----------------------------------------------------------------------------
135 /// @brief Creates an instance of a root isolate and returns a weak
136 /// pointer to the same. The isolate instance may only be used
137 /// safely on the engine thread on which it was created. In the
138 /// shell, this is the UI thread and task runner. Using the
139 /// isolate on any other thread is user error.
140 ///
141 /// The isolate that the engine creates to act as the host for the
142 /// Flutter application code with UI bindings is called the root
143 /// isolate.
144 ///
145 /// The root isolate is special in the following ways:
146 /// * The root isolate forms a new isolate group. Child isolates
147 /// are added to their parents groups. When the root isolate
148 /// dies, all isolates in its group are terminated.
149 /// * Only root isolates get UI bindings.
150 /// * Root isolates execute their code on engine managed threads.
151 /// All other isolates run their Dart code on Dart VM managed
152 /// thread pool workers that the engine has no control over.
153 /// * Since the engine does not know the thread on which non-root
154 /// isolates are run, the engine has no opportunity to get a
155 /// reference to non-root isolates. Such isolates can only be
156 /// terminated if they terminate themselves or their isolate
157 /// group is torn down.
158 ///
159 /// @param[in] settings The settings used to create the
160 /// isolate.
161 /// @param[in] platform_configuration The platform configuration for
162 /// handling communication with the
163 /// framework.
164 /// @param[in] flags The Dart isolate flags for this
165 /// isolate instance.
166 /// @param[in] dart_entrypoint The name of the dart entrypoint
167 /// function to invoke.
168 /// @param[in] dart_entrypoint_library The name of the dart library
169 /// containing the entrypoint.
170 /// @param[in] dart_entrypoint_args Arguments passed as a List<String>
171 /// to Dart's entrypoint function.
172 /// @param[in] isolate_configuration The isolate configuration used to
173 /// configure the isolate before
174 /// invoking the entrypoint.
175 /// @param[in] root_isolate_create_callback A callback called after the root
176 /// isolate is created, _without_
177 /// isolate scope. This gives the
178 /// caller a chance to finish any
179 /// setup before running the Dart
180 /// program, and after any embedder
181 /// callbacks in the settings object.
182 /// @param[in] isolate_create_callback The isolate create callback. This
183 /// will be called when the before the
184 /// main Dart entrypoint is invoked in
185 /// the root isolate. The isolate is
186 /// already in the running state at
187 /// this point and an isolate scope is
188 /// current.
189 /// @param[in] isolate_shutdown_callback The isolate shutdown callback.
190 /// This will be called before the
191 /// isolate is about to transition
192 /// into the Shutdown phase. The
193 /// isolate is still running at this
194 /// point and an isolate scope is
195 /// current.
196 /// @param[in] context Engine-owned state which is
197 /// accessed by the root dart isolate.
198 /// @param[in] spawning_isolate The isolate that is spawning the
199 /// new isolate.
200 /// @return A weak pointer to the root Dart isolate. The caller must
201 /// ensure that the isolate is not referenced for long periods of
202 /// time as it prevents isolate collection when the isolate
203 /// terminates itself. The caller may also only use the isolate on
204 /// the thread on which the isolate was created.
205 ///
206 static std::weak_ptr<DartIsolate> CreateRunningRootIsolate(
207 const Settings& settings,
208 const fml::RefPtr<const DartSnapshot>& isolate_snapshot,
209 std::unique_ptr<PlatformConfiguration> platform_configuration,
210 Flags flags,
211 const fml::closure& root_isolate_create_callback,
212 const fml::closure& isolate_create_callback,
213 const fml::closure& isolate_shutdown_callback,
214 std::optional<std::string> dart_entrypoint,
215 std::optional<std::string> dart_entrypoint_library,
216 const std::vector<std::string>& dart_entrypoint_args,
217 std::unique_ptr<IsolateConfiguration> isolate_configuration,
218 const UIDartState::Context& context,
219 const DartIsolate* spawning_isolate = nullptr,
220 std::shared_ptr<NativeAssetsManager> native_assets_manager = nullptr);
221
222 // |UIDartState|
223 ~DartIsolate() override;
224
225 //----------------------------------------------------------------------------
226 /// @brief The current phase of the isolate. The engine represents all
227 /// dart isolates as being in one of the known phases. By invoking
228 /// various methods on the Dart isolate, the engine transitions
229 /// the Dart isolate from one phase to the next. The Dart isolate
230 /// will only move from one phase to the next in the order
231 /// specified in the `DartIsolate::Phase` enum. That is, the once
232 /// the isolate has moved out of a particular phase, it can never
233 /// transition back to that phase in the future. There is no error
234 /// recovery mechanism and callers that find their isolates in an
235 /// undesirable phase must discard the isolate and start over.
236 ///
237 /// @return The current isolate phase.
238 ///
239 Phase GetPhase() const;
240
241 //----------------------------------------------------------------------------
242 /// @brief Returns the ID for an isolate which is used to query the
243 /// service protocol.
244 ///
245 /// @return The service identifier for this isolate.
246 ///
247 std::string GetServiceId();
248
249 //----------------------------------------------------------------------------
250 /// @brief Prepare the isolate for running for a precompiled code bundle.
251 /// The Dart VM must be configured for running precompiled code.
252 ///
253 /// The isolate must already be in the `Phase::LibrariesSetup`
254 /// phase. After a successful call to this method, the isolate
255 /// will transition to the `Phase::Ready` phase.
256 ///
257 /// @return Whether the isolate was prepared and the described phase
258 /// transition made.
259 ///
260 [[nodiscard]] bool PrepareForRunningFromPrecompiledCode();
261
262 //----------------------------------------------------------------------------
263 /// @brief Prepare the isolate for running for a a list of kernel files.
264 ///
265 /// The Dart VM must be configured for running from kernel
266 /// snapshots.
267 ///
268 /// The isolate must already be in the `Phase::LibrariesSetup`
269 /// phase. This call can be made multiple times. After a series of
270 /// successful calls to this method, the caller can specify the
271 /// last kernel file mapping by specifying `last_piece` to `true`.
272 /// On success, the isolate will transition to the `Phase::Ready`
273 /// phase.
274 ///
275 /// @param[in] kernel The kernel mapping.
276 /// @param[in] last_piece Indicates if this is the last kernel mapping
277 /// expected. After this point, the isolate will
278 /// attempt a transition to the `Phase::Ready` phase.
279 ///
280 /// @return If the kernel mapping supplied was successfully used to
281 /// prepare the isolate.
282 ///
283 [[nodiscard]] bool PrepareForRunningFromKernel(
284 const std::shared_ptr<const fml::Mapping>& kernel,
285 bool child_isolate,
286 bool last_piece);
287
288 //----------------------------------------------------------------------------
289 /// @brief Prepare the isolate for running for a a list of kernel files.
290 ///
291 /// The Dart VM must be configured for running from kernel
292 /// snapshots.
293 ///
294 /// The isolate must already be in the `Phase::LibrariesSetup`
295 /// phase. After a successful call to this method, the isolate
296 /// will transition to the `Phase::Ready` phase.
297 ///
298 /// @param[in] kernels The kernels
299 ///
300 /// @return If the kernel mappings supplied were successfully used to
301 /// prepare the isolate.
302 ///
303 [[nodiscard]] bool PrepareForRunningFromKernels(
304 std::vector<std::shared_ptr<const fml::Mapping>> kernels);
305
306 //----------------------------------------------------------------------------
307 /// @brief Prepare the isolate for running for a a list of kernel files.
308 ///
309 /// The Dart VM must be configured for running from kernel
310 /// snapshots.
311 ///
312 /// The isolate must already be in the `Phase::LibrariesSetup`
313 /// phase. After a successful call to this method, the isolate
314 /// will transition to the `Phase::Ready` phase.
315 ///
316 /// @param[in] kernels The kernels
317 ///
318 /// @return If the kernel mappings supplied were successfully used to
319 /// prepare the isolate.
320 ///
321 [[nodiscard]] bool PrepareForRunningFromKernels(
322 std::vector<std::unique_ptr<const fml::Mapping>> kernels);
323
324 //----------------------------------------------------------------------------
325 /// @brief Transition the root isolate to the `Phase::Running` phase and
326 /// invoke the main entrypoint (the "main" method) in the
327 /// specified library. The isolate must already be in the
328 /// `Phase::Ready` phase.
329 ///
330 /// @param[in] library_name The name of the library in which to invoke the
331 /// supplied entrypoint.
332 /// @param[in] entrypoint The entrypoint in `library_name`
333 /// @param[in] args A list of string arguments to the entrypoint.
334 ///
335 /// @return If the isolate successfully transitioned to the running phase
336 /// and the main entrypoint was invoked.
337 ///
338 [[nodiscard]] bool RunFromLibrary(std::optional<std::string> library_name,
339 std::optional<std::string> entrypoint,
340 const std::vector<std::string>& args);
341
342 //----------------------------------------------------------------------------
343 /// @brief Transition the isolate to the `Phase::Shutdown` phase. The
344 /// only thing left to do is to collect the isolate.
345 ///
346 /// @return If the isolate successfully transitioned to the shutdown
347 /// phase.
348 ///
349 [[nodiscard]] bool Shutdown();
350
351 //----------------------------------------------------------------------------
352 /// @brief Registers a callback that will be invoked in isolate scope
353 /// just before the isolate transitions to the `Phase::Shutdown`
354 /// phase.
355 ///
356 /// @param[in] closure The callback to invoke on isolate shutdown.
357 ///
358 void AddIsolateShutdownCallback(const fml::closure& closure);
359
360 //----------------------------------------------------------------------------
361 /// @brief A weak pointer to the Dart isolate instance. This instance may
362 /// only be used on the task runner that created the root isolate.
363 ///
364 /// @return The weak isolate pointer.
365 ///
366 std::weak_ptr<DartIsolate> GetWeakIsolatePtr();
367
368 //----------------------------------------------------------------------------
369 /// @brief The task runner on which the Dart code for the root isolate is
370 /// running. For the root isolate, this is the UI task runner for
371 /// the shell that owns the root isolate.
372 ///
373 /// @return The message handling task runner.
374 ///
376
377 //----------------------------------------------------------------------------
378 /// @brief Creates a new isolate in the same group as this isolate, which
379 /// runs on the platform thread. This method can only be invoked
380 /// on the root isolate.
381 ///
382 /// @param[in] entry_point The entrypoint to invoke once the isolate is
383 /// spawned. Will be run on the platform thread.
384 /// @param[out] error If spawning fails inside the Dart VM, this is
385 /// set to the error string. The error should be
386 /// reported to the user. Otherwise it is set to
387 /// null. It's possible for spawning to fail, but
388 /// this error still be null. In that case the
389 /// failure should not be reported to the user.
390 ///
391 /// @return The newly created isolate, or null if spawning failed.
392 ///
393 Dart_Isolate CreatePlatformIsolate(Dart_Handle entry_point,
394 char** error) override;
395
396 bool LoadLoadingUnit(
397 intptr_t loading_unit_id,
398 std::unique_ptr<const fml::Mapping> snapshot_data,
399 std::unique_ptr<const fml::Mapping> snapshot_instructions);
400
401 void LoadLoadingUnitError(intptr_t loading_unit_id,
402 const std::string& error_message,
403 bool transient);
404
406
408
409 /// Returns the "main" entrypoint of the library contained in the kernel
410 /// data in `mapping`.
411 static Dart_Handle LoadLibraryFromKernel(
412 const std::shared_ptr<const fml::Mapping>& mapping);
413
414 // Calls a Dart API that sets the isolate's owner thread to the current
415 // thread.
417
418 private:
420 class AutoFireClosure {
421 public:
422 explicit AutoFireClosure(const fml::closure& closure);
423
424 ~AutoFireClosure();
425
426 private:
427 fml::closure closure_;
428 FML_DISALLOW_COPY_AND_ASSIGN(AutoFireClosure);
429 };
430 friend class DartVM;
431
432 Phase phase_ = Phase::Unknown;
433 std::vector<std::unique_ptr<AutoFireClosure>> shutdown_callbacks_;
434 std::unordered_set<fml::RefPtr<DartSnapshot>> loading_unit_snapshots_;
435 fml::RefPtr<fml::TaskRunner> message_handling_task_runner_;
436 const bool may_insecurely_connect_to_all_domains_;
437 const bool is_platform_isolate_;
438 const bool is_spawning_in_group_;
439 std::string domain_network_policy_;
440 std::shared_ptr<PlatformIsolateManager> platform_isolate_manager_;
441
442 static std::weak_ptr<DartIsolate> CreateRootIsolate(
443 const Settings& settings,
444 fml::RefPtr<const DartSnapshot> isolate_snapshot,
445 std::unique_ptr<PlatformConfiguration> platform_configuration,
446 const Flags& flags,
447 const fml::closure& isolate_create_callback,
448 const fml::closure& isolate_shutdown_callback,
449 const UIDartState::Context& context,
450 const DartIsolate* spawning_isolate = nullptr,
451 std::shared_ptr<NativeAssetsManager> native_assets_manager = nullptr);
452
453 DartIsolate(const Settings& settings,
454 bool is_root_isolate,
455 const UIDartState::Context& context,
456 bool is_spawning_in_group = false);
457
458 DartIsolate(const Settings& settings,
459 const UIDartState::Context& context,
460 std::shared_ptr<PlatformIsolateManager> platform_isolate_manager);
461
462 //----------------------------------------------------------------------------
463 /// @brief Initializes the given (current) isolate.
464 ///
465 /// @param[in] dart_isolate The current isolate that is to be initialized.
466 ///
467 /// @return Whether the initialization succeeded. Irrespective of whether
468 /// the initialization suceeded, the current isolate will still be
469 /// active.
470 ///
471 [[nodiscard]] bool Initialize(Dart_Isolate dart_isolate);
472
473 void SetMessageHandlingTaskRunner(const fml::RefPtr<fml::TaskRunner>& runner,
474 bool post_directly_to_runner);
475
476 bool LoadKernel(const std::shared_ptr<const fml::Mapping>& mapping,
477 bool last_piece);
478
479 [[nodiscard]] bool LoadLibraries();
480
481 bool UpdateThreadPoolNames() const;
482
483 [[nodiscard]] bool MarkIsolateRunnable();
484
485 void OnShutdownCallback();
486
487 // |Dart_IsolateGroupCreateCallback|
488 static Dart_Isolate DartIsolateGroupCreateCallback(
489 const char* advisory_script_uri,
490 const char* advisory_script_entrypoint,
491 const char* package_root,
492 const char* package_config,
493 Dart_IsolateFlags* flags,
494 std::shared_ptr<DartIsolate>* parent_isolate_group,
495 char** error);
496
497 // |Dart_IsolateInitializeCallback|
498 static bool DartIsolateInitializeCallback(void** child_callback_data,
499 char** error);
500
501 static Dart_Isolate DartCreateAndStartServiceIsolate(
502 const char* package_root,
503 const char* package_config,
504 Dart_IsolateFlags* flags,
505 char** error);
506
507 typedef std::function<Dart_Isolate(std::shared_ptr<DartIsolateGroupData>*,
508 std::shared_ptr<DartIsolate>*,
509 Dart_IsolateFlags*,
510 char**)>
511 IsolateMaker;
512
513 static Dart_Isolate CreateDartIsolateGroup(
514 std::unique_ptr<std::shared_ptr<DartIsolateGroupData>> isolate_group_data,
515 std::unique_ptr<std::shared_ptr<DartIsolate>> isolate_data,
516 Dart_IsolateFlags* flags,
517 char** error,
518 const IsolateMaker& make_isolate);
519
520 static bool InitializeIsolate(
521 const std::shared_ptr<DartIsolate>& embedder_isolate,
522 Dart_Isolate isolate,
523 char** error);
524
525 // |Dart_IsolateShutdownCallback|
526 static void DartIsolateShutdownCallback(
527 std::shared_ptr<DartIsolateGroupData>* isolate_group_data,
528 std::shared_ptr<DartIsolate>* isolate_data);
529
530 // |Dart_IsolateCleanupCallback|
531 static void DartIsolateCleanupCallback(
532 std::shared_ptr<DartIsolateGroupData>* isolate_group_data,
533 std::shared_ptr<DartIsolate>* isolate_data);
534
535 // |Dart_IsolateGroupCleanupCallback|
536 static void DartIsolateGroupCleanupCallback(
537 std::shared_ptr<DartIsolateGroupData>* isolate_group_data);
538
539 // |Dart_DeferredLoadHandler|
540 static Dart_Handle OnDartLoadLibrary(intptr_t loading_unit_id);
541
542 static void SpawnIsolateShutdownCallback(
543 std::shared_ptr<DartIsolateGroupData>* isolate_group_data,
544 std::shared_ptr<DartIsolate>* isolate_data);
545
547};
548
549} // namespace flutter
550
551#endif // FLUTTER_RUNTIME_DART_ISOLATE_H_
void SetNullSafetyEnabled(bool enabled)
void SetIsDontNeedSafe(bool value)
Dart_IsolateFlags Get() const
Represents an instance of a live isolate. An isolate is a separate Dart execution context....
bool PrepareForRunningFromKernel(const std::shared_ptr< const fml::Mapping > &kernel, bool child_isolate, bool last_piece)
Prepare the isolate for running for a a list of kernel files.
std::string GetServiceId()
Returns the ID for an isolate which is used to query the service protocol.
void LoadLoadingUnitError(intptr_t loading_unit_id, const std::string &error_message, bool transient)
std::weak_ptr< DartIsolate > GetWeakIsolatePtr()
A weak pointer to the Dart isolate instance. This instance may only be used on the task runner that c...
Dart_Isolate CreatePlatformIsolate(Dart_Handle entry_point, char **error) override
Creates a new isolate in the same group as this isolate, which runs on the platform thread....
bool PrepareForRunningFromKernels(std::vector< std::shared_ptr< const fml::Mapping > > kernels)
Prepare the isolate for running for a a list of kernel files.
static Dart_Handle LoadLibraryFromKernel(const std::shared_ptr< const fml::Mapping > &mapping)
bool RunFromLibrary(std::optional< std::string > library_name, std::optional< std::string > entrypoint, const std::vector< std::string > &args)
Transition the root isolate to the Phase::Running phase and invoke the main entrypoint (the "main" me...
DartIsolateGroupData & GetIsolateGroupData()
void AddIsolateShutdownCallback(const fml::closure &closure)
Registers a callback that will be invoked in isolate scope just before the isolate transitions to the...
fml::RefPtr< fml::TaskRunner > GetMessageHandlingTaskRunner() const
The task runner on which the Dart code for the root isolate is running. For the root isolate,...
bool Shutdown()
Transition the isolate to the Phase::Shutdown phase. The only thing left to do is to collect the isol...
Phase GetPhase() const
The current phase of the isolate. The engine represents all dart isolates as being in one of the know...
static std::weak_ptr< DartIsolate > CreateRunningRootIsolate(const Settings &settings, const fml::RefPtr< const DartSnapshot > &isolate_snapshot, std::unique_ptr< PlatformConfiguration > platform_configuration, Flags flags, const fml::closure &root_isolate_create_callback, const fml::closure &isolate_create_callback, const fml::closure &isolate_shutdown_callback, std::optional< std::string > dart_entrypoint, std::optional< std::string > dart_entrypoint_library, const std::vector< std::string > &dart_entrypoint_args, std::unique_ptr< IsolateConfiguration > isolate_configuration, const UIDartState::Context &context, const DartIsolate *spawning_isolate=nullptr, std::shared_ptr< NativeAssetsManager > native_assets_manager=nullptr)
Creates an instance of a root isolate and returns a weak pointer to the same. The isolate instance ma...
bool PrepareForRunningFromPrecompiledCode()
Prepare the isolate for running for a precompiled code bundle. The Dart VM must be configured for run...
bool LoadLoadingUnit(intptr_t loading_unit_id, std::unique_ptr< const fml::Mapping > snapshot_data, std::unique_ptr< const fml::Mapping > snapshot_instructions)
Phase
The engine represents all dart isolates as being in one of the known phases. By invoking various meth...
Describes a running instance of the Dart VM. There may only be one running instance of the Dart VM in...
Definition dart_vm.h:61
An isolate configuration is a collection of snapshots and asset managers that the engine will use to ...
PlatformConfiguration * platform_configuration() const
Dart_Isolate isolate()
Definition dart_state.h:51
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
const uint8_t uint32_t uint32_t GError ** error
#define FML_DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition macros.h:27
std::function< void()> closure
Definition closure.h:14
The subset of state which is owned by the shell or engine and passed through the RuntimeController in...