| Index: chromeos/dbus/shill_service_client.cc
|
| diff --git a/chromeos/dbus/shill_service_client.cc b/chromeos/dbus/shill_service_client.cc
|
| index 40143f66caf2e011a4c7f9742f4b141ec375d670..faaf75ac553827f821947833a6deb2da1439e968 100644
|
| --- a/chromeos/dbus/shill_service_client.cc
|
| +++ b/chromeos/dbus/shill_service_client.cc
|
| @@ -5,11 +5,13 @@
|
| #include "chromeos/dbus/shill_service_client.h"
|
|
|
| #include "base/bind.h"
|
| +#include "base/memory/weak_ptr.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/stl_util.h"
|
| #include "base/values.h"
|
| #include "chromeos/dbus/shill_property_changed_observer.h"
|
| #include "chromeos/dbus/shill_service_client_stub.h"
|
| +#include "chromeos/network/network_event_log.h"
|
| #include "dbus/bus.h"
|
| #include "dbus/message.h"
|
| #include "dbus/object_proxy.h"
|
| @@ -54,7 +56,18 @@ class ShillServiceClientImpl : public ShillServiceClient {
|
| public:
|
| explicit ShillServiceClientImpl()
|
| : bus_(NULL),
|
| - helpers_deleter_(&helpers_) {
|
| + weak_ptr_factory_(this) {
|
| + }
|
| +
|
| + virtual ~ShillServiceClientImpl() {
|
| + for (HelperMap::iterator iter = helpers_.begin();
|
| + iter != helpers_.end(); ++iter) {
|
| + ShillClientHelper* helper = iter->second;
|
| + bus_->RemoveObjectProxy(shill::kFlimflamServiceName,
|
| + helper->object_proxy()->object_path(),
|
| + base::Bind(&base::DoNothing));
|
| + delete helper;
|
| + }
|
| }
|
|
|
| virtual void AddPropertyChangedObserver(
|
| @@ -222,17 +235,33 @@ class ShillServiceClientImpl : public ShillServiceClient {
|
| return it->second;
|
|
|
| // There is no helper for the profile, create it.
|
| + NET_LOG_DEBUG("AddShillClientHelper", service_path.value());
|
| dbus::ObjectProxy* object_proxy =
|
| bus_->GetObjectProxy(shill::kFlimflamServiceName, service_path);
|
| - ShillClientHelper* helper = new ShillClientHelper(bus_, object_proxy);
|
| + ShillClientHelper* helper = new ShillClientHelper(object_proxy);
|
| + helper->SetReleasedCallback(
|
| + base::Bind(&ShillServiceClientImpl::NotifyReleased,
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| helper->MonitorPropertyChanged(shill::kFlimflamServiceInterface);
|
| helpers_.insert(HelperMap::value_type(service_path.value(), helper));
|
| return helper;
|
| }
|
|
|
| + void NotifyReleased(ShillClientHelper* helper) {
|
| + // New Shill Service DBus objects are created relatively frequently, so
|
| + // remove them when they become inactive (no observers and no active method
|
| + // calls).
|
| + const dbus::ObjectPath& object_path = helper->object_proxy()->object_path();
|
| + NET_LOG_DEBUG("RemoveShillClientHelper", object_path.value());
|
| + bus_->RemoveObjectProxy(shill::kFlimflamServiceName,
|
| + object_path, base::Bind(&base::DoNothing));
|
| + helpers_.erase(object_path.value());
|
| + delete helper;
|
| + }
|
| +
|
| dbus::Bus* bus_;
|
| HelperMap helpers_;
|
| - STLValueDeleter<HelperMap> helpers_deleter_;
|
| + base::WeakPtrFactory<ShillServiceClientImpl> weak_ptr_factory_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(ShillServiceClientImpl);
|
| };
|
|
|