Reviewers: loislo, Benedikt Meurer,
Description:
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.
This is a modified version of r16549 whith a fix for test flakiness. The
test
flakiness introduced by the previous version of this changed was fixed by
changing return type of ProfilerEventsProcessor::ProcessOneSample from bool
to
enum with 3 options. In the main profiling loop we decide that the next code
event should be processed when sample with a greater ordinal number is
encountered. When processing remaining samples we shouldn't wait for more
samples and if the samples queue is empty we just process next code event.
BUG=v8:2814,v8:2871
Please review this at https://codereview.chromium.org/23455036/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+42, -34 lines):
M src/cpu-profiler.h
M src/cpu-profiler.cc
Index: src/cpu-profiler.cc
diff --git a/src/cpu-profiler.cc b/src/cpu-profiler.cc
index
6e93b647879bde263ce18d0457ddab92d39e0547..74e0d820acbe8bc1367221ff0c932ef04826aeea
100644
--- a/src/cpu-profiler.cc
+++ b/src/cpu-profiler.cc
@@ -103,50 +103,54 @@ bool ProfilerEventsProcessor::ProcessCodeEvent() {
return false;
}
-
-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_.Peek();
- 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_.Remove();
+ProfilerEventsProcessor::SampleProcessingResult
+ 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 OneSampleProcessed;
}
-}
-
-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();
- }
+ const TickSampleEventRecord* record = ticks_buffer_.Peek();
+ if (record == NULL) {
+ if (ticks_from_vm_buffer_.IsEmpty()) return NoSamplesInQueue;
+ return FoundSampleForNextCodeEvent;
+ }
+ if (record->order != last_processed_code_event_id_) {
+ return FoundSampleForNextCodeEvent;
}
- // Schedule next sample. sampler_ is NULL in tests.
- if (sampler_) sampler_->DoSample();
+ generator_->RecordTickSample(record->sample);
+ ticks_buffer_.Remove();
+ return OneSampleProcessed;
}
void ProfilerEventsProcessor::Run() {
while (running_) {
- ProcessEventsAndDoSample();
+ ElapsedTimer timer;
+ timer.Start();
+ // Keep processing existing events until we need to do next sample.
+ do {
+ if (FoundSampleForNextCodeEvent == 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();
+ SampleProcessingResult result;
+ do {
+ result = ProcessOneSample();
+ } while (result == OneSampleProcessed);
} while (ProcessCodeEvent());
}
Index: src/cpu-profiler.h
diff --git a/src/cpu-profiler.h b/src/cpu-profiler.h
index
e36c3016bed163e1737d0650e48b36b048c44b10..8aba5426d5a53d62fde790d30a45a1f51f463b01
100644
--- a/src/cpu-profiler.h
+++ b/src/cpu-profiler.h
@@ -161,9 +161,13 @@ class ProfilerEventsProcessor : public Thread {
private:
// Called from events processing thread (Run() method.)
bool ProcessCodeEvent();
- bool ProcessTicks();
- void ProcessEventsAndDoSample();
+ enum SampleProcessingResult {
+ OneSampleProcessed,
+ FoundSampleForNextCodeEvent,
+ NoSamplesInQueue
+ };
+ SampleProcessingResult 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.