Revision: 16548
Author: [email protected]
Date: Thu Sep 5 10:28:57 2013 UTC
Log: Check if timeout has expired after processing each sample
To avoid long intervals between taking samples due to processing all
accumulated samples at once, the samples are processed one by one and we
check if the sampling interval has elapsed after each step rather than
after processing all the samples in the queue.
BUG=v8:2814
[email protected], [email protected]
Review URL: https://codereview.chromium.org/23583036
http://code.google.com/p/v8/source/detail?r=16548
Modified:
/branches/bleeding_edge/src/cpu-profiler.cc
/branches/bleeding_edge/src/cpu-profiler.h
=======================================
--- /branches/bleeding_edge/src/cpu-profiler.cc Wed Sep 4 11:55:28 2013 UTC
+++ /branches/bleeding_edge/src/cpu-profiler.cc Thu Sep 5 10:28:57 2013 UTC
@@ -104,49 +104,45 @@
}
-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_.StartDequeue();
+ if (record == NULL) return true;
+ if (record->order != last_processed_code_event_id_) return true;
+ generator_->RecordTickSample(record->sample);
+ ticks_buffer_.FinishDequeue();
+ 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());
}
=======================================
--- /branches/bleeding_edge/src/cpu-profiler.h Wed Sep 4 11:55:28 2013 UTC
+++ /branches/bleeding_edge/src/cpu-profiler.h Thu Sep 5 10:28:57 2013 UTC
@@ -161,9 +161,7 @@
private:
// Called from events processing thread (Run() method.)
bool ProcessCodeEvent();
- bool ProcessTicks();
-
- void ProcessEventsAndDoSample();
+ bool ProcessOneSample();
ProfileGenerator* generator_;
Sampler* sampler_;
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.