Index: runtime/vm/service.cc |
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc |
index 70d9e431d9de0df5edd1cd1b7b7b92838593d68e..ec493b6d417074d2885b55ed35145a2a53aa3db2 100644 |
--- a/runtime/vm/service.cc |
+++ b/runtime/vm/service.cc |
@@ -42,6 +42,21 @@ namespace dart { |
DECLARE_FLAG(bool, trace_service); |
DECLARE_FLAG(bool, trace_service_pause_events); |
+DEFINE_FLAG(charp, vm_name, "vm", |
+ "The default name of this vm as reported by the VM service " |
+ "protocol"); |
+ |
+// The name of this of this vm as reported by the VM service protocol. |
+static char* vm_name = NULL; |
+ |
+ |
+static const char* GetVMName() { |
+ if (vm_name == NULL) { |
+ return FLAG_vm_name; |
+ } |
+ return vm_name; |
+} |
+ |
ServiceIdZone::ServiceIdZone() { |
} |
@@ -91,6 +106,7 @@ Dart_ServiceStreamCancelCallback Service::stream_cancel_callback_ = NULL; |
// These are the set of streams known to the core VM. |
+StreamInfo Service::vm_stream("VM"); |
StreamInfo Service::isolate_stream("Isolate"); |
StreamInfo Service::debug_stream("Debug"); |
StreamInfo Service::gc_stream("GC"); |
@@ -99,6 +115,7 @@ StreamInfo Service::graph_stream("_Graph"); |
StreamInfo Service::logging_stream("_Logging"); |
static StreamInfo* streams_[] = { |
+ &Service::vm_stream, |
&Service::isolate_stream, |
&Service::debug_stream, |
&Service::gc_stream, |
@@ -651,13 +668,13 @@ void Service::HandleIsolateMessage(Isolate* isolate, const Array& msg) { |
void Service::SendEvent(const char* stream_id, |
const char* event_type, |
const Object& event_message) { |
- ASSERT(!ServiceIsolate::IsServiceIsolateDescendant(Isolate::Current())); |
- if (!ServiceIsolate::IsRunning()) { |
- return; |
- } |
Thread* thread = Thread::Current(); |
Isolate* isolate = thread->isolate(); |
ASSERT(isolate != NULL); |
+ ASSERT(!ServiceIsolate::IsServiceIsolateDescendant(isolate)); |
+ if (!ServiceIsolate::IsRunning()) { |
+ return; |
+ } |
HANDLESCOPE(thread); |
const Array& list = Array::Handle(Array::New(2)); |
@@ -715,7 +732,8 @@ void Service::SendEventWithData(const char* stream_id, |
void Service::HandleEvent(ServiceEvent* event) { |
- if (ServiceIsolate::IsServiceIsolateDescendant(event->isolate())) { |
+ if (event->isolate() != NULL && |
+ ServiceIsolate::IsServiceIsolateDescendant(event->isolate())) { |
return; |
} |
if (!ServiceIsolate::IsRunning()) { |
@@ -2945,17 +2963,20 @@ static const MethodParameter* get_vm_params[] = { |
}; |
-static bool GetVM(Isolate* isolate, JSONStream* js) { |
+void Service::PrintJSONForVM(JSONStream* js, bool ref) { |
JSONObject jsobj(js); |
- jsobj.AddProperty("type", "VM"); |
+ jsobj.AddProperty("type", (ref ? "@VM" : "VM")); |
+ jsobj.AddProperty("name", GetVMName()); |
+ if (ref) { |
+ return; |
+ } |
+ Isolate* vm_isolate = Dart::vm_isolate(); |
jsobj.AddProperty("architectureBits", static_cast<intptr_t>(kBitsPerWord)); |
jsobj.AddProperty("targetCPU", CPU::Id()); |
jsobj.AddProperty("hostCPU", HostCPUFeatures::hardware()); |
jsobj.AddProperty("version", Version::String()); |
jsobj.AddProperty("pid", OS::ProcessId()); |
- jsobj.AddProperty("_assertsEnabled", isolate->flags().asserts()); |
- jsobj.AddProperty("_typeChecksEnabled", isolate->flags().type_checks()); |
- int64_t start_time_millis = (Dart::vm_isolate()->start_time() / |
+ int64_t start_time_millis = (vm_isolate->start_time() / |
kMicrosecondsPerMillisecond); |
jsobj.AddPropertyTimeMillis("startTime", start_time_millis); |
// Construct the isolate list. |
@@ -2964,6 +2985,11 @@ static bool GetVM(Isolate* isolate, JSONStream* js) { |
ServiceIsolateVisitor visitor(&jsarr); |
Isolate::VisitIsolates(&visitor); |
} |
+} |
+ |
+ |
+static bool GetVM(Isolate* isolate, JSONStream* js) { |
+ Service::PrintJSONForVM(js, false); |
return true; |
} |
@@ -3104,6 +3130,25 @@ static bool SetName(Isolate* isolate, JSONStream* js) { |
} |
+static const MethodParameter* set_vm_name_params[] = { |
+ new MethodParameter("name", true), |
+ NULL, |
+}; |
+ |
+ |
+static bool SetVMName(Isolate* isolate, JSONStream* js) { |
+ const char* name_param = js->LookupParam("name"); |
+ free(vm_name); |
+ vm_name = strdup(name_param); |
+ if (Service::vm_stream.enabled()) { |
+ ServiceEvent event(NULL, ServiceEvent::kVMUpdate); |
+ Service::HandleEvent(&event); |
+ } |
+ PrintSuccess(js); |
+ return true; |
+} |
+ |
+ |
static const MethodParameter* set_trace_class_allocation_params[] = { |
ISOLATE_PARAMETER, |
new IdParameter("classId", true), |
@@ -3223,6 +3268,8 @@ static ServiceMethodDescriptor service_methods_[] = { |
set_name_params }, |
{ "_setTraceClassAllocation", SetTraceClassAllocation, |
set_trace_class_allocation_params }, |
+ { "setVMName", SetVMName, |
+ set_vm_name_params }, |
}; |