| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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/metrics.h" | 5 #include "vm/metrics.h" |
| 6 | 6 |
| 7 #include "vm/isolate.h" | 7 #include "vm/isolate.h" |
| 8 #include "vm/json_stream.h" | 8 #include "vm/json_stream.h" |
| 9 #include "vm/native_entry.h" | 9 #include "vm/native_entry.h" |
| 10 #include "vm/runtime_entry.h" | 10 #include "vm/runtime_entry.h" |
| 11 #include "vm/object.h" | 11 #include "vm/object.h" |
| 12 #include "vm/log.h" |
| 12 | 13 |
| 13 namespace dart { | 14 namespace dart { |
| 14 | 15 |
| 16 DEFINE_FLAG(bool, print_metrics, false, |
| 17 "Print metrics when isolates (and the VM) are shutdown."); |
| 18 |
| 15 Metric* Metric::vm_list_head_ = NULL; | 19 Metric* Metric::vm_list_head_ = NULL; |
| 16 | 20 |
| 17 Metric::Metric() | 21 Metric::Metric() |
| 18 : isolate_(NULL), | 22 : isolate_(NULL), |
| 19 name_(NULL), | 23 name_(NULL), |
| 20 description_(NULL), | 24 description_(NULL), |
| 21 unit_(kCounter), | 25 unit_(kCounter), |
| 22 value_(0), | 26 value_(0), |
| 23 next_(NULL) { | 27 next_(NULL) { |
| 24 } | 28 } |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 obj.AddFixedServiceId("vm/metrics/%s", name_); | 89 obj.AddFixedServiceId("vm/metrics/%s", name_); |
| 86 } else { | 90 } else { |
| 87 obj.AddFixedServiceId("metrics/native/%s", name_); | 91 obj.AddFixedServiceId("metrics/native/%s", name_); |
| 88 } | 92 } |
| 89 // TODO(johnmccutchan): Overflow? | 93 // TODO(johnmccutchan): Overflow? |
| 90 double value_as_double = static_cast<double>(Value()); | 94 double value_as_double = static_cast<double>(Value()); |
| 91 obj.AddProperty("value", value_as_double); | 95 obj.AddProperty("value", value_as_double); |
| 92 } | 96 } |
| 93 | 97 |
| 94 | 98 |
| 99 char* Metric::ValueToString(int64_t value, Unit unit) { |
| 100 Thread* thread = Thread::Current(); |
| 101 ASSERT(thread != NULL); |
| 102 Zone* zone = thread->zone(); |
| 103 ASSERT(zone != NULL); |
| 104 switch (unit) { |
| 105 case kCounter: |
| 106 return zone->PrintToString("%" Pd64 "", value); |
| 107 case kByte: { |
| 108 const char* scaled_suffix = "b"; |
| 109 double scaled_value = static_cast<double>(value); |
| 110 if (value > KB) { |
| 111 scaled_suffix = "kb"; |
| 112 scaled_value /= KB; |
| 113 } else if (value > MB) { |
| 114 scaled_suffix = "mb"; |
| 115 scaled_value /= MB; |
| 116 } else if (value > GB) { |
| 117 scaled_suffix = "gb"; |
| 118 scaled_value /= GB; |
| 119 } |
| 120 return zone->PrintToString("%.3f %s (%" Pd64 ")", |
| 121 scaled_value, |
| 122 scaled_suffix, |
| 123 value); |
| 124 } |
| 125 default: |
| 126 UNREACHABLE(); |
| 127 return NULL; |
| 128 } |
| 129 } |
| 130 |
| 131 |
| 132 char* Metric::ToString() { |
| 133 Thread* thread = Thread::Current(); |
| 134 ASSERT(thread != NULL); |
| 135 Zone* zone = thread->zone(); |
| 136 ASSERT(zone != NULL); |
| 137 return zone->PrintToString("%s %s", name(), ValueToString(value(), unit())); |
| 138 } |
| 139 |
| 140 |
| 95 bool Metric::NameExists(Metric* head, const char* name) { | 141 bool Metric::NameExists(Metric* head, const char* name) { |
| 96 ASSERT(name != NULL); | 142 ASSERT(name != NULL); |
| 97 while (head != NULL) { | 143 while (head != NULL) { |
| 98 const char* metric_name = head->name(); | 144 const char* metric_name = head->name(); |
| 99 ASSERT(metric_name != NULL); | 145 ASSERT(metric_name != NULL); |
| 100 if (strcmp(metric_name, name) == 0) { | 146 if (strcmp(metric_name, name) == 0) { |
| 101 return true; | 147 return true; |
| 102 } | 148 } |
| 103 head = head->next(); | 149 head = head->next(); |
| 104 } | 150 } |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 #undef VM_METRIC_VARIABLE | 286 #undef VM_METRIC_VARIABLE |
| 241 | 287 |
| 242 | 288 |
| 243 void Metric::InitOnce() { | 289 void Metric::InitOnce() { |
| 244 #define VM_METRIC_INIT(type, variable, name, unit) \ | 290 #define VM_METRIC_INIT(type, variable, name, unit) \ |
| 245 vm_metric_##variable##_.Init(name, NULL, Metric::unit); | 291 vm_metric_##variable##_.Init(name, NULL, Metric::unit); |
| 246 VM_METRIC_LIST(VM_METRIC_INIT); | 292 VM_METRIC_LIST(VM_METRIC_INIT); |
| 247 #undef VM_METRIC_INIT | 293 #undef VM_METRIC_INIT |
| 248 } | 294 } |
| 249 | 295 |
| 296 void Metric::Cleanup() { |
| 297 if (FLAG_print_metrics) { |
| 298 // Create a zone to allocate temporary strings in. |
| 299 StackZone sz(Thread::Current()); |
| 300 OS::Print("Printing metrics for VM\n"); |
| 301 Metric* current = Metric::vm_head(); |
| 302 while (current != NULL) { |
| 303 OS::Print("%s\n", current->ToString()); |
| 304 current = current->next(); |
| 305 } |
| 306 OS::Print("\n"); |
| 307 } |
| 308 } |
| 309 |
| 250 } // namespace dart | 310 } // namespace dart |
| OLD | NEW |