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