Chromium Code Reviews| Index: chrome/browser/net/predictor.cc |
| diff --git a/chrome/browser/net/predictor.cc b/chrome/browser/net/predictor.cc |
| index 658223c1dc4df7b607f73ce2586e67a957b2014c..85d174f86af2b8aaedee4355a86caf7cf9279e36 100644 |
| --- a/chrome/browser/net/predictor.cc |
| +++ b/chrome/browser/net/predictor.cc |
| @@ -12,6 +12,7 @@ |
| #include <utility> |
| #include "base/bind.h" |
| +#include "base/callback.h" |
| #include "base/compiler_specific.h" |
| #include "base/containers/mru_cache.h" |
| #include "base/location.h" |
| @@ -131,8 +132,10 @@ Predictor* Predictor::CreatePredictor(bool preconnect_enabled, |
| void Predictor::RegisterProfilePrefs( |
| user_prefs::PrefRegistrySyncable* registry) { |
| - registry->RegisterListPref(prefs::kDnsPrefetchingStartupList); |
| - registry->RegisterListPref(prefs::kDnsPrefetchingHostReferralList); |
| + registry->RegisterListPref(prefs::kDnsPrefetchingStartupList, |
| + PrefRegistry::LOSSY_PREF); |
| + registry->RegisterListPref(prefs::kDnsPrefetchingHostReferralList, |
| + PrefRegistry::LOSSY_PREF); |
| } |
| // --------------------- Start UI methods. ------------------------------------ |
| @@ -318,6 +321,7 @@ void Predictor::DiscardAllResultsAndClearPrefsOnUIThread() { |
| void Predictor::ClearPrefsOnUIThread() { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + DCHECK(user_prefs_); |
| user_prefs_->ClearPref(prefs::kDnsPrefetchingStartupList); |
| user_prefs_->ClearPref(prefs::kDnsPrefetchingHostReferralList); |
| } |
| @@ -334,6 +338,7 @@ void Predictor::set_max_parallel_resolves(size_t max_parallel_resolves) { |
| void Predictor::ShutdownOnUIThread() { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + user_prefs_ = nullptr; |
| BrowserThread::PostTask( |
| BrowserThread::IO, |
| FROM_HERE, |
| @@ -676,68 +681,48 @@ void Predictor::DnsPrefetchMotivatedList( |
| // Functions to handle saving of hostnames from one session to the next, to |
| // expedite startup times. |
| -static void SaveDnsPrefetchStateForNextStartupOnIOThread( |
| - base::ListValue* startup_list, |
| - base::ListValue* referral_list, |
| - base::WaitableEvent* completion, |
| - Predictor* predictor) { |
| - DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - |
| - if (nullptr == predictor) { |
| - completion->Signal(); |
| +void Predictor::SaveStateForNextStartup() { |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + if (!predictor_enabled_ || !CanPreresolveAndPreconnect()) |
| return; |
| - } |
| - predictor->SaveDnsPrefetchStateForNextStartup(startup_list, referral_list, |
| - completion); |
| + |
| + base::ListValue* referral_list = |
|
Bernhard Bauer
2016/07/29 14:08:14
Could you store this in a unique_ptr<>? DeepCopy()
Charlie Harrison
2016/07/29 16:50:12
Done.
|
| + user_prefs_->GetList(prefs::kDnsPrefetchingHostReferralList)->DeepCopy(); |
| + base::ListValue* startup_list = |
| + user_prefs_->GetList(prefs::kDnsPrefetchingStartupList)->DeepCopy(); |
| + BrowserThread::PostTaskAndReply( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&Predictor::WriteDnsPrefetchState, weak_factory_->GetWeakPtr(), |
| + startup_list, referral_list), |
| + // TODO(csharrison): This should not be unretained! |
| + base::Bind(&Predictor::UpdatePrefsOnUIThread, base::Unretained(this), |
| + base::Owned(startup_list), base::Owned(referral_list))); |
| } |
| -void Predictor::SaveStateForNextStartup() { |
| - if (!predictor_enabled_) |
| - return; |
| - if (!CanPreresolveAndPreconnect()) |
| +// The ListValues should be Owned by the closure created in |
| +// SaveStateForNextStartup. |
| +void Predictor::UpdatePrefsOnUIThread(base::ListValue* startup_list, |
| + base::ListValue* referral_list) { |
| + // Don't perform an update if the Predictor has been shut down on the UI |
| + // thread. |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + if (!user_prefs_) |
| return; |
| + ListPrefUpdate startup_update(user_prefs_, prefs::kDnsPrefetchingStartupList); |
| + ListPrefUpdate referral_update(user_prefs_, |
| + prefs::kDnsPrefetchingHostReferralList); |
| - base::WaitableEvent completion( |
| - base::WaitableEvent::ResetPolicy::MANUAL, |
| - base::WaitableEvent::InitialState::NOT_SIGNALED); |
| - |
| - ListPrefUpdate update_startup_list(user_prefs_, |
| - prefs::kDnsPrefetchingStartupList); |
| - ListPrefUpdate update_referral_list(user_prefs_, |
| - prefs::kDnsPrefetchingHostReferralList); |
| - if (BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
| - SaveDnsPrefetchStateForNextStartupOnIOThread(update_startup_list.Get(), |
| - update_referral_list.Get(), |
| - &completion, this); |
| - } else { |
| - bool posted = BrowserThread::PostTask( |
| - BrowserThread::IO, FROM_HERE, |
| - base::Bind(&SaveDnsPrefetchStateForNextStartupOnIOThread, |
| - update_startup_list.Get(), update_referral_list.Get(), |
| - &completion, this)); |
| - |
| - // TODO(jar): Synchronous waiting for the IO thread is a potential source |
| - // to deadlocks and should be investigated. See http://crbug.com/78451. |
| - DCHECK(posted); |
| - if (posted) { |
| - // http://crbug.com/124954 |
| - base::ThreadRestrictions::ScopedAllowWait allow_wait; |
| - completion.Wait(); |
| - } |
| - } |
| + startup_update->Swap(startup_list); |
|
Bernhard Bauer
2016/07/29 14:08:14
You can just call user_prefs_->Set(key, value). Li
Charlie Harrison
2016/07/29 16:50:12
Much better :) done.
|
| + referral_update->Swap(referral_list); |
| } |
| -void Predictor::SaveDnsPrefetchStateForNextStartup( |
| - base::ListValue* startup_list, |
| - base::ListValue* referral_list, |
| - base::WaitableEvent* completion) { |
| +void Predictor::WriteDnsPrefetchState(base::ListValue* startup_list, |
| + base::ListValue* referral_list) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| if (initial_observer_.get()) |
| initial_observer_->GetInitialDnsResolutionList(startup_list); |
| SerializeReferrers(referral_list); |
| - |
| - completion->Signal(); |
| } |
| void Predictor::PreconnectUrl(const GURL& url, |