Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: content/browser/power_profiler/power_profiler_service.cc

Issue 140583003: Chrome power profiler service (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/public/browser/power_profiler_service.h"
6
7 #include "base/bind.h"
8 #include "base/message_loop/message_loop.h"
9 #include "base/threading/sequenced_worker_pool.h"
10 #include "content/public/browser/browser_thread.h"
11
12 namespace content {
13
14 PowerProfilerService::PowerProfilerService()
15 : status_(UNINITIALIZED)
16 , data_provider_(PowerDataProviderFactory::Create()) {
17 if (data_provider_.get()) {
18 status_ = INITIALIZED;
19 InitializeDelays();
20 task_runner_ = BrowserThread::GetBlockingPool()->GetSequencedTaskRunner(
21 BrowserThread::GetBlockingPool()->GetSequenceToken());
22 }
23 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
24 }
25
26 bool PowerProfilerService::IsAvailable() {
27 return status_ != UNINITIALIZED;
28 }
29
30 void PowerProfilerService::InitializeDelays() {
31 delays_[PowerProfilerObserver::LOW] = base::TimeDelta::FromMilliseconds(4000);
32 delays_[PowerProfilerObserver::NORMAL]
33 = base::TimeDelta::FromMilliseconds(200);
34 delays_[PowerProfilerObserver::HIGH] = base::TimeDelta::FromMilliseconds(50);
35 }
36
37 PowerProfilerService* PowerProfilerService::GetInstance() {
38 return Singleton<PowerProfilerService>::get();
39 }
40
41 bool PowerProfilerService::AddObserver(PowerProfilerObserver* obs) {
qsr 2014/01/23 12:50:06 I don't think you need a return value here. If som
Pan 2014/01/25 09:35:53 Done.
42 if (UNINITIALIZED == status_)
43 return false;
44
45 observers_.AddObserver(obs);
46 UpdateResolution();
47 if (PROFILING != status_)
48 Start();
49
50 return true;
51 }
52
53 void PowerProfilerService::RemoveObserver(PowerProfilerObserver* obs) {
54 observers_.RemoveObserver(obs);
55 UpdateResolution();
56 if (!observers_.might_have_observers())
57 Stop();
58 }
59
60 void PowerProfilerService::UpdateResolution() {
61 if (UNINITIALIZED == status_)
62 return;
63
64 PowerProfilerObserver::Resolution resolution = PowerProfilerObserver::LOW;
65 FOR_EACH_OBSERVER(PowerProfilerObserver, observers_,
66 GetHigherResolution(resolution));
qsr 2014/01/23 12:50:06 I don't really like that each observer needs to im
Pan 2014/01/25 09:35:53 Done.
67
68 // if delay_ will be reset, reschedule the timer immediately
69 if (delay_ != delays_[resolution]) {
70 delay_ = delays_[resolution];
71
72 if (query_power_timer_.IsRunning())
qsr 2014/01/23 12:50:06 You might want to check on your status, instead of
Pan 2014/01/25 09:35:53 Done.
73 query_power_timer_.Start(FROM_HERE,
74 delay_, this, &PowerProfilerService::OnTimer);
75 }
76 }
77
78 void PowerProfilerService::Start() {
79 DCHECK (!query_power_timer_.IsRunning());
qsr 2014/01/23 12:50:06 Maybe also check for your status.
Pan 2014/01/25 09:35:53 Done.
80 status_ = PROFILING;
81
82 // send out power events immediately.
83 task_runner_->PostTask(
84 FROM_HERE,
85 base::Bind(&PowerProfilerService::ProcessData, base::Unretained(this)));
86
87 query_power_timer_.Start(FROM_HERE,
88 delay_, this, &PowerProfilerService::OnTimer);
89 }
90
91 void PowerProfilerService::Stop() {
92 // stop timer, set status to INITIALIZED
93 if (PROFILING == status_) {
qsr 2014/01/23 12:50:06 Why is that a test instead of a DCHECK? Are you ex
Pan 2014/01/25 09:35:53 Done.
94 query_power_timer_.Stop();
95 status_ = INITIALIZED;
96 }
97 }
98
99 void PowerProfilerService::OnTimer() {
100 task_runner_->PostTask(
101 FROM_HERE,
102 base::Bind(&PowerProfilerService::ProcessData, base::Unretained(this)));
103 }
104
105 void PowerProfilerService::Notify(const PowerEvent& event) {
106 FOR_EACH_OBSERVER(PowerProfilerObserver, observers_, OnPowerEvent(event));
107 }
108
109 void PowerProfilerService::ProcessData() {
qsr 2014/01/23 12:50:06 you could DCHECK that you are on your task_runner
Pan 2014/01/25 09:35:53 Done.
110 if (PROFILING != status_)
111 return;
112
113 // Get Data and Notify
114 PowerEvent event;
115 if(data_provider_->GetData(&event))
116 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
117 &PowerProfilerService::Notify, base::Unretained(this), event));
118 }
119
120 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698