Chromium Code Reviews| 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 #ifndef VM_PROFILER_H_ | 5 #ifndef VM_PROFILER_H_ |
| 6 #define VM_PROFILER_H_ | 6 #define VM_PROFILER_H_ |
| 7 | 7 |
| 8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" |
| 9 #include "vm/code_observers.h" | 9 #include "vm/code_observers.h" |
| 10 #include "vm/globals.h" | 10 #include "vm/globals.h" |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 112 // The maximum number of stack frames a sample can hold. | 112 // The maximum number of stack frames a sample can hold. |
| 113 #define kSampleFramesSize 256 | 113 #define kSampleFramesSize 256 |
| 114 | 114 |
| 115 // Each Sample holds a stack trace from an isolate. | 115 // Each Sample holds a stack trace from an isolate. |
| 116 class Sample { | 116 class Sample { |
| 117 public: | 117 public: |
| 118 void Init(Isolate* isolate, int64_t timestamp, ThreadId tid) { | 118 void Init(Isolate* isolate, int64_t timestamp, ThreadId tid) { |
| 119 timestamp_ = timestamp; | 119 timestamp_ = timestamp; |
| 120 tid_ = tid; | 120 tid_ = tid; |
| 121 isolate_ = isolate; | 121 isolate_ = isolate; |
| 122 pc_marker_ = 0; | |
| 122 vm_tag_ = VMTag::kInvalidTagId; | 123 vm_tag_ = VMTag::kInvalidTagId; |
| 123 user_tag_ = UserTags::kNoUserTag; | 124 user_tag_ = UserTags::kNoUserTag; |
| 125 sp_ = 0; | |
| 126 fp_ = 0; | |
| 127 state_ = 0; | |
| 124 for (intptr_t i = 0; i < kSampleFramesSize; i++) { | 128 for (intptr_t i = 0; i < kSampleFramesSize; i++) { |
| 125 pcs_[i] = 0; | 129 pcs_[i] = 0; |
| 126 } | 130 } |
| 127 } | 131 } |
| 128 | 132 |
| 129 // Isolate sample was taken from. | 133 // Isolate sample was taken from. |
| 130 Isolate* isolate() const { | 134 Isolate* isolate() const { |
| 131 return isolate_; | 135 return isolate_; |
| 132 } | 136 } |
| 133 | 137 |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 158 vm_tag_ = tag; | 162 vm_tag_ = tag; |
| 159 } | 163 } |
| 160 | 164 |
| 161 uword user_tag() const { | 165 uword user_tag() const { |
| 162 return user_tag_; | 166 return user_tag_; |
| 163 } | 167 } |
| 164 void set_user_tag(uword tag) { | 168 void set_user_tag(uword tag) { |
| 165 user_tag_ = tag; | 169 user_tag_ = tag; |
| 166 } | 170 } |
| 167 | 171 |
| 172 uword pc_marker() const { | |
| 173 return pc_marker_; | |
| 174 } | |
| 175 | |
| 176 void set_pc_marker(uword pc_marker) { | |
| 177 pc_marker_ = pc_marker; | |
| 178 } | |
| 179 | |
| 180 uword sp() { | |
| 181 return sp_; | |
| 182 } | |
| 183 | |
| 184 void set_sp(uword sp) { | |
| 185 sp_ = sp; | |
| 186 } | |
| 187 | |
| 188 uword fp() { | |
| 189 return fp_; | |
| 190 } | |
| 191 | |
| 192 void set_fp(uword fp) { | |
| 193 fp_ = fp; | |
| 194 } | |
| 195 | |
| 196 void InsertCallerForTopFrame(uword pc) { | |
| 197 // Shift all entries down. | |
| 198 for (intptr_t i = 1; i < kSampleFramesSize - 1; i++) { | |
| 199 pcs_[i + 1] = pcs_[i]; | |
| 200 } | |
| 201 pcs_[1] = pc; | |
| 202 } | |
| 203 | |
| 204 bool processed() const { | |
| 205 return ProcessedBit::decode(state_); | |
| 206 } | |
| 207 | |
| 208 void set_processed(bool processed) { | |
| 209 state_ = ProcessedBit::update(processed, state_); | |
| 210 } | |
| 211 | |
| 212 bool leaf_frame_is_dart() const { | |
| 213 return LeafFrameIsDart::decode(state_); | |
| 214 } | |
| 215 | |
| 216 void set_leaf_frame_is_dart(bool leaf_frame_is_dart) { | |
| 217 state_ = LeafFrameIsDart::update(leaf_frame_is_dart, state_); | |
| 218 } | |
| 219 | |
| 168 private: | 220 private: |
| 221 class ProcessedBit : public BitField<bool, 0, 1> {}; | |
| 222 class LeafFrameIsDart : public BitField<bool, 1, 1> {}; | |
| 169 int64_t timestamp_; | 223 int64_t timestamp_; |
| 170 ThreadId tid_; | 224 ThreadId tid_; |
| 171 Isolate* isolate_; | 225 Isolate* isolate_; |
| 226 uword pc_marker_; | |
| 172 uword vm_tag_; | 227 uword vm_tag_; |
| 173 uword user_tag_; | 228 uword user_tag_; |
| 229 uword sp_; | |
| 230 uword fp_; | |
| 231 uword state_; | |
| 174 uword pcs_[kSampleFramesSize]; | 232 uword pcs_[kSampleFramesSize]; |
| 175 }; | 233 }; |
| 176 | 234 |
| 177 | 235 |
| 178 // Ring buffer of Samples that is (usually) shared by many isolates. | 236 // Ring buffer of Samples that is (usually) shared by many isolates. |
| 179 class SampleBuffer { | 237 class SampleBuffer { |
| 180 public: | 238 public: |
| 181 static const intptr_t kDefaultBufferCapacity = 120000; // 2 minutes @ 1000hz. | 239 static const intptr_t kDefaultBufferCapacity = 120000; // 2 minutes @ 1000hz. |
| 182 | 240 |
| 183 explicit SampleBuffer(intptr_t capacity = kDefaultBufferCapacity) { | 241 explicit SampleBuffer(intptr_t capacity = kDefaultBufferCapacity) { |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 198 intptr_t capacity() const { return capacity_; } | 256 intptr_t capacity() const { return capacity_; } |
| 199 | 257 |
| 200 Sample* ReserveSample(); | 258 Sample* ReserveSample(); |
| 201 | 259 |
| 202 Sample* At(intptr_t idx) const { | 260 Sample* At(intptr_t idx) const { |
| 203 ASSERT(idx >= 0); | 261 ASSERT(idx >= 0); |
| 204 ASSERT(idx < capacity_); | 262 ASSERT(idx < capacity_); |
| 205 return &samples_[idx]; | 263 return &samples_[idx]; |
| 206 } | 264 } |
| 207 | 265 |
| 208 void VisitSamples(SampleVisitor* visitor) { | 266 void VisitSamples(SampleVisitor* visitor) { |
|
srdjan
2014/05/02 18:20:29
Remove one of VisitSamples/VisitSamplesByReference
Cutch
2014/05/02 18:37:03
Done.
| |
| 209 ASSERT(visitor != NULL); | 267 ASSERT(visitor != NULL); |
| 210 Sample sample; | 268 Sample sample; |
| 211 const intptr_t length = capacity(); | 269 const intptr_t length = capacity(); |
| 212 for (intptr_t i = 0; i < length; i++) { | 270 for (intptr_t i = 0; i < length; i++) { |
| 213 // Copy the sample. | 271 // Copy the sample. |
| 214 sample = *At(i); | 272 sample = *At(i); |
| 215 if (sample.isolate() != visitor->isolate()) { | 273 if (sample.isolate() != visitor->isolate()) { |
| 216 // Another isolate. | 274 // Another isolate. |
| 217 continue; | 275 continue; |
| 218 } | 276 } |
| 219 if (sample.timestamp() == 0) { | 277 if (sample.timestamp() == 0) { |
| 220 // Empty. | 278 // Empty. |
| 221 continue; | 279 continue; |
| 222 } | 280 } |
| 223 if (sample.At(0) == 0) { | 281 if (sample.At(0) == 0) { |
| 224 // No frames. | 282 // No frames. |
| 225 continue; | 283 continue; |
| 226 } | 284 } |
| 227 visitor->IncrementVisited(); | 285 visitor->IncrementVisited(); |
| 228 visitor->VisitSample(&sample); | 286 visitor->VisitSample(&sample); |
| 229 } | 287 } |
| 230 } | 288 } |
| 231 | 289 |
| 290 void VisitSamplesByReference(SampleVisitor* visitor) { | |
| 291 ASSERT(visitor != NULL); | |
| 292 Sample* sample; | |
| 293 const intptr_t length = capacity(); | |
| 294 for (intptr_t i = 0; i < length; i++) { | |
| 295 sample = At(i); | |
|
srdjan
2014/05/02 18:20:29
You can put Sample* sample = At(i); here.
OR
const
Cutch
2014/05/02 18:37:03
Done.
| |
| 296 if (sample->isolate() != visitor->isolate()) { | |
| 297 // Another isolate. | |
| 298 continue; | |
| 299 } | |
| 300 if (sample->timestamp() == 0) { | |
| 301 // Empty. | |
| 302 continue; | |
| 303 } | |
| 304 if (sample->At(0) == 0) { | |
| 305 // No frames. | |
| 306 continue; | |
| 307 } | |
| 308 visitor->IncrementVisited(); | |
| 309 visitor->VisitSample(sample); | |
| 310 } | |
| 311 } | |
| 312 | |
| 232 private: | 313 private: |
| 233 Sample* samples_; | 314 Sample* samples_; |
| 234 intptr_t capacity_; | 315 intptr_t capacity_; |
| 235 uintptr_t cursor_; | 316 uintptr_t cursor_; |
| 236 | 317 |
| 237 DISALLOW_COPY_AND_ASSIGN(SampleBuffer); | 318 DISALLOW_COPY_AND_ASSIGN(SampleBuffer); |
| 238 }; | 319 }; |
| 239 | 320 |
| 240 | 321 |
| 241 } // namespace dart | 322 } // namespace dart |
| 242 | 323 |
| 243 #endif // VM_PROFILER_H_ | 324 #endif // VM_PROFILER_H_ |
| OLD | NEW |