summaryrefslogtreecommitdiffstats
path: root/chrome/browser/net
diff options
context:
space:
mode:
authorwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-09 06:13:40 +0000
committerwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-09 06:13:40 +0000
commit0ee7a3bc23a95b316f82b3f558a0d74f5067dae9 (patch)
tree97be74bba1fe6adfa4d18e836ad24b7c7fd7d3ee /chrome/browser/net
parent40aa07af9babb4073a6e59c05d40b00561ccb091 (diff)
downloadchromium_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.cc23
-rw-r--r--chrome/browser/net/chrome_url_request_context.h8
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_;