Index: runtime/vm/service.cc |
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc |
index e68727a3c41829a1889e847403d243797df540be..3342166cbe0233b6b9b3428df0f0c52baeef3ed3 100644 |
--- a/runtime/vm/service.cc |
+++ b/runtime/vm/service.cc |
@@ -87,7 +87,7 @@ StreamInfo Service::debug_stream("Debug"); |
StreamInfo Service::gc_stream("GC"); |
StreamInfo Service::echo_stream("_Echo"); |
StreamInfo Service::graph_stream("_Graph"); |
- |
+StreamInfo Service::logging_stream("Logging"); |
static StreamInfo* streams_[] = { |
&Service::isolate_stream, |
@@ -95,6 +95,7 @@ static StreamInfo* streams_[] = { |
&Service::gc_stream, |
&Service::echo_stream, |
&Service::graph_stream, |
+ &Service::logging_stream, |
}; |
@@ -683,6 +684,16 @@ void Service::HandleEvent(ServiceEvent* event) { |
jsobj.AddProperty("event", event); |
jsobj.AddProperty("streamId", stream_id); |
} |
+ PostEvent(stream_id, event->KindAsCString(), &js); |
+} |
+ |
+ |
+void Service::PostEvent(const char* stream_id, |
+ const char* kind, |
+ JSONStream* event) { |
+ ASSERT(stream_id != NULL); |
+ ASSERT(kind != NULL); |
+ ASSERT(event != NULL); |
// Message is of the format [<stream id>, <json string>]. |
// |
@@ -702,13 +713,12 @@ void Service::HandleEvent(ServiceEvent* event) { |
Dart_CObject json_cobj; |
json_cobj.type = Dart_CObject_kString; |
- json_cobj.value.as_string = const_cast<char*>(js.ToCString()); |
+ json_cobj.value.as_string = const_cast<char*>(event->ToCString()); |
list_values[1] = &json_cobj; |
if (FLAG_trace_service) { |
OS::Print( |
- "vm-service: Pushing event of type %s to stream %s\n", |
- event->KindAsCString(), stream_id); |
+ "vm-service: Pushing event of type %s to stream %s\n", kind, stream_id); |
} |
Dart_PostCObject(ServiceIsolate::Port(), &list_cobj); |
@@ -2512,6 +2522,44 @@ void Service::SendEmbedderEvent(Isolate* isolate, |
} |
+void Service::SendLogEvent(Isolate* isolate, |
+ int64_t sequence_number, |
+ int64_t timestamp, |
+ |
+ intptr_t level, |
+ const String& name, |
+ const String& message, |
+ const Instance& zone, |
+ const Object& error, |
+ const Instance& stack_trace) { |
turnidge
2015/07/17 00:19:55
Can this work like most of the other ServiceEvents
Cutch
2015/07/17 00:50:13
I deliberately didn't make this work like the othe
|
+ ServiceEvent service_event(isolate, ServiceEvent::kLogging); |
+ JSONStream js; |
+ const char* stream_id = service_event.stream_id(); |
+ ASSERT(stream_id != NULL); |
+ { |
+ JSONObject jsobj(&js); |
+ jsobj.AddProperty("streamId", stream_id); |
+ { |
+ JSONObject event(&jsobj, "event"); |
+ // Print header. |
+ service_event.PrintJSONHeader(&event); |
+ { |
+ JSONObject logRecord(&event, "logRecord"); |
+ event.AddProperty64("sequenceNumber", sequence_number); |
+ event.AddPropertyTimeMillis("time", timestamp); |
+ event.AddProperty64("level", level); |
+ event.AddProperty("loggerName", name); |
+ event.AddProperty("message", message); |
+ event.AddProperty("zone", zone); |
+ event.AddProperty("error", error); |
+ event.AddProperty("stackTrace", stack_trace); |
turnidge
2015/07/17 00:19:54
This stuff would move into the ServiceEvent::Print
Cutch
2015/07/17 00:50:13
Acknowledged.
|
+ } |
+ } |
+ } |
+ Service::PostEvent(stream_id, service_event.KindAsCString(), &js); |
+} |
+ |
+ |
class ContainsAddressVisitor : public FindObjectVisitor { |
public: |
ContainsAddressVisitor(Isolate* isolate, uword addr) |