Home | History | Annotate | Download | only in power_profiler
      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/browser/power_profiler/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_(PowerDataProvider::Create()) {
     17   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
     18 
     19   // No provider supported for current platform.
     20   if (!data_provider_.get())
     21     return;
     22   sample_period_ = data_provider_->GetSamplingRate();
     23   status_ = INITIALIZED;
     24   task_runner_ = BrowserThread::GetBlockingPool()->GetSequencedTaskRunner(
     25       BrowserThread::GetBlockingPool()->GetSequenceToken());
     26 }
     27 
     28 PowerProfilerService::PowerProfilerService(
     29     scoped_ptr<PowerDataProvider> provider,
     30     scoped_refptr<base::TaskRunner> task_runner,
     31     const base::TimeDelta& sample_period)
     32     : task_runner_(task_runner),
     33       status_(UNINITIALIZED),
     34       sample_period_(sample_period),
     35       data_provider_(provider.Pass()) {
     36   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
     37 
     38   if (data_provider_.get())
     39       status_ = INITIALIZED;
     40 }
     41 
     42 PowerProfilerService::~PowerProfilerService() {
     43 }
     44 
     45 bool PowerProfilerService::IsAvailable() {
     46   return status_ !=  UNINITIALIZED;
     47 }
     48 
     49 PowerProfilerService* PowerProfilerService::GetInstance() {
     50   return Singleton<PowerProfilerService>::get();
     51 }
     52 
     53 void PowerProfilerService::AddObserver(PowerProfilerObserver* observer) {
     54   if (status_ == UNINITIALIZED)
     55     return;
     56 
     57   observers_.AddObserver(observer);
     58   if (status_ != PROFILING)
     59     Start();
     60 }
     61 
     62 void PowerProfilerService::RemoveObserver(PowerProfilerObserver* observer) {
     63   observers_.RemoveObserver(observer);
     64 
     65   if (status_ == PROFILING && !observers_.might_have_observers())
     66     Stop();
     67 }
     68 
     69 void PowerProfilerService::Start() {
     70   DCHECK(status_ == INITIALIZED);
     71   status_ = PROFILING;
     72 
     73   // Send out power events immediately.
     74   QueryData();
     75 
     76   query_power_timer_.Start(FROM_HERE,
     77       sample_period_, this, &PowerProfilerService::QueryData);
     78 }
     79 
     80 void PowerProfilerService::Stop() {
     81   DCHECK(status_ == PROFILING);
     82 
     83   query_power_timer_.Stop();
     84   status_ = INITIALIZED;
     85 }
     86 
     87 void PowerProfilerService::QueryData() {
     88   task_runner_->PostTask(
     89       FROM_HERE, base::Bind(&PowerProfilerService::QueryDataOnTaskRunner,
     90                             base::Unretained(this)));
     91 }
     92 
     93 void PowerProfilerService::Notify(const PowerEventVector& events) {
     94   FOR_EACH_OBSERVER(PowerProfilerObserver, observers_, OnPowerEvent(events));
     95 }
     96 
     97 void PowerProfilerService::QueryDataOnTaskRunner() {
     98   DCHECK(task_runner_->RunsTasksOnCurrentThread());
     99   DCHECK(status_ == PROFILING);
    100 
    101   // Get data and notify.
    102   PowerEventVector events = data_provider_->GetData();
    103   if (events.size() != 0) {
    104     BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
    105         &PowerProfilerService::Notify, base::Unretained(this), events));
    106   }
    107 }
    108 
    109 }  // namespace content
    110