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