diff options
author | phajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-26 19:48:34 +0000 |
---|---|---|
committer | phajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-26 19:48:34 +0000 |
commit | 097ae5a93a863b604fd6dbd939bed0c2be1afed2 (patch) | |
tree | 61177362b1c1bd2d1b2438acc50ccb2c061b176e /app/system_monitor.h | |
parent | 902c971382790170852fe5b5d22d1b79adb31056 (diff) | |
download | chromium_src-097ae5a93a863b604fd6dbd939bed0c2be1afed2.zip chromium_src-097ae5a93a863b604fd6dbd939bed0c2be1afed2.tar.gz chromium_src-097ae5a93a863b604fd6dbd939bed0c2be1afed2.tar.bz2 |
Make SystemMonitor not a Singleton and move it out of base
SystemMonitor makes an assumption that through its lifetime a MessageLoop exists and stays the same. It is difficult and error-prone to satisfy that when it is a Singleton. It has caused problems in the past.
Additionally, extract HighResoltionTimerManager out of time_win.cc, eliminating yet another Singleton.
TEST=none
BUG=none
Review URL: http://codereview.chromium.org/431008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@33214 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'app/system_monitor.h')
-rw-r--r-- | app/system_monitor.h | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/app/system_monitor.h b/app/system_monitor.h new file mode 100644 index 0000000..abafe4f --- /dev/null +++ b/app/system_monitor.h @@ -0,0 +1,118 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef APP_SYSTEM_MONITOR_H_ +#define APP_SYSTEM_MONITOR_H_ + +#include "build/build_config.h" + +// Windows HiRes timers drain the battery faster so we need to know the battery +// status. This isn't true for other platforms. +#if defined(OS_WIN) +#define ENABLE_BATTERY_MONITORING 1 +#else +#undef ENABLE_BATTERY_MONITORING +#endif // !OS_WIN + +#include "base/observer_list_threadsafe.h" +#if defined(ENABLE_BATTERY_MONITORING) +#include "base/timer.h" +#endif // defined(ENABLE_BATTERY_MONITORING) + +// Class for monitoring various system-related subsystems +// such as power management, network status, etc. +// TODO(mbelshe): Add support beyond just power management. +class SystemMonitor { + public: + // Create SystemMonitor. Only one SystemMonitor instance per application + // is allowed. + SystemMonitor(); + ~SystemMonitor(); + + // Get the application-wide SystemMonitor (if not present, returns NULL). + static SystemMonitor* Get(); + + // + // Power-related APIs + // + + // Is the computer currently on battery power. + // Can be called on any thread. + bool BatteryPower() const { + // Using a lock here is not necessary for just a bool. + return battery_in_use_; + } + + // Normalized list of power events. + enum PowerEvent { + POWER_STATE_EVENT, // The Power status of the system has changed. + SUSPEND_EVENT, // The system is being suspended. + RESUME_EVENT // The system is being resumed. + }; + + // Callbacks will be called on the thread which creates the SystemMonitor. + // During the callback, Add/RemoveObserver will block until the callbacks + // are finished. Observers should implement quick callback functions; if + // lengthy operations are needed, the observer should take care to invoke + // the operation on an appropriate thread. + class PowerObserver { + public: + // Notification of a change in power status of the computer, such + // as from switching between battery and A/C power. + virtual void OnPowerStateChange(bool on_battery_power) {} + + // Notification that the system is suspending. + virtual void OnSuspend() {} + + // Notification that the system is resuming. + virtual void OnResume() {} + }; + + // Add a new observer. + // Can be called from any thread. + // Must not be called from within a notification callback. + void AddObserver(PowerObserver* obs); + + // Remove an existing observer. + // Can be called from any thread. + // Must not be called from within a notification callback. + void RemoveObserver(PowerObserver* obs); + +#if defined(OS_WIN) + // Windows-specific handling of a WM_POWERBROADCAST message. + // Embedders of this API should hook their top-level window + // message loop and forward WM_POWERBROADCAST through this call. + void ProcessWmPowerBroadcastMessage(int event_id); +#endif + + // Cross-platform handling of a power event. + void ProcessPowerMessage(PowerEvent event_id); + + private: + // Platform-specific method to check whether the system is currently + // running on battery power. Returns true if running on batteries, + // false otherwise. + bool IsBatteryPower(); + + // Checks the battery status and notifies observers if the battery + // status has changed. + void BatteryCheck(); + + // Functions to trigger notifications. + void NotifyPowerStateChange(); + void NotifySuspend(); + void NotifyResume(); + + scoped_refptr<ObserverListThreadSafe<PowerObserver> > observer_list_; + bool battery_in_use_; + bool suspended_; + +#if defined(ENABLE_BATTERY_MONITORING) + base::OneShotTimer<SystemMonitor> delayed_battery_check_; +#endif + + DISALLOW_COPY_AND_ASSIGN(SystemMonitor); +}; + +#endif // APP_SYSTEM_MONITOR_H_ |