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