Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2760)

Unified Diff: base/system_monitor/system_monitor.cc

Issue 10917166: Extend the capability of SystemMonitor to support watching storage free space change (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Update and add unit test Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/system_monitor/system_monitor.h ('k') | base/system_monitor/system_monitor_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/system_monitor/system_monitor.cc
diff --git a/base/system_monitor/system_monitor.cc b/base/system_monitor/system_monitor.cc
index 2616275dfbc64db88abaa6abb0fa85e8cf561a7d..c71d70eec889c9a72052a3a436d8c2021305b780 100644
--- a/base/system_monitor/system_monitor.cc
+++ b/base/system_monitor/system_monitor.cc
@@ -34,12 +34,13 @@ SystemMonitor::RemovableStorageInfo::RemovableStorageInfo(
location(device_location) {
}
-SystemMonitor::SystemMonitor()
+SystemMonitor::SystemMonitor(StorageFreeSpaceDelegate* delegate)
: power_observer_list_(new ObserverListThreadSafe<PowerObserver>()),
devices_changed_observer_list_(
new ObserverListThreadSafe<DevicesChangedObserver>()),
battery_in_use_(false),
- suspended_(false) {
+ suspended_(false),
+ free_space_delegate_(delegate) {
DCHECK(!g_system_monitor);
g_system_monitor = this;
@@ -127,6 +128,40 @@ void SystemMonitor::ProcessRemovableStorageDetached(const std::string& id) {
NotifyRemovableStorageDetached(id);
}
+void SystemMonitor::ProcessStorageFreeSpaceChanged(const FilePath& path,
+ int64 available_capacity) {
+ DVLOG(1) << "Free Space Change: " << path.value() << " "
+ << available_capacity << " bytes";
+ scoped_refptr<StorageFreeSpaceObserverList> observers;
+ {
+ base::AutoLock lock(free_space_observers_lock_);
+ StorageFreeSpaceObserverListMap::iterator it =
+ free_space_observer_list_map_.find(path);
+ if (it == free_space_observer_list_map_.end())
+ return;
+ observers = it->second.observer_list;
+ }
+ if (observers.get())
+ observers->Notify(&StorageFreeSpaceObserver::OnFreeSpaceChanged,
+ path, available_capacity);
+}
+
+void SystemMonitor::ProcessStorageFreeSpaceChangeError(const FilePath& path) {
+ DVLOG(1) << "Failed to watch free space change for " << path.value();
+ scoped_refptr<StorageFreeSpaceObserverList> observers;
+ {
+ base::AutoLock lock(free_space_observers_lock_);
+ StorageFreeSpaceObserverListMap::iterator it =
+ free_space_observer_list_map_.find(path);
+ if (it == free_space_observer_list_map_.end())
+ return;
+ observers = it->second.observer_list;
+ }
+ if (observers.get())
+ observers->Notify(&StorageFreeSpaceObserver::OnFreeSpaceChangeError,
+ path);
+}
+
std::vector<SystemMonitor::RemovableStorageInfo>
SystemMonitor::GetAttachedRemovableStorage() const {
std::vector<RemovableStorageInfo> results;
@@ -156,6 +191,65 @@ void SystemMonitor::RemoveDevicesChangedObserver(DevicesChangedObserver* obs) {
devices_changed_observer_list_->RemoveObserver(obs);
}
+void SystemMonitor::AddStorageFreeSpaceObserver(const FilePath& path,
+ StorageFreeSpaceObserver* obs) {
+ DCHECK(free_space_delegate_ != NULL);
+ if (!free_space_delegate_)
+ return;
+ scoped_refptr<StorageFreeSpaceObserverList> observers;
+ {
+ base::AutoLock lock(free_space_observers_lock_);
+ // Try to start watching the given storage |path| if the first observer
+ // will be added.
+ StorageFreeSpaceObserverListMap::iterator iter =
+ free_space_observer_list_map_.find(path);
+ if (iter == free_space_observer_list_map_.end()) {
+ PathObserverPair pair;
+ pair.observer_list = observers = new StorageFreeSpaceObserverList;
+ pair.observer_set.insert(obs);
+ free_space_observer_list_map_.insert(std::make_pair(path, pair));
+ free_space_delegate_->StartWatchingStorage(path);
+ } else {
+ observers = iter->second.observer_list;
+ iter->second.observer_set.insert(obs);
+ }
+ }
+ observers->AddObserver(obs);
+}
+
+void SystemMonitor::RemoveStorageFreeSpaceObserver(
+ const FilePath& path,
+ StorageFreeSpaceObserver* obs) {
+ DCHECK(free_space_delegate_ != NULL);
+ if (!free_space_delegate_)
+ return;
+ scoped_refptr<StorageFreeSpaceObserverList> observers;
+ {
+ base::AutoLock lock(free_space_observers_lock_);
+ StorageFreeSpaceObserverListMap::iterator iter =
+ free_space_observer_list_map_.find(path);
+ // In case of no observer is interested in the given storage |path|.
+ if (iter == free_space_observer_list_map_.end()) {
+ return;
+ }
+
+ StorageFreeSpaceObserverSet::iterator sit
+ = iter->second.observer_set.find(obs);
+ // No the given observer is found.
+ if (sit == iter->second.observer_set.end())
+ return;
+ iter->second.observer_set.erase(sit);
+ // Try to stop watching in case of the last observer is removed.
+ if (iter->second.observer_set.size() == 0) {
+ free_space_delegate_->StopWatchingStorage(path);
+ free_space_observer_list_map_.erase(path);
+ return;
+ }
+ observers = iter->second.observer_list;
+ }
+ observers->RemoveObserver(obs);
+}
+
void SystemMonitor::NotifyDevicesChanged(DeviceType device_type) {
DVLOG(1) << "DevicesChanged with device type " << device_type;
devices_changed_observer_list_->Notify(
« no previous file with comments | « base/system_monitor/system_monitor.h ('k') | base/system_monitor/system_monitor_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698