| Index: src/cpu-profiler.cc
|
| diff --git a/src/cpu-profiler.cc b/src/cpu-profiler.cc
|
| index 35fe7888646c0e37adcc5944947d3f15feaeabf4..c9a6d084285771d5dfa082dd3bc37270b3452888 100644
|
| --- a/src/cpu-profiler.cc
|
| +++ b/src/cpu-profiler.cc
|
| @@ -104,49 +104,45 @@ bool ProfilerEventsProcessor::ProcessCodeEvent() {
|
| }
|
|
|
|
|
| -bool ProfilerEventsProcessor::ProcessTicks() {
|
| - while (true) {
|
| - while (!ticks_from_vm_buffer_.IsEmpty()
|
| - && ticks_from_vm_buffer_.Peek()->order ==
|
| - last_processed_code_event_id_) {
|
| - TickSampleEventRecord record;
|
| - ticks_from_vm_buffer_.Dequeue(&record);
|
| - generator_->RecordTickSample(record.sample);
|
| - }
|
| -
|
| - const TickSampleEventRecord* record = ticks_buffer_.StartDequeue();
|
| - if (record == NULL) return !ticks_from_vm_buffer_.IsEmpty();
|
| - if (record->order != last_processed_code_event_id_) return true;
|
| - generator_->RecordTickSample(record->sample);
|
| - ticks_buffer_.FinishDequeue();
|
| +bool ProfilerEventsProcessor::ProcessOneSample() {
|
| + if (!ticks_from_vm_buffer_.IsEmpty()
|
| + && ticks_from_vm_buffer_.Peek()->order ==
|
| + last_processed_code_event_id_) {
|
| + TickSampleEventRecord record;
|
| + ticks_from_vm_buffer_.Dequeue(&record);
|
| + generator_->RecordTickSample(record.sample);
|
| + return false;
|
| }
|
| -}
|
| -
|
|
|
| -void ProfilerEventsProcessor::ProcessEventsAndDoSample() {
|
| - ElapsedTimer timer;
|
| - timer.Start();
|
| - // Keep processing existing events until we need to do next sample.
|
| - while (!timer.HasExpired(period_)) {
|
| - if (ProcessTicks()) {
|
| - // All ticks of the current dequeue_order are processed,
|
| - // proceed to the next code event.
|
| - ProcessCodeEvent();
|
| - }
|
| - }
|
| - // Schedule next sample. sampler_ is NULL in tests.
|
| - if (sampler_) sampler_->DoSample();
|
| + const TickSampleEventRecord* record = ticks_buffer_.Peek();
|
| + if (record == NULL) return true;
|
| + if (record->order != last_processed_code_event_id_) return true;
|
| + generator_->RecordTickSample(record->sample);
|
| + ticks_buffer_.Remove();
|
| + return false;
|
| }
|
|
|
|
|
| void ProfilerEventsProcessor::Run() {
|
| while (running_) {
|
| - ProcessEventsAndDoSample();
|
| + ElapsedTimer timer;
|
| + timer.Start();
|
| + // Keep processing existing events until we need to do next sample.
|
| + do {
|
| + if (ProcessOneSample()) {
|
| + // All ticks of the current last_processed_code_event_id_ are
|
| + // processed, proceed to the next code event.
|
| + ProcessCodeEvent();
|
| + }
|
| + } while (!timer.HasExpired(period_));
|
| +
|
| + // Schedule next sample. sampler_ is NULL in tests.
|
| + if (sampler_) sampler_->DoSample();
|
| }
|
|
|
| // Process remaining tick events.
|
| do {
|
| - ProcessTicks();
|
| + while (!ProcessOneSample());
|
| } while (ProcessCodeEvent());
|
| }
|
|
|
|
|