OLD | NEW |
---|---|
(Empty) | |
1 #include "platform/scheduler/renderer/renderer_load_tracker.h" | |
2 | |
3 namespace blink { | |
4 namespace scheduler { | |
5 | |
6 namespace { | |
7 | |
8 const int kLoadReportingIntervalInMilliseconds = 1000; | |
9 const int kWaitingPeriodBeforeReportingInSeconds = 10; | |
10 | |
11 } // namespace | |
12 | |
13 RendererLoadTracker::RendererLoadTracker(base::TimeTicks now, | |
14 const Callback& callback) | |
15 : current_time_(now), | |
16 next_reporting_time_(now), | |
17 active_(true), | |
18 last_status_change_time_(now), | |
19 waiting_period_( | |
20 base::TimeDelta::FromSeconds(kWaitingPeriodBeforeReportingInSeconds)), | |
21 reporting_interval_(base::TimeDelta::FromMilliseconds( | |
22 kLoadReportingIntervalInMilliseconds)), | |
23 callback_(callback) {} | |
24 | |
25 RendererLoadTracker::~RendererLoadTracker() {} | |
26 | |
27 void RendererLoadTracker::Pause(base::TimeTicks now) { | |
28 Advance(now, true, false); | |
29 active_ = false; | |
30 last_status_change_time_ = now; | |
31 } | |
32 | |
33 void RendererLoadTracker::Resume(base::TimeTicks now) { | |
34 Advance(now, false, false); | |
35 active_ = true; | |
36 last_status_change_time_ = now; | |
37 } | |
38 | |
39 void RendererLoadTracker::RecordTaskTime(base::TimeTicks start_time, | |
40 base::TimeTicks end_time) { | |
41 start_time = std::max(last_status_change_time_, start_time); | |
42 end_time = std::max(last_status_change_time_, end_time); | |
43 | |
44 Advance(start_time, active_, false); | |
45 Advance(end_time, active_, true); | |
46 } | |
47 | |
48 void RendererLoadTracker::RecordIdle(base::TimeTicks now) { | |
49 Advance(now, active_, false); | |
50 } | |
51 | |
52 void RendererLoadTracker::Advance(base::TimeTicks now, | |
53 bool is_active, | |
Sami
2016/08/22 14:33:16
nit: The call sites would be a bit easier to read
altimin
2016/08/22 15:36:23
Done.
| |
54 bool is_task_running) { | |
55 if (current_time_ > now) { | |
56 return; | |
57 } | |
58 | |
59 while (true) { | |
60 base::TimeTicks next_current_time = std::min(next_reporting_time_, now); | |
61 | |
62 base::TimeDelta delta = next_current_time - current_time_; | |
63 | |
64 if (is_active) { | |
65 total_time_ += delta; | |
66 if (is_task_running) { | |
67 total_runtime_ += delta; | |
68 } | |
69 } | |
70 current_time_ = next_current_time; | |
71 | |
72 if (current_time_ == next_reporting_time_) { | |
73 if (is_active && total_time_ >= waiting_period_) { | |
74 callback_.Run(current_time_, Load()); | |
75 } | |
76 next_reporting_time_ += reporting_interval_; | |
77 } else { | |
78 break; | |
79 } | |
80 } | |
81 } | |
82 | |
83 double RendererLoadTracker::Load() { | |
84 if (total_time_.is_zero()) { | |
85 return 0; | |
86 } | |
87 return total_runtime_.InSecondsF() / total_time_.InSecondsF(); | |
88 } | |
89 | |
90 } // namespace scheduler | |
91 } // namespace blink | |
OLD | NEW |