• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2009 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 "chrome/browser/power_save_blocker.h"
6 #include "content/browser/browser_thread.h"
7 
8 // Accessed only from the UI thread.
9 int PowerSaveBlocker::blocker_count_ = 0;
10 
PowerSaveBlocker(bool enable)11 PowerSaveBlocker::PowerSaveBlocker(bool enable) : enabled_(false) {
12   if (enable)
13     Enable();
14 }
15 
~PowerSaveBlocker(void)16 PowerSaveBlocker::~PowerSaveBlocker(void) {
17   Disable();
18 }
19 
Enable()20 void PowerSaveBlocker::Enable() {
21   if (enabled_)
22     return;
23 
24   enabled_ = true;
25   PostAdjustBlockCount(1);
26 }
27 
Disable()28 void PowerSaveBlocker::Disable() {
29   if (!enabled_)
30     return;
31 
32   enabled_ = false;
33   PostAdjustBlockCount(-1);
34 }
35 
36 
PostAdjustBlockCount(int delta)37 void PowerSaveBlocker::PostAdjustBlockCount(int delta) {
38   BrowserThread::PostTask(
39       BrowserThread::UI, FROM_HERE,
40       NewRunnableFunction(&PowerSaveBlocker::AdjustBlockCount, delta));
41 }
42 
43 // Called only from UI thread.
AdjustBlockCount(int delta)44 void PowerSaveBlocker::AdjustBlockCount(int delta) {
45   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
46 
47   bool was_blocking = (blocker_count_ != 0);
48 
49   blocker_count_ += delta;
50 
51   bool is_blocking = (blocker_count_ != 0);
52 
53   DCHECK_GE(blocker_count_, 0);
54 
55   if (is_blocking != was_blocking)
56     ApplyBlock(is_blocking);
57 }
58