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

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

Issue 1398823002: We can now name the current VM using the service protocol. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: more Created 5 years, 2 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
« no previous file with comments | « runtime/vm/service.h ('k') | runtime/vm/service/service.md » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "include/dart_native_api.h" 8 #include "include/dart_native_api.h"
9 #include "platform/globals.h" 9 #include "platform/globals.h"
10 10
(...skipping 24 matching lines...) Expand all
35 #include "vm/unicode.h" 35 #include "vm/unicode.h"
36 #include "vm/version.h" 36 #include "vm/version.h"
37 37
38 namespace dart { 38 namespace dart {
39 39
40 #define Z (T->zone()) 40 #define Z (T->zone())
41 41
42 42
43 DECLARE_FLAG(bool, trace_service); 43 DECLARE_FLAG(bool, trace_service);
44 DECLARE_FLAG(bool, trace_service_pause_events); 44 DECLARE_FLAG(bool, trace_service_pause_events);
45 DEFINE_FLAG(charp, vm_name, "vm",
46 "The default name of this vm as reported by the VM service "
47 "protocol");
48
49 // The name of this of this vm as reported by the VM service protocol.
50 static char* vm_name = NULL;
51
52
53 static const char* GetVMName() {
54 if (vm_name == NULL) {
55 return FLAG_vm_name;
56 }
57 return vm_name;
58 }
59
45 60
46 ServiceIdZone::ServiceIdZone() { 61 ServiceIdZone::ServiceIdZone() {
47 } 62 }
48 63
49 64
50 ServiceIdZone::~ServiceIdZone() { 65 ServiceIdZone::~ServiceIdZone() {
51 } 66 }
52 67
53 68
54 RingServiceIdZone::RingServiceIdZone() 69 RingServiceIdZone::RingServiceIdZone()
(...skipping 29 matching lines...) Expand all
84 struct ServiceMethodDescriptor; 99 struct ServiceMethodDescriptor;
85 ServiceMethodDescriptor* FindMethod(const char* method_name); 100 ServiceMethodDescriptor* FindMethod(const char* method_name);
86 101
87 102
88 // Support for streams defined in embedders. 103 // Support for streams defined in embedders.
89 Dart_ServiceStreamListenCallback Service::stream_listen_callback_ = NULL; 104 Dart_ServiceStreamListenCallback Service::stream_listen_callback_ = NULL;
90 Dart_ServiceStreamCancelCallback Service::stream_cancel_callback_ = NULL; 105 Dart_ServiceStreamCancelCallback Service::stream_cancel_callback_ = NULL;
91 106
92 107
93 // These are the set of streams known to the core VM. 108 // These are the set of streams known to the core VM.
109 StreamInfo Service::vm_stream("VM");
94 StreamInfo Service::isolate_stream("Isolate"); 110 StreamInfo Service::isolate_stream("Isolate");
95 StreamInfo Service::debug_stream("Debug"); 111 StreamInfo Service::debug_stream("Debug");
96 StreamInfo Service::gc_stream("GC"); 112 StreamInfo Service::gc_stream("GC");
97 StreamInfo Service::echo_stream("_Echo"); 113 StreamInfo Service::echo_stream("_Echo");
98 StreamInfo Service::graph_stream("_Graph"); 114 StreamInfo Service::graph_stream("_Graph");
99 StreamInfo Service::logging_stream("_Logging"); 115 StreamInfo Service::logging_stream("_Logging");
100 116
101 static StreamInfo* streams_[] = { 117 static StreamInfo* streams_[] = {
118 &Service::vm_stream,
102 &Service::isolate_stream, 119 &Service::isolate_stream,
103 &Service::debug_stream, 120 &Service::debug_stream,
104 &Service::gc_stream, 121 &Service::gc_stream,
105 &Service::echo_stream, 122 &Service::echo_stream,
106 &Service::graph_stream, 123 &Service::graph_stream,
107 &Service::logging_stream, 124 &Service::logging_stream,
108 }; 125 };
109 126
110 127
111 bool Service::ListenStream(const char* stream_id) { 128 bool Service::ListenStream(const char* stream_id) {
(...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after
644 661
645 void Service::HandleIsolateMessage(Isolate* isolate, const Array& msg) { 662 void Service::HandleIsolateMessage(Isolate* isolate, const Array& msg) {
646 ASSERT(isolate != NULL); 663 ASSERT(isolate != NULL);
647 InvokeMethod(isolate, msg); 664 InvokeMethod(isolate, msg);
648 } 665 }
649 666
650 667
651 void Service::SendEvent(const char* stream_id, 668 void Service::SendEvent(const char* stream_id,
652 const char* event_type, 669 const char* event_type,
653 const Object& event_message) { 670 const Object& event_message) {
654 ASSERT(!ServiceIsolate::IsServiceIsolateDescendant(Isolate::Current())); 671 Thread* thread = Thread::Current();
672 Isolate* isolate = thread->isolate();
673 ASSERT(isolate != NULL);
674 ASSERT(!ServiceIsolate::IsServiceIsolateDescendant(isolate));
655 if (!ServiceIsolate::IsRunning()) { 675 if (!ServiceIsolate::IsRunning()) {
656 return; 676 return;
657 } 677 }
658 Thread* thread = Thread::Current();
659 Isolate* isolate = thread->isolate();
660 ASSERT(isolate != NULL);
661 HANDLESCOPE(thread); 678 HANDLESCOPE(thread);
662 679
663 const Array& list = Array::Handle(Array::New(2)); 680 const Array& list = Array::Handle(Array::New(2));
664 ASSERT(!list.IsNull()); 681 ASSERT(!list.IsNull());
665 const String& stream_id_str = String::Handle(String::New(stream_id)); 682 const String& stream_id_str = String::Handle(String::New(stream_id));
666 list.SetAt(0, stream_id_str); 683 list.SetAt(0, stream_id_str);
667 list.SetAt(1, event_message); 684 list.SetAt(1, event_message);
668 685
669 // Push the event to port_. 686 // Push the event to port_.
670 uint8_t* data = NULL; 687 uint8_t* data = NULL;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 NoSafepointScope no_safepoint; 725 NoSafepointScope no_safepoint;
709 memmove(message.DataAddr(offset), data, size); 726 memmove(message.DataAddr(offset), data, size);
710 offset += size; 727 offset += size;
711 } 728 }
712 ASSERT(offset == total_bytes); 729 ASSERT(offset == total_bytes);
713 SendEvent(stream_id, event_type, message); 730 SendEvent(stream_id, event_type, message);
714 } 731 }
715 732
716 733
717 void Service::HandleEvent(ServiceEvent* event) { 734 void Service::HandleEvent(ServiceEvent* event) {
718 if (ServiceIsolate::IsServiceIsolateDescendant(event->isolate())) { 735 if (event->isolate() != NULL &&
736 ServiceIsolate::IsServiceIsolateDescendant(event->isolate())) {
719 return; 737 return;
720 } 738 }
721 if (!ServiceIsolate::IsRunning()) { 739 if (!ServiceIsolate::IsRunning()) {
722 return; 740 return;
723 } 741 }
724 JSONStream js; 742 JSONStream js;
725 const char* stream_id = event->stream_id(); 743 const char* stream_id = event->stream_id();
726 ASSERT(stream_id != NULL); 744 ASSERT(stream_id != NULL);
727 { 745 {
728 JSONObject jsobj(&js); 746 JSONObject jsobj(&js);
(...skipping 2209 matching lines...) Expand 10 before | Expand all | Expand 10 after
2938 JSONArray* jsarr_; 2956 JSONArray* jsarr_;
2939 }; 2957 };
2940 2958
2941 2959
2942 static const MethodParameter* get_vm_params[] = { 2960 static const MethodParameter* get_vm_params[] = {
2943 NO_ISOLATE_PARAMETER, 2961 NO_ISOLATE_PARAMETER,
2944 NULL, 2962 NULL,
2945 }; 2963 };
2946 2964
2947 2965
2948 static bool GetVM(Isolate* isolate, JSONStream* js) { 2966 void Service::PrintJSONForVM(JSONStream* js, bool ref) {
2949 JSONObject jsobj(js); 2967 JSONObject jsobj(js);
2950 jsobj.AddProperty("type", "VM"); 2968 jsobj.AddProperty("type", (ref ? "@VM" : "VM"));
2969 jsobj.AddProperty("name", GetVMName());
2970 if (ref) {
2971 return;
2972 }
2973 Isolate* vm_isolate = Dart::vm_isolate();
2951 jsobj.AddProperty("architectureBits", static_cast<intptr_t>(kBitsPerWord)); 2974 jsobj.AddProperty("architectureBits", static_cast<intptr_t>(kBitsPerWord));
2952 jsobj.AddProperty("targetCPU", CPU::Id()); 2975 jsobj.AddProperty("targetCPU", CPU::Id());
2953 jsobj.AddProperty("hostCPU", HostCPUFeatures::hardware()); 2976 jsobj.AddProperty("hostCPU", HostCPUFeatures::hardware());
2954 jsobj.AddProperty("version", Version::String()); 2977 jsobj.AddProperty("version", Version::String());
2955 jsobj.AddProperty("pid", OS::ProcessId()); 2978 jsobj.AddProperty("pid", OS::ProcessId());
2956 jsobj.AddProperty("_assertsEnabled", isolate->flags().asserts()); 2979 int64_t start_time_millis = (vm_isolate->start_time() /
2957 jsobj.AddProperty("_typeChecksEnabled", isolate->flags().type_checks());
2958 int64_t start_time_millis = (Dart::vm_isolate()->start_time() /
2959 kMicrosecondsPerMillisecond); 2980 kMicrosecondsPerMillisecond);
2960 jsobj.AddPropertyTimeMillis("startTime", start_time_millis); 2981 jsobj.AddPropertyTimeMillis("startTime", start_time_millis);
2961 // Construct the isolate list. 2982 // Construct the isolate list.
2962 { 2983 {
2963 JSONArray jsarr(&jsobj, "isolates"); 2984 JSONArray jsarr(&jsobj, "isolates");
2964 ServiceIsolateVisitor visitor(&jsarr); 2985 ServiceIsolateVisitor visitor(&jsarr);
2965 Isolate::VisitIsolates(&visitor); 2986 Isolate::VisitIsolates(&visitor);
2966 } 2987 }
2988 }
2989
2990
2991 static bool GetVM(Isolate* isolate, JSONStream* js) {
2992 Service::PrintJSONForVM(js, false);
2967 return true; 2993 return true;
2968 } 2994 }
2969 2995
2970 2996
2971 static const MethodParameter* restart_vm_params[] = { 2997 static const MethodParameter* restart_vm_params[] = {
2972 NO_ISOLATE_PARAMETER, 2998 NO_ISOLATE_PARAMETER,
2973 NULL, 2999 NULL,
2974 }; 3000 };
2975 3001
2976 3002
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
3097 isolate->set_debugger_name(js->LookupParam("name")); 3123 isolate->set_debugger_name(js->LookupParam("name"));
3098 if (Service::isolate_stream.enabled()) { 3124 if (Service::isolate_stream.enabled()) {
3099 ServiceEvent event(isolate, ServiceEvent::kIsolateUpdate); 3125 ServiceEvent event(isolate, ServiceEvent::kIsolateUpdate);
3100 Service::HandleEvent(&event); 3126 Service::HandleEvent(&event);
3101 } 3127 }
3102 PrintSuccess(js); 3128 PrintSuccess(js);
3103 return true; 3129 return true;
3104 } 3130 }
3105 3131
3106 3132
3133 static const MethodParameter* set_vm_name_params[] = {
3134 new MethodParameter("name", true),
3135 NULL,
3136 };
3137
3138
3139 static bool SetVMName(Isolate* isolate, JSONStream* js) {
3140 const char* name_param = js->LookupParam("name");
3141 free(vm_name);
3142 vm_name = strdup(name_param);
3143 if (Service::vm_stream.enabled()) {
3144 ServiceEvent event(NULL, ServiceEvent::kVMUpdate);
3145 Service::HandleEvent(&event);
3146 }
3147 PrintSuccess(js);
3148 return true;
3149 }
3150
3151
3107 static const MethodParameter* set_trace_class_allocation_params[] = { 3152 static const MethodParameter* set_trace_class_allocation_params[] = {
3108 ISOLATE_PARAMETER, 3153 ISOLATE_PARAMETER,
3109 new IdParameter("classId", true), 3154 new IdParameter("classId", true),
3110 new BoolParameter("enable", true), 3155 new BoolParameter("enable", true),
3111 NULL, 3156 NULL,
3112 }; 3157 };
3113 3158
3114 3159
3115 static bool SetTraceClassAllocation(Isolate* isolate, JSONStream* js) { 3160 static bool SetTraceClassAllocation(Isolate* isolate, JSONStream* js) {
3116 const char* class_id = js->LookupParam("classId"); 3161 const char* class_id = js->LookupParam("classId");
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
3216 { "_setExceptionPauseInfo", SetExceptionPauseInfo, 3261 { "_setExceptionPauseInfo", SetExceptionPauseInfo,
3217 set_exception_pause_info_params }, 3262 set_exception_pause_info_params },
3218 { "_setFlag", SetFlag, 3263 { "_setFlag", SetFlag,
3219 set_flags_params }, 3264 set_flags_params },
3220 { "setLibraryDebuggable", SetLibraryDebuggable, 3265 { "setLibraryDebuggable", SetLibraryDebuggable,
3221 set_library_debuggable_params }, 3266 set_library_debuggable_params },
3222 { "setName", SetName, 3267 { "setName", SetName,
3223 set_name_params }, 3268 set_name_params },
3224 { "_setTraceClassAllocation", SetTraceClassAllocation, 3269 { "_setTraceClassAllocation", SetTraceClassAllocation,
3225 set_trace_class_allocation_params }, 3270 set_trace_class_allocation_params },
3271 { "setVMName", SetVMName,
3272 set_vm_name_params },
3226 }; 3273 };
3227 3274
3228 3275
3229 ServiceMethodDescriptor* FindMethod(const char* method_name) { 3276 ServiceMethodDescriptor* FindMethod(const char* method_name) {
3230 intptr_t num_methods = sizeof(service_methods_) / 3277 intptr_t num_methods = sizeof(service_methods_) /
3231 sizeof(service_methods_[0]); 3278 sizeof(service_methods_[0]);
3232 for (intptr_t i = 0; i < num_methods; i++) { 3279 for (intptr_t i = 0; i < num_methods; i++) {
3233 ServiceMethodDescriptor& method = service_methods_[i]; 3280 ServiceMethodDescriptor& method = service_methods_[i];
3234 if (strcmp(method_name, method.name) == 0) { 3281 if (strcmp(method_name, method.name) == 0) {
3235 return &method; 3282 return &method;
3236 } 3283 }
3237 } 3284 }
3238 return NULL; 3285 return NULL;
3239 } 3286 }
3240 3287
3241 3288
3242 } // namespace dart 3289 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/service.h ('k') | runtime/vm/service/service.md » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698