Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Side by Side Diff: runtime/vm/service.cc

Issue 340443006: Add support for asynchronous event notification to the observatory. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/service.h" 5 #include "vm/service.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/globals.h" 8 #include "platform/globals.h"
9 9
10 #include "vm/compiler.h" 10 #include "vm/compiler.h"
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 static void SendRootServiceMessage(Dart_NativeArguments args) { 182 static void SendRootServiceMessage(Dart_NativeArguments args) {
183 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); 183 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
184 Isolate* isolate = arguments->isolate(); 184 Isolate* isolate = arguments->isolate();
185 StackZone zone(isolate); 185 StackZone zone(isolate);
186 HANDLESCOPE(isolate); 186 HANDLESCOPE(isolate);
187 GET_NON_NULL_NATIVE_ARGUMENT(Instance, message, arguments->NativeArgAt(0)); 187 GET_NON_NULL_NATIVE_ARGUMENT(Instance, message, arguments->NativeArgAt(0));
188 Service::HandleRootMessage(message); 188 Service::HandleRootMessage(message);
189 } 189 }
190 190
191 191
192 void Service::SetEventMask(uint32_t mask) {
193 event_mask_ = mask;
194 }
195
196
197 void SetEventMask(Dart_NativeArguments args) {
198 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
199 Isolate* isolate = arguments->isolate();
200 StackZone zone(isolate);
201 HANDLESCOPE(isolate);
202 GET_NON_NULL_NATIVE_ARGUMENT(Integer, mask, arguments->NativeArgAt(0));
203 Service::SetEventMask(mask.AsTruncatedUint32Value());
204 }
205
206
192 struct VmServiceNativeEntry { 207 struct VmServiceNativeEntry {
193 const char* name; 208 const char* name;
194 int num_arguments; 209 int num_arguments;
195 Dart_NativeFunction function; 210 Dart_NativeFunction function;
196 }; 211 };
197 212
198 213
199 static VmServiceNativeEntry _VmServiceNativeEntries[] = { 214 static VmServiceNativeEntry _VmServiceNativeEntries[] = {
200 {"VMService_SendIsolateServiceMessage", 2, SendIsolateServiceMessage}, 215 {"VMService_SendIsolateServiceMessage", 2, SendIsolateServiceMessage},
201 {"VMService_SendRootServiceMessage", 1, SendRootServiceMessage} 216 {"VMService_SendRootServiceMessage", 1, SendRootServiceMessage},
217 {"VMService_SetEventMask", 1, SetEventMask},
202 }; 218 };
203 219
204 220
205 static Dart_NativeFunction VmServiceNativeResolver(Dart_Handle name, 221 static Dart_NativeFunction VmServiceNativeResolver(Dart_Handle name,
206 int num_arguments, 222 int num_arguments,
207 bool* auto_setup_scope) { 223 bool* auto_setup_scope) {
208 const Object& obj = Object::Handle(Api::UnwrapHandle(name)); 224 const Object& obj = Object::Handle(Api::UnwrapHandle(name));
209 if (!obj.IsString()) { 225 if (!obj.IsString()) {
210 return NULL; 226 return NULL;
211 } 227 }
(...skipping 12 matching lines...) Expand all
224 } 240 }
225 return NULL; 241 return NULL;
226 } 242 }
227 243
228 244
229 EmbedderServiceHandler* Service::isolate_service_handler_head_ = NULL; 245 EmbedderServiceHandler* Service::isolate_service_handler_head_ = NULL;
230 EmbedderServiceHandler* Service::root_service_handler_head_ = NULL; 246 EmbedderServiceHandler* Service::root_service_handler_head_ = NULL;
231 Isolate* Service::service_isolate_ = NULL; 247 Isolate* Service::service_isolate_ = NULL;
232 Dart_LibraryTagHandler Service::default_handler_ = NULL; 248 Dart_LibraryTagHandler Service::default_handler_ = NULL;
233 Dart_Port Service::port_ = ILLEGAL_PORT; 249 Dart_Port Service::port_ = ILLEGAL_PORT;
250 uint32_t Service::event_mask_ = 0;
234 251
235 252
236 static Dart_Port ExtractPort(Dart_Handle receivePort) { 253 static Dart_Port ExtractPort(Dart_Handle receivePort) {
237 HANDLESCOPE(Isolate::Current()); 254 HANDLESCOPE(Isolate::Current());
238 const Object& unwrapped_rp = Object::Handle(Api::UnwrapHandle(receivePort)); 255 const Object& unwrapped_rp = Object::Handle(Api::UnwrapHandle(receivePort));
239 const Instance& rp = Instance::Cast(unwrapped_rp); 256 const Instance& rp = Instance::Cast(unwrapped_rp);
240 // Extract RawReceivePort port id. 257 // Extract RawReceivePort port id.
241 if (!rp.IsReceivePort()) { 258 if (!rp.IsReceivePort()) {
242 return ILLEGAL_PORT; 259 return ILLEGAL_PORT;
243 } 260 }
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
452 if (FLAG_trace_service) { 469 if (FLAG_trace_service) {
453 OS::Print("Isolate %s %" Pd64 " deregistered with service \n", 470 OS::Print("Isolate %s %" Pd64 " deregistered with service \n",
454 name.ToCString(), 471 name.ToCString(),
455 Dart_GetMainPortId()); 472 Dart_GetMainPortId());
456 } 473 }
457 return PortMap::PostMessage( 474 return PortMap::PostMessage(
458 new Message(port_, data, len, Message::kNormalPriority)); 475 new Message(port_, data, len, Message::kNormalPriority));
459 } 476 }
460 477
461 478
462 bool Service::IsRunning() {
463 return port_ != ILLEGAL_PORT;
464 }
465
466
467 Dart_Handle Service::GetSource(const char* name) { 479 Dart_Handle Service::GetSource(const char* name) {
468 ASSERT(name != NULL); 480 ASSERT(name != NULL);
469 int i = 0; 481 int i = 0;
470 while (true) { 482 while (true) {
471 const char* path = Resources::Path(i); 483 const char* path = Resources::Path(i);
472 if (path == NULL) { 484 if (path == NULL) {
473 break; 485 break;
474 } 486 }
475 ASSERT(*path != '\0'); 487 ASSERT(*path != '\0');
476 // Skip the '/'. 488 // Skip the '/'.
(...skipping 1629 matching lines...) Expand 10 before | Expand all | Expand 10 after
2106 return entry.handler; 2118 return entry.handler;
2107 } 2119 }
2108 } 2120 }
2109 if (FLAG_trace_service) { 2121 if (FLAG_trace_service) {
2110 OS::Print("Service has no root message handler for <%s>\n", command); 2122 OS::Print("Service has no root message handler for <%s>\n", command);
2111 } 2123 }
2112 return NULL; 2124 return NULL;
2113 } 2125 }
2114 2126
2115 2127
2128 void Service::SendEvent(intptr_t eventId, const String& eventMessage) {
2129 if (!IsRunning()) {
2130 return;
2131 }
2132 Isolate* isolate = Isolate::Current();
2133 ASSERT(isolate != NULL);
2134 HANDLESCOPE(isolate);
2135
2136 // Construct a list of the form [eventId, eventMessage].
2137 const Array& list = Array::Handle(Array::New(2));
2138 ASSERT(!list.IsNull());
2139 list.SetAt(0, Integer::Handle(Integer::New(eventId)));
2140 list.SetAt(1, eventMessage);
2141
2142 // Push the event to port_.
2143 uint8_t* data = NULL;
2144 MessageWriter writer(&data, &allocator);
2145 writer.WriteMessage(list);
2146 intptr_t len = writer.BytesWritten();
2147 if (FLAG_trace_service) {
2148 OS::Print("Pushing event of type %" Pd ", len %" Pd "\n", eventId, len);
2149 }
2150 // TODO(turnidge): For now we ignore failure to send an event. Revisit?
2151 PortMap::PostMessage(
2152 new Message(port_, data, len, Message::kNormalPriority));
2153 }
2154
2155
2156 void Service::HandleDebuggerEvent(DebuggerEvent* event) {
2157 JSONStream js;
2158 event->PrintJSON(&js);
2159 const String& message = String::Handle(String::New(js.ToCString()));
2160 SendEvent(kEventFamilyDebug, message);
2161 }
2162
2163
2116 void Service::EmbedderHandleMessage(EmbedderServiceHandler* handler, 2164 void Service::EmbedderHandleMessage(EmbedderServiceHandler* handler,
2117 JSONStream* js) { 2165 JSONStream* js) {
2118 ASSERT(handler != NULL); 2166 ASSERT(handler != NULL);
2119 Dart_ServiceRequestCallback callback = handler->callback(); 2167 Dart_ServiceRequestCallback callback = handler->callback();
2120 ASSERT(callback != NULL); 2168 ASSERT(callback != NULL);
2121 const char* r = NULL; 2169 const char* r = NULL;
2122 const char* name = js->command(); 2170 const char* name = js->command();
2123 const char** arguments = js->arguments(); 2171 const char** arguments = js->arguments();
2124 const char** keys = js->option_keys(); 2172 const char** keys = js->option_keys();
2125 const char** values = js->option_values(); 2173 const char** values = js->option_values();
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
2202 while (current != NULL) { 2250 while (current != NULL) {
2203 if (strcmp(name, current->name()) == 0) { 2251 if (strcmp(name, current->name()) == 0) {
2204 return current; 2252 return current;
2205 } 2253 }
2206 current = current->next(); 2254 current = current->next();
2207 } 2255 }
2208 return NULL; 2256 return NULL;
2209 } 2257 }
2210 2258
2211 } // namespace dart 2259 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698