Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
dart_service_isolate.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 "flutter/runtime/dart_service_isolate.h"
6
7#include <algorithm>
8#include <cstring>
9
10#include "flutter/fml/logging.h"
11#include "flutter/fml/posix_wrappers.h"
12#include "flutter/runtime/embedder_resources.h"
13#include "third_party/dart/runtime/include/dart_api.h"
17
18#define RETURN_ERROR_HANDLE(handle) \
19 if (Dart_IsError(handle)) { \
20 return handle; \
21 }
22
23#define SHUTDOWN_ON_ERROR(handle) \
24 if (Dart_IsError(handle)) { \
25 *error = fml::strdup(Dart_GetError(handle)); \
26 Dart_ExitScope(); \
27 Dart_ShutdownIsolate(); \
28 return false; \
29 }
30
31namespace flutter {
32namespace {
33
34static Dart_LibraryTagHandler g_embedder_tag_handler;
35static tonic::DartLibraryNatives* g_natives;
36static std::string g_vm_service_uri;
37
38Dart_NativeFunction GetNativeFunction(Dart_Handle name,
40 bool* auto_setup_scope) {
41 FML_CHECK(g_natives);
42 return g_natives->GetNativeFunction(name, argument_count, auto_setup_scope);
43}
44
45const uint8_t* GetSymbol(Dart_NativeFunction native_function) {
46 FML_CHECK(g_natives);
47 return g_natives->GetSymbol(native_function);
48}
49
50} // namespace
51
52std::mutex DartServiceIsolate::callbacks_mutex_;
53
54std::set<std::unique_ptr<DartServiceIsolate::DartVMServiceServerStateCallback>>
55 DartServiceIsolate::callbacks_;
56
57void DartServiceIsolate::NotifyServerState(Dart_NativeArguments args) {
58 Dart_Handle exception = nullptr;
59 std::string uri =
61
62 if (exception) {
63 return;
64 }
65
66 g_vm_service_uri = uri;
67
68 // Collect callbacks to fire in a separate collection and invoke them outside
69 // the lock.
70 std::vector<DartServiceIsolate::DartVMServiceServerStateCallback>
71 callbacks_to_fire;
72 {
73 std::scoped_lock lock(callbacks_mutex_);
74 for (auto& callback : callbacks_) {
75 callbacks_to_fire.push_back(*callback.get());
76 }
77 }
78
79 for (const auto& callback_to_fire : callbacks_to_fire) {
80 callback_to_fire(uri);
81 }
82}
83
86 if (!callback) {
87 return 0;
88 }
89
90 auto callback_pointer =
91 std::make_unique<DartServiceIsolate::DartVMServiceServerStateCallback>(
92 callback);
93
94 auto handle = reinterpret_cast<CallbackHandle>(callback_pointer.get());
95
96 {
97 std::scoped_lock lock(callbacks_mutex_);
98 callbacks_.insert(std::move(callback_pointer));
99 }
100
101 if (!g_vm_service_uri.empty()) {
102 callback(g_vm_service_uri);
103 }
104
105 return handle;
106}
107
109 CallbackHandle callback_handle) {
110 std::scoped_lock lock(callbacks_mutex_);
111 auto found = std::find_if(
112 callbacks_.begin(), callbacks_.end(),
113 [callback_handle](const auto& item) {
114 return reinterpret_cast<CallbackHandle>(item.get()) == callback_handle;
115 });
116
117 if (found == callbacks_.end()) {
118 return false;
119 }
120
121 callbacks_.erase(found);
122 return true;
123}
124
125void DartServiceIsolate::Shutdown(Dart_NativeArguments args) {
126 // NO-OP.
127}
128
129bool DartServiceIsolate::Startup(const std::string& server_ip,
130 intptr_t server_port,
131 Dart_LibraryTagHandler embedder_tag_handler,
132 bool disable_origin_check,
133 bool disable_service_auth_codes,
134 bool enable_service_port_fallback,
135 char** error) {
137 FML_CHECK(isolate);
138
139 // Remember the embedder's library tag handler.
140 g_embedder_tag_handler = embedder_tag_handler;
141 FML_CHECK(g_embedder_tag_handler);
142
143 // Setup native entries.
144 if (!g_natives) {
145 g_natives = new tonic::DartLibraryNatives();
146 g_natives->Register({
147 {"VMServiceIO_NotifyServerState", NotifyServerState, 1, true},
148 {"VMServiceIO_Shutdown", Shutdown, 0, true},
149 });
150 }
151
152 Dart_Handle uri = Dart_NewStringFromCString("dart:vmservice_io");
153 Dart_Handle library = Dart_LookupLibrary(uri);
154 SHUTDOWN_ON_ERROR(library);
157 result = Dart_SetNativeResolver(library, GetNativeFunction, GetSymbol);
159
160 library = Dart_RootLibrary();
161 SHUTDOWN_ON_ERROR(library);
162
163 // Set the HTTP server's ip.
165 Dart_NewStringFromCString(server_ip.c_str()));
167 // If we have a port specified, start the server immediately.
168 bool auto_start = server_port >= 0;
169 if (server_port < 0) {
170 // Adjust server_port to port 0 which will result in the first available
171 // port when the HTTP server is started.
172 server_port = 0;
173 }
174 // Set the HTTP's servers port.
176 Dart_NewInteger(server_port));
178 result = Dart_SetField(library, Dart_NewStringFromCString("_autoStart"),
179 Dart_NewBoolean(auto_start));
181 result =
182 Dart_SetField(library, Dart_NewStringFromCString("_originCheckDisabled"),
183 Dart_NewBoolean(disable_origin_check));
185 result =
186 Dart_SetField(library, Dart_NewStringFromCString("_authCodesDisabled"),
187 Dart_NewBoolean(disable_service_auth_codes));
190 library, Dart_NewStringFromCString("_enableServicePortFallback"),
191 Dart_NewBoolean(enable_service_port_fallback));
193
194 // Make runnable.
198 if (*error) {
199 Dart_EnterIsolate(isolate);
201 return false;
202 }
203 Dart_EnterIsolate(isolate);
205
206 return true;
207}
208
209} // namespace flutter
static CallbackHandle AddServerStatusCallback(const DartVMServiceServerStateCallback &callback)
Add a callback that will get invoked when the VM Service starts up. If the VM Service has already sta...
static bool RemoveServerStatusCallback(CallbackHandle handle)
Removed a callback previously registered via AddServiceStatusCallback.
std::function< void(const std::string &vm_service_uri)> DartVMServiceServerStateCallback
static bool Startup(const std::string &server_ip, intptr_t server_port, Dart_LibraryTagHandler embedder_tag_handler, bool disable_origin_check, bool disable_service_auth_codes, bool enable_service_port_fallback, char **error)
Start the service isolate. This call may only be made in the Dart VM initiated isolate creation callb...
const uint8_t * GetSymbol(Dart_NativeFunction native_function)
Dart_NativeFunction GetNativeFunction(Dart_Handle name, int argument_count, bool *auto_setup_scope)
DART_EXPORT DART_WARN_UNUSED_RESULT char * Dart_IsolateMakeRunnable(Dart_Isolate isolate)
DART_EXPORT Dart_Handle Dart_SetNativeResolver(Dart_Handle library, Dart_NativeEntryResolver resolver, Dart_NativeEntrySymbol symbol)
DART_EXPORT void Dart_EnterScope(void)
DART_EXPORT void Dart_ExitScope(void)
DART_EXPORT void Dart_ShutdownIsolate(void)
struct _Dart_Handle * Dart_Handle
Definition dart_api.h:258
struct _Dart_Isolate * Dart_Isolate
Definition dart_api.h:88
DART_EXPORT Dart_Handle Dart_LookupLibrary(Dart_Handle url)
struct _Dart_NativeArguments * Dart_NativeArguments
Definition dart_api.h:3010
DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_SetField(Dart_Handle container, Dart_Handle name, Dart_Handle value)
DART_EXPORT Dart_Isolate Dart_CurrentIsolate(void)
DART_EXPORT Dart_Handle Dart_NewStringFromCString(const char *str)
void(* Dart_NativeFunction)(Dart_NativeArguments arguments)
Definition dart_api.h:3198
DART_EXPORT Dart_Handle Dart_NewInteger(int64_t value)
Dart_Handle(* Dart_LibraryTagHandler)(Dart_LibraryTag tag, Dart_Handle library_or_package_map_url, Dart_Handle url)
Definition dart_api.h:3378
DART_EXPORT Dart_Handle Dart_NewBoolean(bool value)
DART_EXPORT void Dart_EnterIsolate(Dart_Isolate isolate)
DART_EXPORT void Dart_ExitIsolate(void)
DART_EXPORT Dart_Handle Dart_RootLibrary(void)
DART_EXPORT Dart_Handle Dart_SetRootLibrary(Dart_Handle library)
#define SHUTDOWN_ON_ERROR(handle)
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
FlKeyEvent uint64_t FlKeyResponderAsyncCallback callback
const uint8_t uint32_t uint32_t GError ** error
GAsyncResult * result
#define FML_CHECK(condition)
Definition logging.h:85
int argument_count
Definition fuchsia.cc:52
DEF_SWITCHES_START aot vmservice shared library name
Definition switches.h:32