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