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 |