| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project 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 "src/profiler/cpu-profiler.h" | 5 #include "src/profiler/cpu-profiler.h" |
| 6 | 6 |
| 7 #include "src/debug/debug.h" | 7 #include "src/debug/debug.h" |
| 8 #include "src/deoptimizer.h" | 8 #include "src/deoptimizer.h" |
| 9 #include "src/frames-inl.h" | 9 #include "src/frames-inl.h" |
| 10 #include "src/locked-queue-inl.h" | 10 #include "src/locked-queue-inl.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 | 42 |
| 43 | 43 |
| 44 void ProfilerEventsProcessor::AddDeoptStack(Isolate* isolate, Address from, | 44 void ProfilerEventsProcessor::AddDeoptStack(Isolate* isolate, Address from, |
| 45 int fp_to_sp_delta) { | 45 int fp_to_sp_delta) { |
| 46 TickSampleEventRecord record(last_code_event_id_.Value()); | 46 TickSampleEventRecord record(last_code_event_id_.Value()); |
| 47 RegisterState regs; | 47 RegisterState regs; |
| 48 Address fp = isolate->c_entry_fp(isolate->thread_local_top()); | 48 Address fp = isolate->c_entry_fp(isolate->thread_local_top()); |
| 49 regs.sp = fp - fp_to_sp_delta; | 49 regs.sp = fp - fp_to_sp_delta; |
| 50 regs.fp = fp; | 50 regs.fp = fp; |
| 51 regs.pc = from; | 51 regs.pc = from; |
| 52 record.sample.Init(isolate, regs, TickSample::kSkipCEntryFrame); | 52 record.sample.Init(isolate, regs, TickSample::kSkipCEntryFrame, false); |
| 53 ticks_from_vm_buffer_.Enqueue(record); | 53 ticks_from_vm_buffer_.Enqueue(record); |
| 54 } | 54 } |
| 55 | 55 |
| 56 | 56 void ProfilerEventsProcessor::AddCurrentStack(Isolate* isolate, |
| 57 void ProfilerEventsProcessor::AddCurrentStack(Isolate* isolate) { | 57 bool update_stats) { |
| 58 TickSampleEventRecord record(last_code_event_id_.Value()); | 58 TickSampleEventRecord record(last_code_event_id_.Value()); |
| 59 RegisterState regs; | 59 RegisterState regs; |
| 60 StackFrameIterator it(isolate); | 60 StackFrameIterator it(isolate); |
| 61 if (!it.done()) { | 61 if (!it.done()) { |
| 62 StackFrame* frame = it.frame(); | 62 StackFrame* frame = it.frame(); |
| 63 regs.sp = frame->sp(); | 63 regs.sp = frame->sp(); |
| 64 regs.fp = frame->fp(); | 64 regs.fp = frame->fp(); |
| 65 regs.pc = frame->pc(); | 65 regs.pc = frame->pc(); |
| 66 } | 66 } |
| 67 record.sample.Init(isolate, regs, TickSample::kSkipCEntryFrame); | 67 record.sample.Init(isolate, regs, TickSample::kSkipCEntryFrame, update_stats); |
| 68 ticks_from_vm_buffer_.Enqueue(record); | 68 ticks_from_vm_buffer_.Enqueue(record); |
| 69 } | 69 } |
| 70 | 70 |
| 71 | 71 |
| 72 void ProfilerEventsProcessor::StopSynchronously() { | 72 void ProfilerEventsProcessor::StopSynchronously() { |
| 73 if (!base::NoBarrier_AtomicExchange(&running_, 0)) return; | 73 if (!base::NoBarrier_AtomicExchange(&running_, 0)) return; |
| 74 Join(); | 74 Join(); |
| 75 } | 75 } |
| 76 | 76 |
| 77 | 77 |
| (...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 DCHECK(!is_profiling_); | 422 DCHECK(!is_profiling_); |
| 423 sampling_interval_ = value; | 423 sampling_interval_ = value; |
| 424 } | 424 } |
| 425 | 425 |
| 426 | 426 |
| 427 void CpuProfiler::ResetProfiles() { | 427 void CpuProfiler::ResetProfiles() { |
| 428 delete profiles_; | 428 delete profiles_; |
| 429 profiles_ = new CpuProfilesCollection(isolate()->heap()); | 429 profiles_ = new CpuProfilesCollection(isolate()->heap()); |
| 430 } | 430 } |
| 431 | 431 |
| 432 void CpuProfiler::CollectSample() { |
| 433 if (processor_ != NULL) { |
| 434 processor_->AddCurrentStack(isolate_); |
| 435 } |
| 436 } |
| 432 | 437 |
| 433 void CpuProfiler::StartProfiling(const char* title, bool record_samples) { | 438 void CpuProfiler::StartProfiling(const char* title, bool record_samples) { |
| 434 if (profiles_->StartProfiling(title, record_samples)) { | 439 if (profiles_->StartProfiling(title, record_samples)) { |
| 435 StartProcessorIfNotStarted(); | 440 StartProcessorIfNotStarted(); |
| 436 } | 441 } |
| 437 } | 442 } |
| 438 | 443 |
| 439 | 444 |
| 440 void CpuProfiler::StartProfiling(String* title, bool record_samples) { | 445 void CpuProfiler::StartProfiling(String* title, bool record_samples) { |
| 441 StartProfiling(profiles_->GetName(title), record_samples); | 446 StartProfiling(profiles_->GetName(title), record_samples); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 521 Builtins::Name id = static_cast<Builtins::Name>(i); | 526 Builtins::Name id = static_cast<Builtins::Name>(i); |
| 522 rec->start = builtins->builtin(id)->address(); | 527 rec->start = builtins->builtin(id)->address(); |
| 523 rec->builtin_id = id; | 528 rec->builtin_id = id; |
| 524 processor_->Enqueue(evt_rec); | 529 processor_->Enqueue(evt_rec); |
| 525 } | 530 } |
| 526 } | 531 } |
| 527 | 532 |
| 528 | 533 |
| 529 } // namespace internal | 534 } // namespace internal |
| 530 } // namespace v8 | 535 } // namespace v8 |
| OLD | NEW |