| OLD | NEW | 
|---|
| 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 "platform/globals.h" | 8 #include "platform/globals.h" | 
| 9 | 9 | 
| 10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" | 
| (...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 522 | 522 | 
| 523 | 523 | 
| 524 void Service::SetEventMask(uint32_t mask) { | 524 void Service::SetEventMask(uint32_t mask) { | 
| 525   event_mask_ = mask; | 525   event_mask_ = mask; | 
| 526 } | 526 } | 
| 527 | 527 | 
| 528 | 528 | 
| 529 void Service::SendEvent(intptr_t eventFamilyId, | 529 void Service::SendEvent(intptr_t eventFamilyId, | 
| 530                         intptr_t eventType, | 530                         intptr_t eventType, | 
| 531                         const Object& eventMessage) { | 531                         const Object& eventMessage) { | 
|  | 532   ASSERT(!ServiceIsolate::IsServiceIsolate(Isolate::Current())); | 
| 532   if (!ServiceIsolate::IsRunning()) { | 533   if (!ServiceIsolate::IsRunning()) { | 
| 533     return; | 534     return; | 
| 534   } | 535   } | 
| 535   Isolate* isolate = Isolate::Current(); | 536   Isolate* isolate = Isolate::Current(); | 
| 536   ASSERT(isolate != NULL); | 537   ASSERT(isolate != NULL); | 
| 537   HANDLESCOPE(isolate); | 538   HANDLESCOPE(isolate); | 
| 538 | 539 | 
| 539   // Construct a list of the form [eventFamilyId, eventMessage]. | 540   // Construct a list of the form [eventFamilyId, eventMessage]. | 
| 540   // | 541   // | 
| 541   // TODO(turnidge): Revisit passing the eventFamilyId here at all. | 542   // TODO(turnidge): Revisit passing the eventFamilyId here at all. | 
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 584     memmove(message.DataAddr(offset), data, size); | 585     memmove(message.DataAddr(offset), data, size); | 
| 585     offset += size; | 586     offset += size; | 
| 586   } | 587   } | 
| 587   ASSERT(offset == total_bytes); | 588   ASSERT(offset == total_bytes); | 
| 588   // TODO(turnidge): Pass the real eventType here. | 589   // TODO(turnidge): Pass the real eventType here. | 
| 589   SendEvent(eventFamilyId, 0, message); | 590   SendEvent(eventFamilyId, 0, message); | 
| 590 } | 591 } | 
| 591 | 592 | 
| 592 | 593 | 
| 593 void Service::HandleGCEvent(GCEvent* event) { | 594 void Service::HandleGCEvent(GCEvent* event) { | 
|  | 595   if (ServiceIsolate::IsServiceIsolate(Isolate::Current())) { | 
|  | 596     return; | 
|  | 597   } | 
| 594   JSONStream js; | 598   JSONStream js; | 
| 595   event->PrintJSON(&js); | 599   event->PrintJSON(&js); | 
| 596   const String& message = String::Handle(String::New(js.ToCString())); | 600   const String& message = String::Handle(String::New(js.ToCString())); | 
| 597   // TODO(turnidge): Pass the real eventType here. | 601   // TODO(turnidge): Pass the real eventType here. | 
| 598   SendEvent(kEventFamilyGC, 0, message); | 602   SendEvent(kEventFamilyGC, 0, message); | 
| 599 } | 603 } | 
| 600 | 604 | 
| 601 | 605 | 
| 602 void Service::HandleEvent(ServiceEvent* event) { | 606 void Service::HandleEvent(ServiceEvent* event) { | 
| 603   JSONStream js; | 607   JSONStream js; | 
| (...skipping 1827 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2431 }; | 2435 }; | 
| 2432 | 2436 | 
| 2433 | 2437 | 
| 2434 static bool GetVM(Isolate* isolate, JSONStream* js) { | 2438 static bool GetVM(Isolate* isolate, JSONStream* js) { | 
| 2435   JSONObject jsobj(js); | 2439   JSONObject jsobj(js); | 
| 2436   jsobj.AddProperty("type", "VM"); | 2440   jsobj.AddProperty("type", "VM"); | 
| 2437   jsobj.AddProperty("id", "vm"); | 2441   jsobj.AddProperty("id", "vm"); | 
| 2438   jsobj.AddProperty("architectureBits", static_cast<intptr_t>(kBitsPerWord)); | 2442   jsobj.AddProperty("architectureBits", static_cast<intptr_t>(kBitsPerWord)); | 
| 2439   jsobj.AddProperty("targetCPU", CPU::Id()); | 2443   jsobj.AddProperty("targetCPU", CPU::Id()); | 
| 2440   jsobj.AddProperty("hostCPU", HostCPUFeatures::hardware()); | 2444   jsobj.AddProperty("hostCPU", HostCPUFeatures::hardware()); | 
| 2441   jsobj.AddPropertyF("date", "%" Pd64 "", OS::GetCurrentTimeMillis()); |  | 
| 2442   jsobj.AddProperty("version", Version::String()); | 2445   jsobj.AddProperty("version", Version::String()); | 
| 2443   // Send pid as a string because it allows us to avoid any issues with | 2446   // Send pid as a string because it allows us to avoid any issues with | 
| 2444   // pids > 53-bits (when consumed by JavaScript). | 2447   // pids > 53-bits (when consumed by JavaScript). | 
| 2445   // TODO(johnmccutchan): Codify how integers are sent across the service. | 2448   // TODO(johnmccutchan): Codify how integers are sent across the service. | 
| 2446   jsobj.AddPropertyF("pid", "%" Pd "", OS::ProcessId()); | 2449   jsobj.AddPropertyF("pid", "%" Pd "", OS::ProcessId()); | 
| 2447   jsobj.AddProperty("assertsEnabled", isolate->AssertsEnabled()); | 2450   jsobj.AddProperty("assertsEnabled", isolate->AssertsEnabled()); | 
| 2448   jsobj.AddProperty("typeChecksEnabled", isolate->TypeChecksEnabled()); | 2451   jsobj.AddProperty("typeChecksEnabled", isolate->TypeChecksEnabled()); | 
| 2449   int64_t start_time_micros = Dart::vm_isolate()->start_time(); | 2452   int64_t start_time_millis = (Dart::vm_isolate()->start_time() / | 
| 2450   int64_t uptime_micros = (OS::GetCurrentTimeMicros() - start_time_micros); | 2453                                kMicrosecondsPerMillisecond); | 
| 2451   double seconds = (static_cast<double>(uptime_micros) / | 2454   jsobj.AddProperty64("refreshTime", OS::GetCurrentTimeMillis()); | 
| 2452                     static_cast<double>(kMicrosecondsPerSecond)); | 2455   jsobj.AddProperty64("startTime", start_time_millis); | 
| 2453   jsobj.AddProperty("uptime", seconds); |  | 
| 2454 |  | 
| 2455   // Construct the isolate list. | 2456   // Construct the isolate list. | 
| 2456   { | 2457   { | 
| 2457     JSONArray jsarr(&jsobj, "isolates"); | 2458     JSONArray jsarr(&jsobj, "isolates"); | 
| 2458     ServiceIsolateVisitor visitor(&jsarr); | 2459     ServiceIsolateVisitor visitor(&jsarr); | 
| 2459     Isolate::VisitIsolates(&visitor); | 2460     Isolate::VisitIsolates(&visitor); | 
| 2460   } | 2461   } | 
| 2461   return true; | 2462   return true; | 
| 2462 } | 2463 } | 
| 2463 | 2464 | 
| 2464 | 2465 | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2499     return true; | 2500     return true; | 
| 2500   } else { | 2501   } else { | 
| 2501     jsobj.AddProperty("type", "Failure"); | 2502     jsobj.AddProperty("type", "Failure"); | 
| 2502     jsobj.AddProperty("id", ""); | 2503     jsobj.AddProperty("id", ""); | 
| 2503     jsobj.AddProperty("message", error); | 2504     jsobj.AddProperty("message", error); | 
| 2504     return true; | 2505     return true; | 
| 2505   } | 2506   } | 
| 2506 } | 2507 } | 
| 2507 | 2508 | 
| 2508 | 2509 | 
|  | 2510 static const MethodParameter* set_name_params[] = { | 
|  | 2511   ISOLATE_PARAMETER, | 
|  | 2512   new MethodParameter("name", true), | 
|  | 2513   NULL, | 
|  | 2514 }; | 
|  | 2515 | 
|  | 2516 | 
|  | 2517 static bool SetName(Isolate* isolate, JSONStream* js) { | 
|  | 2518   isolate->set_debugger_name(js->LookupParam("name")); | 
|  | 2519   { | 
|  | 2520     ServiceEvent event(isolate, ServiceEvent::kIsolateUpdate); | 
|  | 2521     Service::HandleEvent(&event); | 
|  | 2522   } | 
|  | 2523   JSONObject jsobj(js); | 
|  | 2524   jsobj.AddProperty("type", "Success"); | 
|  | 2525   return true; | 
|  | 2526 } | 
|  | 2527 | 
|  | 2528 | 
| 2509 static ServiceMethodDescriptor service_methods_[] = { | 2529 static ServiceMethodDescriptor service_methods_[] = { | 
| 2510   { "_echo", _Echo, | 2530   { "_echo", _Echo, | 
| 2511     NULL }, | 2531     NULL }, | 
| 2512   { "_respondWithMalformedJson", _RespondWithMalformedJson, | 2532   { "_respondWithMalformedJson", _RespondWithMalformedJson, | 
| 2513     NULL }, | 2533     NULL }, | 
| 2514   { "_respondWithMalformedObject", _RespondWithMalformedObject, | 2534   { "_respondWithMalformedObject", _RespondWithMalformedObject, | 
| 2515     NULL }, | 2535     NULL }, | 
| 2516   { "_triggerEchoEvent", _TriggerEchoEvent, | 2536   { "_triggerEchoEvent", _TriggerEchoEvent, | 
| 2517     NULL }, | 2537     NULL }, | 
| 2518   { "addBreakpoint", AddBreakpoint, | 2538   { "addBreakpoint", AddBreakpoint, | 
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2570   { "getVMMetricList", GetVMMetricList, | 2590   { "getVMMetricList", GetVMMetricList, | 
| 2571     get_vm_metric_list_params }, | 2591     get_vm_metric_list_params }, | 
| 2572   { "pause", Pause, | 2592   { "pause", Pause, | 
| 2573     pause_params }, | 2593     pause_params }, | 
| 2574   { "removeBreakpoint", RemoveBreakpoint, | 2594   { "removeBreakpoint", RemoveBreakpoint, | 
| 2575     remove_breakpoint_params }, | 2595     remove_breakpoint_params }, | 
| 2576   { "resume", Resume, | 2596   { "resume", Resume, | 
| 2577     resume_params }, | 2597     resume_params }, | 
| 2578   { "requestHeapSnapshot", RequestHeapSnapshot, | 2598   { "requestHeapSnapshot", RequestHeapSnapshot, | 
| 2579     request_heap_snapshot_params }, | 2599     request_heap_snapshot_params }, | 
| 2580   { "setFlag", SetFlag , | 2600   { "setFlag", SetFlag, | 
| 2581     set_flags_params }, | 2601     set_flags_params }, | 
|  | 2602   { "setName", SetName, | 
|  | 2603     set_name_params }, | 
| 2582 }; | 2604 }; | 
| 2583 | 2605 | 
| 2584 | 2606 | 
| 2585 ServiceMethodDescriptor* FindMethod(const char* method_name) { | 2607 ServiceMethodDescriptor* FindMethod(const char* method_name) { | 
| 2586   intptr_t num_methods = sizeof(service_methods_) / | 2608   intptr_t num_methods = sizeof(service_methods_) / | 
| 2587                          sizeof(service_methods_[0]); | 2609                          sizeof(service_methods_[0]); | 
| 2588   for (intptr_t i = 0; i < num_methods; i++) { | 2610   for (intptr_t i = 0; i < num_methods; i++) { | 
| 2589     ServiceMethodDescriptor& method = service_methods_[i]; | 2611     ServiceMethodDescriptor& method = service_methods_[i]; | 
| 2590     if (strcmp(method_name, method.name) == 0) { | 2612     if (strcmp(method_name, method.name) == 0) { | 
| 2591       return &method; | 2613       return &method; | 
| 2592     } | 2614     } | 
| 2593   } | 2615   } | 
| 2594   return NULL; | 2616   return NULL; | 
| 2595 } | 2617 } | 
| 2596 | 2618 | 
| 2597 | 2619 | 
| 2598 }  // namespace dart | 2620 }  // namespace dart | 
| OLD | NEW | 
|---|