1 /*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "metrics/timer.h"
18
19 #include <string>
20
21 #include "metrics/metrics_library.h"
22
23 namespace chromeos_metrics {
24
GetCurrentTime() const25 base::TimeTicks ClockWrapper::GetCurrentTime() const {
26 return base::TimeTicks::Now();
27 }
28
Timer()29 Timer::Timer()
30 : timer_state_(kTimerStopped),
31 clock_wrapper_(new ClockWrapper()) {}
32
Start()33 bool Timer::Start() {
34 elapsed_time_ = base::TimeDelta(); // Sets elapsed_time_ to zero.
35 start_time_ = clock_wrapper_->GetCurrentTime();
36 timer_state_ = kTimerRunning;
37 return true;
38 }
39
Stop()40 bool Timer::Stop() {
41 if (timer_state_ == kTimerStopped)
42 return false;
43 if (timer_state_ == kTimerRunning)
44 elapsed_time_ += clock_wrapper_->GetCurrentTime() - start_time_;
45 timer_state_ = kTimerStopped;
46 return true;
47 }
48
Pause()49 bool Timer::Pause() {
50 switch (timer_state_) {
51 case kTimerStopped:
52 if (!Start())
53 return false;
54 timer_state_ = kTimerPaused;
55 return true;
56 case kTimerRunning:
57 timer_state_ = kTimerPaused;
58 elapsed_time_ += clock_wrapper_->GetCurrentTime() - start_time_;
59 return true;
60 default:
61 return false;
62 }
63 }
64
Resume()65 bool Timer::Resume() {
66 switch (timer_state_) {
67 case kTimerStopped:
68 return Start();
69 case kTimerPaused:
70 start_time_ = clock_wrapper_->GetCurrentTime();
71 timer_state_ = kTimerRunning;
72 return true;
73 default:
74 return false;
75 }
76 }
77
Reset()78 bool Timer::Reset() {
79 elapsed_time_ = base::TimeDelta(); // Sets elapsed_time_ to zero.
80 timer_state_ = kTimerStopped;
81 return true;
82 }
83
HasStarted() const84 bool Timer::HasStarted() const {
85 return timer_state_ != kTimerStopped;
86 }
87
GetElapsedTime(base::TimeDelta * elapsed_time) const88 bool Timer::GetElapsedTime(base::TimeDelta* elapsed_time) const {
89 if (start_time_.is_null() || !elapsed_time)
90 return false;
91 *elapsed_time = elapsed_time_;
92 if (timer_state_ == kTimerRunning) {
93 *elapsed_time += clock_wrapper_->GetCurrentTime() - start_time_;
94 }
95 return true;
96 }
97
98 // static
99 MetricsLibraryInterface* TimerReporter::metrics_lib_ = nullptr;
100
TimerReporter(const std::string & histogram_name,int min,int max,int num_buckets)101 TimerReporter::TimerReporter(const std::string& histogram_name, int min,
102 int max, int num_buckets)
103 : histogram_name_(histogram_name),
104 min_(min),
105 max_(max),
106 num_buckets_(num_buckets) {}
107
ReportMilliseconds() const108 bool TimerReporter::ReportMilliseconds() const {
109 base::TimeDelta elapsed_time;
110 if (!metrics_lib_ || !GetElapsedTime(&elapsed_time)) return false;
111 return metrics_lib_->SendToUMA(histogram_name_,
112 elapsed_time.InMilliseconds(),
113 min_,
114 max_,
115 num_buckets_);
116 }
117
118 } // namespace chromeos_metrics
119