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.
9int PowerSaveBlocker::blocker_count_ = 0;
10
11PowerSaveBlocker::PowerSaveBlocker(bool enable) : enabled_(false) {
12  if (enable)
13    Enable();
14}
15
16PowerSaveBlocker::~PowerSaveBlocker(void) {
17  Disable();
18}
19
20void PowerSaveBlocker::Enable() {
21  if (enabled_)
22    return;
23
24  enabled_ = true;
25  PostAdjustBlockCount(1);
26}
27
28void PowerSaveBlocker::Disable() {
29  if (!enabled_)
30    return;
31
32  enabled_ = false;
33  PostAdjustBlockCount(-1);
34}
35
36
37void 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.
44void 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