| Index: runtime/vm/service.cc
|
| diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
|
| index 100f6a82988c993bf768a11f9e9752b3bea7f74d..c4ca102c983a32b5294f57d7ba70441c7f92b2b0 100644
|
| --- a/runtime/vm/service.cc
|
| +++ b/runtime/vm/service.cc
|
| @@ -232,6 +232,21 @@ static void SendRootServiceMessage(Dart_NativeArguments args) {
|
| }
|
|
|
|
|
| +void Service::SetEventMask(uint32_t mask) {
|
| + event_mask_ = mask;
|
| +}
|
| +
|
| +
|
| +void SetEventMask(Dart_NativeArguments args) {
|
| + NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
|
| + Isolate* isolate = arguments->isolate();
|
| + StackZone zone(isolate);
|
| + HANDLESCOPE(isolate);
|
| + GET_NON_NULL_NATIVE_ARGUMENT(Integer, mask, arguments->NativeArgAt(0));
|
| + Service::SetEventMask(mask.AsTruncatedUint32Value());
|
| +}
|
| +
|
| +
|
| struct VmServiceNativeEntry {
|
| const char* name;
|
| int num_arguments;
|
| @@ -241,7 +256,8 @@ struct VmServiceNativeEntry {
|
|
|
| static VmServiceNativeEntry _VmServiceNativeEntries[] = {
|
| {"VMService_SendIsolateServiceMessage", 2, SendIsolateServiceMessage},
|
| - {"VMService_SendRootServiceMessage", 1, SendRootServiceMessage}
|
| + {"VMService_SendRootServiceMessage", 1, SendRootServiceMessage},
|
| + {"VMService_SetEventMask", 1, SetEventMask},
|
| };
|
|
|
|
|
| @@ -274,6 +290,7 @@ EmbedderServiceHandler* Service::root_service_handler_head_ = NULL;
|
| Isolate* Service::service_isolate_ = NULL;
|
| Dart_LibraryTagHandler Service::default_handler_ = NULL;
|
| Dart_Port Service::port_ = ILLEGAL_PORT;
|
| +uint32_t Service::event_mask_ = 0;
|
|
|
|
|
| static Dart_Port ExtractPort(Dart_Handle receivePort) {
|
| @@ -502,11 +519,6 @@ bool Service::SendIsolateShutdownMessage() {
|
| }
|
|
|
|
|
| -bool Service::IsRunning() {
|
| - return port_ != ILLEGAL_PORT;
|
| -}
|
| -
|
| -
|
| Dart_Handle Service::GetSource(const char* name) {
|
| ASSERT(name != NULL);
|
| int i = 0;
|
| @@ -2179,6 +2191,42 @@ static RootMessageHandler FindRootMessageHandler(const char* command) {
|
| }
|
|
|
|
|
| +void Service::SendEvent(intptr_t eventId, const String& eventMessage) {
|
| + if (!IsRunning()) {
|
| + return;
|
| + }
|
| + Isolate* isolate = Isolate::Current();
|
| + ASSERT(isolate != NULL);
|
| + HANDLESCOPE(isolate);
|
| +
|
| + // Construct a list of the form [eventId, eventMessage].
|
| + const Array& list = Array::Handle(Array::New(2));
|
| + ASSERT(!list.IsNull());
|
| + list.SetAt(0, Integer::Handle(Integer::New(eventId)));
|
| + list.SetAt(1, eventMessage);
|
| +
|
| + // Push the event to port_.
|
| + uint8_t* data = NULL;
|
| + MessageWriter writer(&data, &allocator);
|
| + writer.WriteMessage(list);
|
| + intptr_t len = writer.BytesWritten();
|
| + if (FLAG_trace_service) {
|
| + OS::Print("Pushing event of type %" Pd ", len %" Pd "\n", eventId, len);
|
| + }
|
| + // TODO(turnidge): For now we ignore failure to send an event. Revisit?
|
| + PortMap::PostMessage(
|
| + new Message(port_, data, len, Message::kNormalPriority));
|
| +}
|
| +
|
| +
|
| +void Service::HandleDebuggerEvent(DebuggerEvent* event) {
|
| + JSONStream js;
|
| + event->PrintJSON(&js);
|
| + const String& message = String::Handle(String::New(js.ToCString()));
|
| + SendEvent(kEventFamilyDebug, message);
|
| +}
|
| +
|
| +
|
| void Service::EmbedderHandleMessage(EmbedderServiceHandler* handler,
|
| JSONStream* js) {
|
| ASSERT(handler != NULL);
|
|
|