Chromium Code Reviews| Index: device/battery/battery_status_manager_linux.cc |
| diff --git a/device/battery/battery_status_manager_linux.cc b/device/battery/battery_status_manager_linux.cc |
| index 7d9469ec29789b2c257a8ac43fc8a0559a7962cf..0ec4398c86a93324710f4c27646ffd2b6157c9cb 100644 |
| --- a/device/battery/battery_status_manager_linux.cc |
| +++ b/device/battery/battery_status_manager_linux.cc |
| @@ -13,6 +13,7 @@ |
| #include <utility> |
| #include <vector> |
| +#include "base/auto_reset.h" |
| #include "base/macros.h" |
| #include "base/metrics/histogram_macros.h" |
| #include "base/single_thread_task_runner.h" |
| @@ -61,7 +62,7 @@ base::Version UPowerProperties::daemon_version() { |
| class UPowerObject { |
| public: |
| - typedef dbus::PropertySet::PropertyChangedCallback PropertyChangedCallback; |
| + using PropertyChangedCallback = dbus::PropertySet::PropertyChangedCallback; |
| UPowerObject(dbus::Bus* dbus, |
| const PropertyChangedCallback property_changed_callback); |
| @@ -225,7 +226,7 @@ uint32_t BatteryProperties::type(uint32_t default_value) { |
| class BatteryObject { |
| public: |
| - typedef dbus::PropertySet::PropertyChangedCallback PropertyChangedCallback; |
| + using PropertyChangedCallback = dbus::PropertySet::PropertyChangedCallback; |
| BatteryObject(dbus::Bus* dbus, |
| const dbus::ObjectPath& device_path, |
| @@ -334,8 +335,8 @@ class BatteryStatusManagerLinux::BatteryStatusNotificationThread |
| if (!system_bus_) |
| InitDBus(); |
| - upower_.reset(new UPowerObject(system_bus_.get(), |
| - UPowerObject::PropertyChangedCallback())); |
| + upower_ = base::MakeUnique<UPowerObject>( |
| + system_bus_.get(), UPowerObject::PropertyChangedCallback()); |
| upower_->proxy()->ConnectToSignal( |
| kUPowerServiceName, kUPowerSignalDeviceAdded, |
| base::Bind(&BatteryStatusNotificationThread::DeviceAdded, |
| @@ -397,14 +398,14 @@ class BatteryStatusManagerLinux::BatteryStatusNotificationThread |
| [¤t, this](const dbus::ObjectPath& device_path) { |
| if (current && current->proxy()->object_path() == device_path) |
| return std::move(current); |
| - else |
| - return CreateBattery(device_path); |
| + return CreateBattery(device_path); |
| }; |
| - dbus::ObjectPath display_device_path = upower_->GetDisplayDevice(); |
| + dbus::ObjectPath display_device_path; |
| + if (!IsDaemonVersionBelow_0_99()) |
| + display_device_path = upower_->GetDisplayDevice(); |
| if (display_device_path.IsValid()) { |
| - std::unique_ptr<BatteryObject> battery = |
| - UseCurrentOrCreateBattery(display_device_path); |
| + auto battery = UseCurrentOrCreateBattery(display_device_path); |
| if (battery->IsValid()) |
| battery_ = std::move(battery); |
| } |
| @@ -412,9 +413,7 @@ class BatteryStatusManagerLinux::BatteryStatusNotificationThread |
| if (!battery_) { |
| int num_batteries = 0; |
| for (const auto& device_path : upower_->EnumerateDevices()) { |
| - std::unique_ptr<BatteryObject> battery = |
| - UseCurrentOrCreateBattery(device_path); |
| - |
| + auto battery = UseCurrentOrCreateBattery(device_path); |
| if (!battery->IsValid()) |
| continue; |
| @@ -433,14 +432,14 @@ class BatteryStatusManagerLinux::BatteryStatusNotificationThread |
| UpdateNumberBatteriesHistogram(num_batteries); |
| } |
| - if (battery_) { |
| - battery_->properties()->ConnectSignals(); |
| - NotifyBatteryStatus(); |
| - } else { |
| + if (!battery_) { |
| callback_.Run(BatteryStatus()); |
| return; |
| } |
| + battery_->properties()->ConnectSignals(); |
| + NotifyBatteryStatus(); |
| + |
| if (IsDaemonVersionBelow_0_99()) { |
| // UPower Version 0.99 replaced the Changed signal with the |
| // PropertyChanged signal. For older versions we need to listen |
| @@ -476,11 +475,10 @@ class BatteryStatusManagerLinux::BatteryStatusNotificationThread |
| std::unique_ptr<BatteryObject> CreateBattery( |
| const dbus::ObjectPath& device_path) { |
| - std::unique_ptr<BatteryObject> battery(new BatteryObject( |
| + return base::MakeUnique<BatteryObject>( |
| system_bus_.get(), device_path, |
| base::Bind(&BatteryStatusNotificationThread::BatteryPropertyChanged, |
| - base::Unretained(this)))); |
| - return battery; |
| + base::Unretained(this))); |
| } |
| void DeviceAdded(dbus::Signal* signal /* unused */) { |
| @@ -545,9 +543,9 @@ class BatteryStatusManagerLinux::BatteryStatusNotificationThread |
| // the new property-value triggers a callback to BatteryPropertyChanged(). |
| // notifying_battery_status_ is set to avoid recursion and computing the |
| // status too often. |
| - notifying_battery_status_ = true; |
| + base::AutoReset<bool> notifying_battery_status(¬ifying_battery_status_, |
| + true); |
|
timvolodine
2017/04/10 12:50:58
nit: not sure if this is actually cleaner than the
Lei Zhang
2017/04/10 18:14:47
You are right. It could have potentially started o
|
| callback_.Run(ComputeWebBatteryStatus(battery_->properties())); |
| - notifying_battery_status_ = false; |
| } |
| BatteryStatusService::BatteryUpdateCallback callback_; |
| @@ -589,13 +587,14 @@ bool BatteryStatusManagerLinux::StartNotifierThreadIfNecessary() { |
| return true; |
| base::Thread::Options thread_options(base::MessageLoop::TYPE_IO, 0); |
| - notifier_thread_.reset(new BatteryStatusNotificationThread(callback_)); |
| - if (!notifier_thread_->StartWithOptions(thread_options)) { |
| - notifier_thread_.reset(); |
| + auto notifier_thread = |
| + base::MakeUnique<BatteryStatusNotificationThread>(callback_); |
| + if (!notifier_thread->StartWithOptions(thread_options)) { |
| LOG(ERROR) << "Could not start the " << kBatteryNotifierThreadName |
| << " thread"; |
| return false; |
| } |
| + notifier_thread_ = std::move(notifier_thread); |
| return true; |
| } |
| @@ -608,20 +607,17 @@ std::unique_ptr<BatteryStatusManagerLinux> |
| BatteryStatusManagerLinux::CreateForTesting( |
| const BatteryStatusService::BatteryUpdateCallback& callback, |
| dbus::Bus* bus) { |
| - std::unique_ptr<BatteryStatusManagerLinux> manager( |
| - new BatteryStatusManagerLinux(callback)); |
| - if (manager->StartNotifierThreadIfNecessary()) |
| - manager->notifier_thread_->SetDBusForTesting(bus); |
| - else |
| - manager.reset(); |
| + auto manager = base::MakeUnique<BatteryStatusManagerLinux>(callback); |
| + if (!manager->StartNotifierThreadIfNecessary()) |
| + return nullptr; |
| + manager->notifier_thread_->SetDBusForTesting(bus); |
| return manager; |
| } |
| // static |
| std::unique_ptr<BatteryStatusManager> BatteryStatusManager::Create( |
| const BatteryStatusService::BatteryUpdateCallback& callback) { |
| - return std::unique_ptr<BatteryStatusManager>( |
| - new BatteryStatusManagerLinux(callback)); |
| + return base::MakeUnique<BatteryStatusManagerLinux>(callback); |
| } |
| } // namespace device |