diff options
author | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-09 06:13:40 +0000 |
---|---|---|
committer | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-09 06:13:40 +0000 |
commit | 0ee7a3bc23a95b316f82b3f558a0d74f5067dae9 (patch) | |
tree | 97be74bba1fe6adfa4d18e836ad24b7c7fd7d3ee /chrome/browser/net | |
parent | 40aa07af9babb4073a6e59c05d40b00561ccb091 (diff) | |
download | chromium_src-0ee7a3bc23a95b316f82b3f558a0d74f5067dae9.zip chromium_src-0ee7a3bc23a95b316f82b3f558a0d74f5067dae9.tar.gz chromium_src-0ee7a3bc23a95b316f82b3f558a0d74f5067dae9.tar.bz2 |
Reland r63578 - Release ChromeURLRequestContextGetters' references on IO thread shutdown."
Should be safe to reland after r65479.
BUG=58859
TEST=none
Review URL: http://codereview.chromium.org/4672005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@65504 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/net')
-rw-r--r-- | chrome/browser/net/chrome_url_request_context.cc | 23 | ||||
-rw-r--r-- | chrome/browser/net/chrome_url_request_context.h | 8 |
2 files changed, 26 insertions, 5 deletions
diff --git a/chrome/browser/net/chrome_url_request_context.cc b/chrome/browser/net/chrome_url_request_context.cc index 732dc37..a40e548e 100644 --- a/chrome/browser/net/chrome_url_request_context.cc +++ b/chrome/browser/net/chrome_url_request_context.cc @@ -521,8 +521,9 @@ ChromeURLRequestContext* FactoryForMedia::Create() { ChromeURLRequestContextGetter::ChromeURLRequestContextGetter( Profile* profile, ChromeURLRequestContextFactory* factory) - : factory_(factory), - url_request_context_(NULL) { + : io_thread_(g_browser_process->io_thread()), + factory_(factory), + url_request_context_(NULL) { DCHECK(factory); // If a base profile was specified, listen for changes to the preferences. @@ -540,6 +541,9 @@ ChromeURLRequestContextGetter::~ChromeURLRequestContextGetter() { DCHECK((factory_.get() && !url_request_context_.get()) || (!factory_.get() && url_request_context_.get())); + if (url_request_context_) + io_thread_->UnregisterURLRequestContextGetter(this); + // The scoped_refptr / scoped_ptr destructors take care of releasing // |factory_| and |url_request_context_| now. } @@ -560,11 +564,17 @@ URLRequestContext* ChromeURLRequestContextGetter::GetURLRequestContext() { } factory_.reset(); + io_thread_->RegisterURLRequestContextGetter(this); } return url_request_context_; } +void ChromeURLRequestContextGetter::ReleaseURLRequestContext() { + DCHECK(url_request_context_); + url_request_context_ = NULL; +} + void ChromeURLRequestContextGetter::RegisterUserPrefs( PrefService* pref_service) { pref_service->RegisterBooleanPref(prefs::kNoProxyServer, false); @@ -757,9 +767,12 @@ ChromeURLRequestContext::~ChromeURLRequestContext() { #if defined(USE_NSS) if (is_main()) { - DCHECK_EQ(this, net::GetURLRequestContextForOCSP()); - // We are releasing the URLRequestContext used by OCSP handlers. - net::SetURLRequestContextForOCSP(NULL); + URLRequestContext* ocsp_context = net::GetURLRequestContextForOCSP(); + if (ocsp_context) { + DCHECK_EQ(this, ocsp_context); + // We are releasing the URLRequestContext used by OCSP handlers. + net::SetURLRequestContextForOCSP(NULL); + } } #endif diff --git a/chrome/browser/net/chrome_url_request_context.h b/chrome/browser/net/chrome_url_request_context.h index 43b1b21..51d9246 100644 --- a/chrome/browser/net/chrome_url_request_context.h +++ b/chrome/browser/net/chrome_url_request_context.h @@ -242,6 +242,10 @@ class ChromeURLRequestContextGetter : public URLRequestContextGetter, virtual net::CookieStore* GetCookieStore(); virtual scoped_refptr<base::MessageLoopProxy> GetIOMessageLoopProxy() const; + // Releases |url_request_context_|. It's invalid to call + // GetURLRequestContext() after this point. + void ReleaseURLRequestContext(); + // Convenience overload of GetURLRequestContext() that returns a // ChromeURLRequestContext* rather than a URLRequestContext*. ChromeURLRequestContext* GetIOContext() { @@ -309,6 +313,10 @@ class ChromeURLRequestContextGetter : public URLRequestContextGetter, PrefChangeRegistrar registrar_; + // |io_thread_| is always valid during the lifetime of |this| since |this| is + // deleted on the IO thread. + IOThread* const io_thread_; + // Deferred logic for creating a ChromeURLRequestContext. // Access only from the IO thread. scoped_ptr<ChromeURLRequestContextFactory> factory_; |