Flutter Engine
 
Loading...
Searching...
No Matches
flutter::DartServiceIsolate Class Reference

Utility methods for interacting with the DartVM managed service isolate present in debug and profile runtime modes. More...

#include <dart_service_isolate.h>

Public Types

using CallbackHandle = ptrdiff_t
 
using DartVMServiceServerStateCallback = std::function< void(const std::string &vm_service_uri)>
 

Static Public Member Functions

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 callback. It is only valid to make this call when the VM explicitly requests the creation of the service isolate. The VM does this by specifying the script URI to be DART_VM_SERVICE_ISOLATE_NAME. The isolate to be designated as the service isolate must already be created (but not running) when this call is made.
 
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 started before this call is made, the callback is invoked immediately.
 
static bool RemoveServerStatusCallback (CallbackHandle handle)
 Removed a callback previously registered via AddServiceStatusCallback.
 

Detailed Description

Utility methods for interacting with the DartVM managed service isolate present in debug and profile runtime modes.

Definition at line 22 of file dart_service_isolate.h.

Member Typedef Documentation

◆ CallbackHandle

The handle used to refer to callbacks registered with the service isolate.

Definition at line 27 of file dart_service_isolate.h.

◆ DartVMServiceServerStateCallback

using flutter::DartServiceIsolate::DartVMServiceServerStateCallback = std::function<void(const std::string& vm_service_uri)>

A callback made by the Dart VM when the VM Service is ready. The argument indicates the VM Service URI.

Definition at line 33 of file dart_service_isolate.h.

Member Function Documentation

◆ AddServerStatusCallback()

DartServiceIsolate::CallbackHandle flutter::DartServiceIsolate::AddServerStatusCallback ( const DartVMServiceServerStateCallback callback)
static

Add a callback that will get invoked when the VM Service starts up. If the VM Service has already started before this call is made, the callback is invoked immediately.

This method is thread safe.

Parameters
[in]callbackThe callback with information about the VM Service.
Returns
A handle for the callback that can be used later in RemoveServerStatusCallback.

Definition at line 84 of file dart_service_isolate.cc.

85 {
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}
FlutterDesktopBinaryReply callback

References callback.

Referenced by flutter::TEST().

◆ RemoveServerStatusCallback()

bool flutter::DartServiceIsolate::RemoveServerStatusCallback ( CallbackHandle  handle)
static

Removed a callback previously registered via AddServiceStatusCallback.

This method is thread safe.

Parameters
[in]handleThe handle
Returns
If the callback was unregistered. This may fail if there was no such callback with that handle.

Definition at line 108 of file dart_service_isolate.cc.

109 {
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}

Referenced by flutter::TEST().

◆ Startup()

bool flutter::DartServiceIsolate::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 
)
static

Start the service isolate. This call may only be made in the Dart VM initiated isolate creation callback. It is only valid to make this call when the VM explicitly requests the creation of the service isolate. The VM does this by specifying the script URI to be DART_VM_SERVICE_ISOLATE_NAME. The isolate to be designated as the service isolate must already be created (but not running) when this call is made.

Parameters
[in]server_ipThe service protocol IP address.
[in]server_portThe service protocol port.
[in]embedder_tag_handlerThe library tag handler.
[in]disable_origin_checkIf websocket origin checks must be enabled.
[in]disable_service_auth_codesIf service auth codes must be enabled.
[in]enable_service_port_fallbackIf fallback to port 0 must be enabled when the bind fails.
errorThe error when this method returns false. This string must be freed by the caller using free.
Returns
If the startup was successful. Refer to the error for details on failure.

Definition at line 129 of file dart_service_isolate.cc.

135 {
136 Dart_Isolate isolate = Dart_CurrentIsolate();
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);
155 Dart_Handle result = Dart_SetRootLibrary(library);
156 SHUTDOWN_ON_ERROR(result);
157 result = Dart_SetNativeResolver(library, GetNativeFunction, GetSymbol);
158 SHUTDOWN_ON_ERROR(result);
159
160 library = Dart_RootLibrary();
161 SHUTDOWN_ON_ERROR(library);
162
163 // Set the HTTP server's ip.
164 result = Dart_SetField(library, Dart_NewStringFromCString("_ip"),
165 Dart_NewStringFromCString(server_ip.c_str()));
166 SHUTDOWN_ON_ERROR(result);
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.
175 result = Dart_SetField(library, Dart_NewStringFromCString("_port"),
176 Dart_NewInteger(server_port));
177 SHUTDOWN_ON_ERROR(result);
178 result = Dart_SetField(library, Dart_NewStringFromCString("_autoStart"),
179 Dart_NewBoolean(auto_start));
180 SHUTDOWN_ON_ERROR(result);
181 result =
182 Dart_SetField(library, Dart_NewStringFromCString("_originCheckDisabled"),
183 Dart_NewBoolean(disable_origin_check));
184 SHUTDOWN_ON_ERROR(result);
185 result =
186 Dart_SetField(library, Dart_NewStringFromCString("_authCodesDisabled"),
187 Dart_NewBoolean(disable_service_auth_codes));
188 SHUTDOWN_ON_ERROR(result);
189 result = Dart_SetField(
190 library, Dart_NewStringFromCString("_enableServicePortFallback"),
191 Dart_NewBoolean(enable_service_port_fallback));
192 SHUTDOWN_ON_ERROR(result);
193
194 // Make runnable.
195 Dart_ExitScope();
196 Dart_ExitIsolate();
197 *error = Dart_IsolateMakeRunnable(isolate);
198 if (*error) {
199 Dart_EnterIsolate(isolate);
200 Dart_ShutdownIsolate();
201 return false;
202 }
203 Dart_EnterIsolate(isolate);
204 Dart_EnterScope();
205
206 return true;
207}
#define SHUTDOWN_ON_ERROR(handle)
const uint8_t uint32_t uint32_t GError ** error
#define FML_CHECK(condition)
Definition logging.h:104

References error, FML_CHECK, and SHUTDOWN_ON_ERROR.


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