Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
system.cc
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#include "system.h"
6
7#include <array>
8
9#include <fuchsia/io/cpp/fidl.h>
10#include <lib/fdio/directory.h>
11#include <lib/fdio/fd.h>
12#include <lib/fdio/io.h>
13#include <lib/fdio/namespace.h>
14#include <lib/zx/channel.h>
15#include <sys/stat.h>
16#include <unistd.h>
17#include <zircon/process.h>
18#include <zircon/processargs.h>
19#include <zircon/syscalls/iob.h>
20
24
25using tonic::ToDart;
26
27namespace zircon {
28namespace dart {
29
30namespace {
31
32constexpr char kGetSizeResult[] = "GetSizeResult";
33constexpr char kHandlePairResult[] = "HandlePairResult";
34constexpr char kHandleResult[] = "HandleResult";
35constexpr char kReadResult[] = "ReadResult";
36constexpr char kHandleInfo[] = "HandleInfo";
37constexpr char kReadEtcResult[] = "ReadEtcResult";
38constexpr char kWriteResult[] = "WriteResult";
39constexpr char kFromFileResult[] = "FromFileResult";
40constexpr char kMapResult[] = "MapResult";
41
42class ByteDataScope {
43 public:
44 explicit ByteDataScope(Dart_Handle dart_handle) : dart_handle_(dart_handle) {
45 Acquire();
46 }
47
48 explicit ByteDataScope(size_t size) {
49 dart_handle_ = Dart_NewTypedData(Dart_TypedData_kByteData, size);
51 Acquire();
52 FML_DCHECK(size == size_);
53 }
54
55 ~ByteDataScope() {
56 if (is_valid_) {
57 Release();
58 }
59 }
60
61 void* data() const { return data_; }
62 size_t size() const { return size_; }
63 Dart_Handle dart_handle() const { return dart_handle_; }
64 bool is_valid() const { return is_valid_; }
65
66 void Release() {
67 FML_DCHECK(is_valid_);
68 Dart_Handle result = Dart_TypedDataReleaseData(dart_handle_);
70 is_valid_ = false;
71 data_ = nullptr;
72 size_ = 0;
73 }
74
75 private:
76 void Acquire() {
77 FML_DCHECK(size_ == 0);
78 FML_DCHECK(data_ == nullptr);
79 FML_DCHECK(!is_valid_);
80
81 Dart_TypedData_Type type;
82 intptr_t size;
83 Dart_Handle result =
84 Dart_TypedDataAcquireData(dart_handle_, &type, &data_, &size);
85 is_valid_ = !tonic::CheckAndHandleError(result) &&
86 type == Dart_TypedData_kByteData && data_;
87 if (is_valid_) {
88 size_ = size;
89 } else {
90 size_ = 0;
91 }
92 }
93
94 Dart_Handle dart_handle_;
95 bool is_valid_ = false;
96 size_t size_ = 0;
97 void* data_ = nullptr;
98};
99
100Dart_Handle MakeHandleList(const std::vector<zx_handle_t>& in_handles) {
101 tonic::DartClassLibrary& class_library =
103 Dart_Handle handle_type = class_library.GetClass("zircon", "Handle");
104 Dart_Handle list = Dart_NewListOfTypeFilled(
105 handle_type, Handle::CreateInvalid(), in_handles.size());
106 if (Dart_IsError(list))
107 return list;
108 for (size_t i = 0; i < in_handles.size(); i++) {
109 Dart_Handle result =
110 Dart_ListSetAt(list, i, ToDart(Handle::Create(in_handles[i])));
111 if (Dart_IsError(result))
112 return result;
113 }
114 return list;
115}
116
117template <class... Args>
118Dart_Handle ConstructDartObject(const char* class_name, Args&&... args) {
119 tonic::DartClassLibrary& class_library =
121 Dart_Handle type =
122 Dart_HandleFromPersistent(class_library.GetClass("zircon", class_name));
124
125 const char* cstr;
126 Dart_StringToCString(Dart_ToString(type), &cstr);
127
128 std::array<Dart_Handle, sizeof...(Args)> args_array{
129 {std::forward<Args>(args)...}};
130 Dart_Handle object =
131 Dart_New(type, Dart_EmptyString(), sizeof...(Args), args_array.data());
133 return object;
134}
135
136Dart_Handle MakeHandleInfoList(
137 const std::vector<zx_handle_info_t>& in_handles) {
138 tonic::DartClassLibrary& class_library =
140 Dart_Handle handle_info_type = class_library.GetClass("zircon", kHandleInfo);
141 Dart_Handle empty_handle_info = ConstructDartObject(
142 kHandleInfo, ToDart(Handle::CreateInvalid()), ToDart(-1), ToDart(-1));
143 Dart_Handle list = Dart_NewListOfTypeFilled(
144 handle_info_type, empty_handle_info, in_handles.size());
145 if (Dart_IsError(list))
146 return list;
147 for (size_t i = 0; i < in_handles.size(); i++) {
148 Dart_Handle handle = ToDart(Handle::Create(in_handles[i].handle));
149 Dart_Handle result = Dart_ListSetAt(
150 list, i,
151 ConstructDartObject(kHandleInfo, handle, ToDart(in_handles[i].type),
152 ToDart(in_handles[i].rights)));
153 if (Dart_IsError(result))
154 return result;
155 }
156 return list;
157}
158
159fdio_ns_t* GetNamespace() {
160 // Grab the fdio_ns_t* out of the isolate.
161 Dart_Handle zircon_lib = Dart_LookupLibrary(ToDart("dart:zircon"));
163 Dart_Handle namespace_type =
164 Dart_GetNonNullableType(zircon_lib, ToDart("_Namespace"), 0, nullptr);
165 FML_DCHECK(!tonic::CheckAndHandleError(namespace_type));
166 Dart_Handle namespace_field =
167 Dart_GetField(namespace_type, ToDart("_namespace"));
168 FML_DCHECK(!tonic::CheckAndHandleError(namespace_field));
169 uint64_t fdio_ns_ptr;
170 Dart_Handle result = Dart_IntegerToUint64(namespace_field, &fdio_ns_ptr);
172
173 return reinterpret_cast<fdio_ns_t*>(fdio_ns_ptr);
174}
175
176zx_status_t FdFromPath(const char* path, fml::UniqueFD& fd) {
177 fml::UniqueFD dir_fd(fdio_ns_opendir(GetNamespace()));
178 if (!dir_fd.is_valid()) {
179 // TODO: can we return errno?
180 return ZX_ERR_IO;
181 }
182 if (path != nullptr && *path == '/') {
183 path++;
184 }
185 int raw_fd;
186 if (zx_status_t status = fdio_open3_fd_at(
187 dir_fd.get(), path, uint64_t{fuchsia::io::PERM_READABLE}, &raw_fd);
188 status != ZX_OK) {
189 return status;
190 }
191 fd.reset(raw_fd);
192 return ZX_OK;
193}
194
195} // namespace
196
198
199Dart_Handle System::ChannelCreate(uint32_t options) {
200 zx_handle_t out0 = 0, out1 = 0;
201 zx_status_t status = zx_channel_create(options, &out0, &out1);
202 if (status != ZX_OK) {
203 return ConstructDartObject(kHandlePairResult, ToDart(status));
204 } else {
205 return ConstructDartObject(kHandlePairResult, ToDart(status),
206 ToDart(Handle::Create(out0)),
207 ToDart(Handle::Create(out1)));
208 }
209}
210
211zx_status_t System::ConnectToService(std::string path,
213 return fdio_ns_service_connect(GetNamespace(), path.c_str(),
214 channel->ReleaseHandle());
215}
216
217Dart_Handle System::ChannelFromFile(std::string path) {
218 fml::UniqueFD fd;
219 if (zx_status_t status = FdFromPath(path.c_str(), fd); status != ZX_OK) {
220 return ConstructDartObject(kHandleResult, ToDart(status));
221 }
222
223 zx::handle handle;
224 if (zx_status_t status =
225 fdio_fd_transfer(fd.release(), handle.reset_and_get_address());
226 status != ZX_OK) {
227 return ConstructDartObject(kHandleResult, ToDart(status));
228 }
229 zx_info_handle_basic_t info;
230 if (zx_status_t status = handle.get_info(ZX_INFO_HANDLE_BASIC, &info,
231 sizeof(info), nullptr, nullptr);
232 status != ZX_OK) {
233 return ConstructDartObject(kHandleResult, ToDart(status));
234 }
235 if (info.type != ZX_OBJ_TYPE_CHANNEL) {
236 return ConstructDartObject(kHandleResult, ToDart(ZX_ERR_WRONG_TYPE));
237 }
238
239 return ConstructDartObject(kHandleResult, ToDart(ZX_OK),
240 ToDart(Handle::Create(handle.release())));
241}
242
245 std::vector<Handle*> handles) {
246 if (!channel || !channel->is_valid()) {
247 data.Release();
248 return ZX_ERR_BAD_HANDLE;
249 }
250
251 std::vector<zx_handle_t> zx_handles;
252 for (Handle* handle : handles) {
253 zx_handles.push_back(handle->handle());
254 }
255
256 zx_status_t status = zx_channel_write(channel->handle(), 0, data.data(),
257 data.length_in_bytes(),
258 zx_handles.data(), zx_handles.size());
259 // Handles are always consumed.
260 for (Handle* handle : handles) {
261 handle->ReleaseHandle();
262 }
263
264 data.Release();
265 return status;
266}
267
271 std::vector<HandleDisposition*> handle_dispositions) {
272 if (!channel || !channel->is_valid()) {
273 data.Release();
274 return ZX_ERR_BAD_HANDLE;
275 }
276
277 std::vector<zx_handle_disposition_t> zx_handle_dispositions;
278 for (HandleDisposition* handle : handle_dispositions) {
279 FML_DCHECK(handle->result() == ZX_OK);
280 zx_handle_dispositions.push_back({.operation = handle->operation(),
281 .handle = handle->handle()->handle(),
282 .type = handle->type(),
283 .rights = handle->rights(),
284 .result = ZX_OK});
285 }
286
287 zx_status_t status = zx_channel_write_etc(
288 channel->handle(), 0, data.data(), data.length_in_bytes(),
289 zx_handle_dispositions.data(), zx_handle_dispositions.size());
290
291 for (size_t i = 0; i < handle_dispositions.size(); ++i) {
292 handle_dispositions[i]->set_result(zx_handle_dispositions[i].result);
293
294 // Handles that are not copied (i.e. moved) are always consumed.
295 if (handle_dispositions[i]->operation() != ZX_HANDLE_OP_DUPLICATE) {
296 handle_dispositions[i]->handle()->ReleaseHandle();
297 }
298 }
299
300 data.Release();
301 return status;
302}
303
305 if (!channel || !channel->is_valid()) {
306 return ConstructDartObject(kReadResult, ToDart(ZX_ERR_BAD_HANDLE));
307 }
308
309 uint32_t actual_bytes = 0;
310 uint32_t actual_handles = 0;
311
312 // Query the size of the next message.
313 zx_status_t status = zx_channel_read(channel->handle(), 0, nullptr, nullptr,
314 0, 0, &actual_bytes, &actual_handles);
315 if (status != ZX_ERR_BUFFER_TOO_SMALL) {
316 // An empty message or an error.
317 return ConstructDartObject(kReadResult, ToDart(status));
318 }
319
320 // Allocate space for the bytes and handles.
321 ByteDataScope bytes(actual_bytes);
322 FML_DCHECK(bytes.is_valid());
323 std::vector<zx_handle_t> handles(actual_handles);
324
325 // Make the call to actually get the message.
326 status = zx_channel_read(channel->handle(), 0, bytes.data(), handles.data(),
327 bytes.size(), handles.size(), &actual_bytes,
328 &actual_handles);
329 FML_DCHECK(status != ZX_OK || bytes.size() == actual_bytes);
330
331 bytes.Release();
332
333 if (status == ZX_OK) {
334 FML_DCHECK(handles.size() == actual_handles);
335
336 // return a ReadResult object.
337 return ConstructDartObject(kReadResult, ToDart(status), bytes.dart_handle(),
338 ToDart(actual_bytes), MakeHandleList(handles));
339 } else {
340 return ConstructDartObject(kReadResult, ToDart(status));
341 }
342}
343
345 if (!channel || !channel->is_valid()) {
346 return ConstructDartObject(kReadEtcResult, ToDart(ZX_ERR_BAD_HANDLE));
347 }
348
349 uint32_t actual_bytes = 0;
350 uint32_t actual_handles = 0;
351
352 // Query the size of the next message.
353 zx_status_t status = zx_channel_read(channel->handle(), 0, nullptr, nullptr,
354 0, 0, &actual_bytes, &actual_handles);
355 if (status != ZX_ERR_BUFFER_TOO_SMALL) {
356 // An empty message or an error.
357 return ConstructDartObject(kReadEtcResult, ToDart(status));
358 }
359
360 // Allocate space for the bytes and handles.
361 ByteDataScope bytes(actual_bytes);
362 FML_DCHECK(bytes.is_valid());
363 std::vector<zx_handle_info_t> handles(actual_handles);
364
365 // Make the call to actually get the message.
366 status = zx_channel_read_etc(channel->handle(), 0, bytes.data(),
367 handles.data(), bytes.size(), handles.size(),
368 &actual_bytes, &actual_handles);
369 FML_DCHECK(status != ZX_OK || bytes.size() == actual_bytes);
370
371 bytes.Release();
372
373 if (status == ZX_OK) {
374 FML_DCHECK(handles.size() == actual_handles);
375
376 // return a ReadResult object.
377 return ConstructDartObject(kReadEtcResult, ToDart(status),
378 bytes.dart_handle(), ToDart(actual_bytes),
379 MakeHandleInfoList(handles));
380 } else {
381 return ConstructDartObject(kReadEtcResult, ToDart(status));
382 }
383}
384
385Dart_Handle System::EventpairCreate(uint32_t options) {
386 zx_handle_t out0 = 0, out1 = 0;
387 zx_status_t status = zx_eventpair_create(0, &out0, &out1);
388 if (status != ZX_OK) {
389 return ConstructDartObject(kHandlePairResult, ToDart(status));
390 } else {
391 return ConstructDartObject(kHandlePairResult, ToDart(status),
392 ToDart(Handle::Create(out0)),
393 ToDart(Handle::Create(out1)));
394 }
395}
396
397Dart_Handle System::SocketCreate(uint32_t options) {
398 zx_handle_t out0 = 0, out1 = 0;
399 zx_status_t status = zx_socket_create(options, &out0, &out1);
400 if (status != ZX_OK) {
401 return ConstructDartObject(kHandlePairResult, ToDart(status));
402 } else {
403 return ConstructDartObject(kHandlePairResult, ToDart(status),
404 ToDart(Handle::Create(out0)),
405 ToDart(Handle::Create(out1)));
406 }
407}
408
411 int options) {
412 if (!socket || !socket->is_valid()) {
413 data.Release();
414 return ConstructDartObject(kWriteResult, ToDart(ZX_ERR_BAD_HANDLE));
415 }
416
417 size_t actual;
418 zx_status_t status = zx_socket_write(socket->handle(), options, data.data(),
419 data.length_in_bytes(), &actual);
420 data.Release();
421 return ConstructDartObject(kWriteResult, ToDart(status), ToDart(actual));
422}
423
424Dart_Handle System::SocketRead(fml::RefPtr<Handle> socket, size_t size) {
425 if (!socket || !socket->is_valid()) {
426 return ConstructDartObject(kReadResult, ToDart(ZX_ERR_BAD_HANDLE));
427 }
428
429 ByteDataScope bytes(size);
430 size_t actual;
431 zx_status_t status =
432 zx_socket_read(socket->handle(), 0, bytes.data(), size, &actual);
433 bytes.Release();
434 if (status == ZX_OK) {
435 FML_DCHECK(actual <= size);
436 return ConstructDartObject(kReadResult, ToDart(status), bytes.dart_handle(),
437 ToDart(actual));
438 }
439
440 return ConstructDartObject(kReadResult, ToDart(status));
441}
442
443Dart_Handle System::VmoCreate(uint64_t size, uint32_t options) {
444 zx_handle_t vmo = ZX_HANDLE_INVALID;
445 zx_status_t status = zx_vmo_create(size, options, &vmo);
446 if (status != ZX_OK) {
447 return ConstructDartObject(kHandleResult, ToDart(status));
448 } else {
449 return ConstructDartObject(kHandleResult, ToDart(status),
450 ToDart(Handle::Create(vmo)));
451 }
452}
453
454Dart_Handle System::VmoFromFile(std::string path) {
455 fml::UniqueFD fd;
456 if (zx_status_t status = FdFromPath(path.c_str(), fd); status != ZX_OK) {
457 return ConstructDartObject(kHandleResult, ToDart(status));
458 }
459
460 struct stat stat_struct;
461 if (fstat(fd.get(), &stat_struct) != 0) {
462 // TODO: can we return errno?
463 return ConstructDartObject(kFromFileResult, ToDart(ZX_ERR_IO));
464 }
465 zx::vmo vmo;
466 if (zx_status_t status =
467 fdio_get_vmo_clone(fd.get(), vmo.reset_and_get_address());
468 status != ZX_OK) {
469 return ConstructDartObject(kFromFileResult, ToDart(status));
470 }
471
472 return ConstructDartObject(kFromFileResult, ToDart(ZX_OK),
473 ToDart(Handle::Create(vmo.release())),
474 ToDart(stat_struct.st_size));
475}
476
478 if (!vmo || !vmo->is_valid()) {
479 return ConstructDartObject(kGetSizeResult, ToDart(ZX_ERR_BAD_HANDLE));
480 }
481
482 uint64_t size;
483 zx_status_t status = zx_vmo_get_size(vmo->handle(), &size);
484
485 return ConstructDartObject(kGetSizeResult, ToDart(status), ToDart(size));
486}
487
488zx_status_t System::VmoSetSize(fml::RefPtr<Handle> vmo, uint64_t size) {
489 if (!vmo || !vmo->is_valid()) {
490 return ZX_ERR_BAD_HANDLE;
491 }
492 return zx_vmo_set_size(vmo->handle(), size);
493}
494
496 uint64_t offset,
497 const tonic::DartByteData& data) {
498 if (!vmo || !vmo->is_valid()) {
499 data.Release();
500 return ZX_ERR_BAD_HANDLE;
501 }
502
503 zx_status_t status =
504 zx_vmo_write(vmo->handle(), data.data(), offset, data.length_in_bytes());
505
506 data.Release();
507 return status;
508}
509
511 uint64_t offset,
512 size_t size) {
513 if (!vmo || !vmo->is_valid()) {
514 return ConstructDartObject(kReadResult, ToDart(ZX_ERR_BAD_HANDLE));
515 }
516
517 // TODO: constrain size?
518 ByteDataScope bytes(size);
519 zx_status_t status = zx_vmo_read(vmo->handle(), bytes.data(), offset, size);
520 bytes.Release();
521 if (status == ZX_OK) {
522 return ConstructDartObject(kReadResult, ToDart(status), bytes.dart_handle(),
523 ToDart(size));
524 }
525 return ConstructDartObject(kReadResult, ToDart(status));
526}
527
529 SizedRegion(void* r, size_t s) : region(r), size(s) {}
530 void* region;
531 size_t size;
532};
533
534void System::VmoMapFinalizer(void* isolate_callback_data, void* peer) {
535 SizedRegion* r = reinterpret_cast<SizedRegion*>(peer);
536 zx_vmar_unmap(zx_vmar_root_self(), reinterpret_cast<uintptr_t>(r->region),
537 r->size);
538 delete r;
539}
540
542 if (!vmo || !vmo->is_valid())
543 return ConstructDartObject(kMapResult, ToDart(ZX_ERR_BAD_HANDLE));
544
545 uint64_t size;
546 zx_status_t status = zx_vmo_get_size(vmo->handle(), &size);
547 if (status != ZX_OK)
548 return ConstructDartObject(kMapResult, ToDart(status));
549
550 uintptr_t mapped_addr;
551 status = zx_vmar_map(zx_vmar_root_self(), ZX_VM_PERM_READ, 0, vmo->handle(),
552 0, size, &mapped_addr);
553 if (status != ZX_OK)
554 return ConstructDartObject(kMapResult, ToDart(status));
555
556 void* data = reinterpret_cast<void*>(mapped_addr);
557 Dart_Handle object = Dart_NewExternalTypedData(Dart_TypedData_kUint8, data,
558 static_cast<intptr_t>(size));
560
561 SizedRegion* r = new SizedRegion(data, size);
562 Dart_NewFinalizableHandle(object, reinterpret_cast<void*>(r),
563 static_cast<intptr_t>(size) + sizeof(*r),
564 System::VmoMapFinalizer);
565
566 return ConstructDartObject(kMapResult, ToDart(ZX_OK), object);
567}
568
570 uint32_t region_index,
571 const tonic::DartByteData& data) {
572 if (!iob || !iob->is_valid()) {
573 data.Release();
574 return ZX_ERR_BAD_HANDLE;
575 }
576
577 zx_iovec_t vector = {.buffer = const_cast<void*>(data.data()),
578 .capacity = data.length_in_bytes()};
579 zx_status_t status =
580 zx_iob_writev(iob->handle(), /*options=*/0, region_index, &vector, 1);
581
582 data.Release();
583 return status;
584}
585
587 return zx_clock_get_monotonic();
588}
589
590// clang-format: off
591
592#define FOR_EACH_STATIC_BINDING(V) \
593 V(System, ChannelCreate) \
594 V(System, ChannelFromFile) \
595 V(System, ChannelQueryAndRead) \
596 V(System, ChannelQueryAndReadEtc) \
597 V(System, ChannelWrite) \
598 V(System, ChannelWriteEtc) \
599 V(System, ClockGetMonotonic) \
600 V(System, ConnectToService) \
601 V(System, EventpairCreate) \
602 V(System, IobWrite) \
603 V(System, SocketCreate) \
604 V(System, SocketRead) \
605 V(System, SocketWrite) \
606 V(System, VmoCreate) \
607 V(System, VmoFromFile) \
608 V(System, VmoGetSize) \
609 V(System, VmoMap) \
610 V(System, VmoRead) \
611 V(System, VmoSetSize) \
612 V(System, VmoWrite)
613
614// clang-format: on
615
616// Tonic is missing a comma.
617#define DART_REGISTER_NATIVE_STATIC_(CLASS, METHOD) \
618 DART_REGISTER_NATIVE_STATIC(CLASS, METHOD),
619
621
622void System::RegisterNatives(tonic::DartLibraryNatives* natives) {
624}
625
626} // namespace dart
627} // namespace zircon
GLenum type
void reset(const T &value=Traits::InvalidValue())
const T & get() const
Dart_PersistentHandle GetClass(const DartWrapperInfo &info)
static DartState * Current()
Definition dart_state.cc:56
DartClassLibrary & class_library()
Definition dart_state.h:60
static Dart_Handle CreateInvalid()
Definition handle.cc:32
static fml::RefPtr< Handle > Create(zx_handle_t handle)
Definition handle.cc:28
static Dart_Handle ChannelCreate(uint32_t options)
Definition system.cc:199
static Dart_Handle SocketCreate(uint32_t options)
Definition system.cc:397
static Dart_Handle VmoCreate(uint64_t size, uint32_t options)
Definition system.cc:443
static Dart_Handle VmoMap(fml::RefPtr< Handle > vmo)
Definition system.cc:541
static zx_status_t VmoWrite(fml::RefPtr< Handle > vmo, uint64_t offset, const tonic::DartByteData &data)
Definition system.cc:495
static Dart_Handle SocketWrite(fml::RefPtr< Handle > socket, const tonic::DartByteData &data, int options)
Definition system.cc:409
static Dart_Handle VmoRead(fml::RefPtr< Handle > vmo, uint64_t offset, size_t size)
Definition system.cc:510
static uint64_t ClockGetMonotonic()
Definition system.cc:586
static Dart_Handle VmoFromFile(std::string path)
Definition system.cc:454
static zx_status_t ChannelWriteEtc(fml::RefPtr< Handle > channel, const tonic::DartByteData &data, std::vector< HandleDisposition * > handle_dispositions)
Definition system.cc:268
static zx_status_t ConnectToService(std::string path, fml::RefPtr< Handle > channel)
Definition system.cc:211
static zx_status_t IobWrite(fml::RefPtr< Handle > iob, uint32_t region_index, const tonic::DartByteData &data)
Definition system.cc:569
static Dart_Handle ChannelQueryAndReadEtc(fml::RefPtr< Handle > channel)
Definition system.cc:344
static Dart_Handle EventpairCreate(uint32_t options)
Definition system.cc:385
static Dart_Handle ChannelFromFile(std::string path)
Definition system.cc:217
static zx_status_t ChannelWrite(fml::RefPtr< Handle > channel, const tonic::DartByteData &data, std::vector< Handle * > handles)
Definition system.cc:243
static Dart_Handle VmoGetSize(fml::RefPtr< Handle > vmo)
Definition system.cc:477
static Dart_Handle ChannelQueryAndRead(fml::RefPtr< Handle > channel)
Definition system.cc:304
static zx_status_t VmoSetSize(fml::RefPtr< Handle > vmo, uint64_t size)
Definition system.cc:488
static Dart_Handle SocketRead(fml::RefPtr< Handle > socket, size_t size)
Definition system.cc:424
#define DART_NATIVE_CALLBACK_STATIC(CLASS, METHOD)
#define IMPLEMENT_WRAPPERTYPEINFO(LibraryName, ClassName)
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
const gchar * channel
#define FML_DCHECK(condition)
Definition logging.h:122
it will be possible to load the file into Perfetto s trace viewer use test Running tests that layout and measure text will not yield consistent results across various platforms Enabling this option will make font resolution default to the Ahem test font on all disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
Definition switch_defs.h:52
it will be possible to load the file into Perfetto s trace viewer use test Running tests that layout and measure text will not yield consistent results across various platforms Enabling this option will make font resolution default to the Ahem test font on all disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via dart
Dart_Handle ToDart(const T &object)
bool CheckAndHandleError(Dart_Handle handle)
Definition dart_error.cc:33
#define FOR_EACH_STATIC_BINDING(V)
Definition handle.cc:112
#define DART_REGISTER_NATIVE_STATIC_(CLASS, METHOD)
Definition handle.cc:126
SizedRegion(void *r, size_t s)
Definition system.cc:529
std::shared_ptr< const fml::Mapping > data