OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/devtools/v8_sampling_profiler.h" | 5 #include "content/renderer/devtools/v8_sampling_profiler.h" |
6 | 6 |
7 #if defined(OS_POSIX) | 7 #if defined(OS_POSIX) |
8 #include <signal.h> | 8 #include <signal.h> |
9 #define USE_SIGNALS | 9 #define USE_SIGNALS |
10 #endif | 10 #endif |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 "0x%" PRIx64, static_cast<uint64>(reinterpret_cast<intptr_t>(value))); | 90 "0x%" PRIx64, static_cast<uint64>(reinterpret_cast<intptr_t>(value))); |
91 } | 91 } |
92 | 92 |
93 class SampleRecord { | 93 class SampleRecord { |
94 public: | 94 public: |
95 static const int kMaxFramesCountLog2 = 8; | 95 static const int kMaxFramesCountLog2 = 8; |
96 static const unsigned kMaxFramesCount = (1u << kMaxFramesCountLog2) - 1; | 96 static const unsigned kMaxFramesCount = (1u << kMaxFramesCountLog2) - 1; |
97 | 97 |
98 SampleRecord() {} | 98 SampleRecord() {} |
99 | 99 |
100 base::TraceTicks timestamp() const { return timestamp_; } | 100 base::TimeTicks timestamp() const { return timestamp_; } |
101 void Collect(v8::Isolate* isolate, | 101 void Collect(v8::Isolate* isolate, |
102 base::TraceTicks timestamp, | 102 base::TimeTicks timestamp, |
103 const v8::RegisterState& state); | 103 const v8::RegisterState& state); |
104 scoped_refptr<ConvertableToTraceFormat> ToTraceFormat() const; | 104 scoped_refptr<ConvertableToTraceFormat> ToTraceFormat() const; |
105 | 105 |
106 private: | 106 private: |
107 base::TraceTicks timestamp_; | 107 base::TimeTicks timestamp_; |
108 unsigned vm_state_ : 4; | 108 unsigned vm_state_ : 4; |
109 unsigned frames_count_ : kMaxFramesCountLog2; | 109 unsigned frames_count_ : kMaxFramesCountLog2; |
110 const void* frames_[kMaxFramesCount]; | 110 const void* frames_[kMaxFramesCount]; |
111 | 111 |
112 DISALLOW_COPY_AND_ASSIGN(SampleRecord); | 112 DISALLOW_COPY_AND_ASSIGN(SampleRecord); |
113 }; | 113 }; |
114 | 114 |
115 void SampleRecord::Collect(v8::Isolate* isolate, | 115 void SampleRecord::Collect(v8::Isolate* isolate, |
116 base::TraceTicks timestamp, | 116 base::TimeTicks timestamp, |
117 const v8::RegisterState& state) { | 117 const v8::RegisterState& state) { |
118 v8::SampleInfo sample_info; | 118 v8::SampleInfo sample_info; |
119 isolate->GetStackSample(state, (void**)frames_, kMaxFramesCount, | 119 isolate->GetStackSample(state, (void**)frames_, kMaxFramesCount, |
120 &sample_info); | 120 &sample_info); |
121 timestamp_ = timestamp; | 121 timestamp_ = timestamp; |
122 frames_count_ = sample_info.frames_count; | 122 frames_count_ = sample_info.frames_count; |
123 vm_state_ = sample_info.vm_state; | 123 vm_state_ = sample_info.vm_state; |
124 } | 124 } |
125 | 125 |
126 scoped_refptr<ConvertableToTraceFormat> SampleRecord::ToTraceFormat() const { | 126 scoped_refptr<ConvertableToTraceFormat> SampleRecord::ToTraceFormat() const { |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 LOG(ERROR) << "pthread_kill failed with error " << error << " " | 277 LOG(ERROR) << "pthread_kill failed with error " << error << " " |
278 << strerror(error); | 278 << strerror(error); |
279 } | 279 } |
280 #endif | 280 #endif |
281 InjectPendingEvents(); | 281 InjectPendingEvents(); |
282 } | 282 } |
283 | 283 |
284 void Sampler::DoSample(const v8::RegisterState& state) { | 284 void Sampler::DoSample(const v8::RegisterState& state) { |
285 // Called in the sampled thread signal handler. | 285 // Called in the sampled thread signal handler. |
286 // Because of that it is not allowed to do any memory allocation here. | 286 // Because of that it is not allowed to do any memory allocation here. |
287 base::TraceTicks timestamp = base::TraceTicks::Now(); | 287 base::TimeTicks timestamp = base::TimeTicks::Now(); |
288 SampleRecord* record = samples_data_->StartEnqueue(); | 288 SampleRecord* record = samples_data_->StartEnqueue(); |
289 if (!record) | 289 if (!record) |
290 return; | 290 return; |
291 record->Collect(isolate_, timestamp, state); | 291 record->Collect(isolate_, timestamp, state); |
292 samples_data_->FinishEnqueue(); | 292 samples_data_->FinishEnqueue(); |
293 } | 293 } |
294 | 294 |
295 void Sampler::InjectPendingEvents() { | 295 void Sampler::InjectPendingEvents() { |
296 SampleRecord* record = samples_data_->Peek(); | 296 SampleRecord* record = samples_data_->Peek(); |
297 while (record) { | 297 while (record) { |
298 TRACE_EVENT_SAMPLE_WITH_TID_AND_TIMESTAMP1( | 298 TRACE_EVENT_SAMPLE_WITH_TID_AND_TIMESTAMP1( |
299 TRACE_DISABLED_BY_DEFAULT("v8.cpu_profile"), "V8Sample", | 299 TRACE_DISABLED_BY_DEFAULT("v8.cpu_profile"), "V8Sample", |
300 platform_data_.thread_id(), | 300 platform_data_.thread_id(), |
301 (record->timestamp() - base::TraceTicks()).InMicroseconds(), "data", | 301 (record->timestamp() - base::TimeTicks()).InMicroseconds(), "data", |
302 record->ToTraceFormat()); | 302 record->ToTraceFormat()); |
303 samples_data_->Remove(); | 303 samples_data_->Remove(); |
304 record = samples_data_->Peek(); | 304 record = samples_data_->Peek(); |
305 base::subtle::NoBarrier_AtomicIncrement(&samples_count_, 1); | 305 base::subtle::NoBarrier_AtomicIncrement(&samples_count_, 1); |
306 } | 306 } |
307 } | 307 } |
308 | 308 |
309 // static | 309 // static |
310 void Sampler::InstallJitCodeEventHandler(Isolate* isolate, void* data) { | 310 void Sampler::InstallJitCodeEventHandler(Isolate* isolate, void* data) { |
311 // Called on the sampled V8 thread. | 311 // Called on the sampled V8 thread. |
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
631 render_thread_sampler_->SetEventsToCollectForTest(code_added_events, | 631 render_thread_sampler_->SetEventsToCollectForTest(code_added_events, |
632 sample_events); | 632 sample_events); |
633 waitable_event_for_testing_.reset(new base::WaitableEvent(false, false)); | 633 waitable_event_for_testing_.reset(new base::WaitableEvent(false, false)); |
634 } | 634 } |
635 | 635 |
636 void V8SamplingProfiler::WaitSamplingEventForTesting() { | 636 void V8SamplingProfiler::WaitSamplingEventForTesting() { |
637 waitable_event_for_testing_->Wait(); | 637 waitable_event_for_testing_->Wait(); |
638 } | 638 } |
639 | 639 |
640 } // namespace blink | 640 } // namespace blink |
OLD | NEW |