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()); |
} |