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

Unified 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, 6 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 side-by-side diff with in-line comments
Download patch
Index: runtime/vm/service.cc
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 9a26f0297d1b14eb2e122b0e79581960f7e6e6e0..9db1809b22c73cf076753dd4b3ddafc005afda80 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -189,6 +189,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;
@@ -198,7 +213,8 @@ struct VmServiceNativeEntry {
static VmServiceNativeEntry _VmServiceNativeEntries[] = {
{"VMService_SendIsolateServiceMessage", 2, SendIsolateServiceMessage},
- {"VMService_SendRootServiceMessage", 1, SendRootServiceMessage}
+ {"VMService_SendRootServiceMessage", 1, SendRootServiceMessage},
+ {"VMService_SetEventMask", 1, SetEventMask},
};
@@ -231,6 +247,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) {
@@ -459,11 +476,6 @@ bool Service::SendIsolateShutdownMessage() {
}
-bool Service::IsRunning() {
- return port_ != ILLEGAL_PORT;
-}
-
-
Dart_Handle Service::GetSource(const char* name) {
ASSERT(name != NULL);
int i = 0;
@@ -2113,6 +2125,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);

Powered by Google App Engine
This is Rietveld 408576698