1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/power_save_blocker.h"
6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Accessed only from the UI thread.
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint PowerSaveBlocker::blocker_count_ = 0;
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochPowerSaveBlocker::PowerSaveBlocker(bool enable) : enabled_(false) {
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (enable)
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Enable();
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochPowerSaveBlocker::~PowerSaveBlocker(void) {
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Disable();
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PowerSaveBlocker::Enable() {
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (enabled_)
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enabled_ = true;
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PostAdjustBlockCount(1);
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PowerSaveBlocker::Disable() {
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!enabled_)
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enabled_ = false;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PostAdjustBlockCount(-1);
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PowerSaveBlocker::PostAdjustBlockCount(int delta) {
38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(
39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      BrowserThread::UI, FROM_HERE,
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewRunnableFunction(&PowerSaveBlocker::AdjustBlockCount, delta));
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Called only from UI thread.
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PowerSaveBlocker::AdjustBlockCount(int delta) {
45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool was_blocking = (blocker_count_ != 0);
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  blocker_count_ += delta;
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_blocking = (blocker_count_ != 0);
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK_GE(blocker_count_, 0);
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (is_blocking != was_blocking)
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ApplyBlock(is_blocking);
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
58