Chromium Code Reviews| Index: net/android/network_change_notifier_android.cc |
| diff --git a/net/android/network_change_notifier_android.cc b/net/android/network_change_notifier_android.cc |
| index 36ebda679660abfeb2a4a0f8cf79a0f1a559eab3..889fe050ef0af17aa6a552b56010b3838f8db774 100644 |
| --- a/net/android/network_change_notifier_android.cc |
| +++ b/net/android/network_change_notifier_android.cc |
| @@ -59,6 +59,9 @@ |
| #include "net/android/network_change_notifier_android.h" |
| +#include "base/memory/weak_ptr.h" |
| +#include "base/single_thread_task_runner.h" |
| +#include "base/thread_task_runner_handle.h" |
| #include "base/threading/thread.h" |
| #include "net/base/address_tracker_linux.h" |
| #include "net/dns/dns_config_service_posix.h" |
| @@ -73,12 +76,16 @@ class NetworkChangeNotifierAndroid::DnsConfigServiceThread |
| public: |
| DnsConfigServiceThread(const DnsConfig* dns_config_for_testing) |
| : base::Thread("DnsConfigService"), |
| + calling_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
| dns_config_for_testing_(dns_config_for_testing), |
| creation_time_(base::Time::Now()), |
| address_tracker_(base::Bind(base::DoNothing), |
| base::Bind(base::DoNothing), |
| // We're only interested in tunnel interface changes. |
| - base::Bind(NotifyNetworkChangeNotifierObservers)) {} |
| + base::Bind(NotifyNetworkChangeNotifierObservers)), |
| + weak_ptr_factory_(this) { |
| + weak_ptr_ = weak_ptr_factory_.GetWeakPtr(); |
| + } |
| ~DnsConfigServiceThread() override { |
| NetworkChangeNotifier::RemoveNetworkChangeObserver(this); |
| @@ -98,6 +105,9 @@ class NetworkChangeNotifierAndroid::DnsConfigServiceThread |
| dns_config_service_->WatchConfig( |
| base::Bind(&DnsConfigServiceThread::DnsConfigChangeCallback, |
| base::Unretained(this))); |
| + calling_task_runner_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&DnsConfigServiceThread::InitAfterStart, weak_ptr_)); |
|
pauljensen
2015/05/01 11:54:44
This is not good. This will allow changes to esca
kinuko
2015/05/01 13:58:05
Ok thanks, I suspected it might be the case. I can
|
| } |
| void CleanUp() override { dns_config_service_.reset(); } |
| @@ -125,12 +135,17 @@ class NetworkChangeNotifierAndroid::DnsConfigServiceThread |
| base::Unretained(dns_config_service_.get()), type)); |
| } |
| + scoped_refptr<base::SingleThreadTaskRunner> calling_task_runner_; |
| const DnsConfig* dns_config_for_testing_; |
| const base::Time creation_time_; |
| scoped_ptr<internal::DnsConfigServicePosix> dns_config_service_; |
| // Used to detect tunnel state changes. |
| internal::AddressTrackerLinux address_tracker_; |
| + // Used only on the calling thread that created this thread. |
| + base::WeakPtr<DnsConfigServiceThread> weak_ptr_; |
| + base::WeakPtrFactory<DnsConfigServiceThread> weak_ptr_factory_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(DnsConfigServiceThread); |
| }; |
| @@ -172,7 +187,6 @@ NetworkChangeNotifierAndroid::NetworkChangeNotifierAndroid( |
| delegate_->AddObserver(this); |
| dns_config_service_thread_->StartWithOptions( |
| base::Thread::Options(base::MessageLoop::TYPE_IO, 0)); |
| - dns_config_service_thread_->InitAfterStart(); |
| } |
| // static |