diff options
author | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-06 15:42:40 +0000 |
---|---|---|
committer | willchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-06 15:42:40 +0000 |
commit | 7c52ed9cf0a7ddbe2e266c638e36f293e54b409c (patch) | |
tree | d72718881752f7226323a5d801ad033c0f8b7604 | |
parent | b850f2d481fd5de6405abf77b020bb908cb7c96a (diff) | |
download | chromium_src-7c52ed9cf0a7ddbe2e266c638e36f293e54b409c.zip chromium_src-7c52ed9cf0a7ddbe2e266c638e36f293e54b409c.tar.gz chromium_src-7c52ed9cf0a7ddbe2e266c638e36f293e54b409c.tar.bz2 |
Track URLRequestContext references in a set.
Also add code in URLRequestContext to CHECK in its destructor to make sure there are no references. This is sort of pointless right now because URLRequest holds a scoped_refptr<URLRequestContext>. My plan is to probe on canary channel with killing that off, and debugging crash reports until I've fixed the last leaks.
BUG=58859
TEST=none
Review URL: http://codereview.chromium.org/10006009
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@131126 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | net/url_request/url_request.cc | 14 | ||||
-rw-r--r-- | net/url_request/url_request_context.cc | 16 | ||||
-rw-r--r-- | net/url_request/url_request_context.h | 10 |
3 files changed, 39 insertions, 1 deletions
diff --git a/net/url_request/url_request.cc b/net/url_request/url_request.cc index b6afea3..8597917 100644 --- a/net/url_request/url_request.cc +++ b/net/url_request/url_request.cc @@ -12,6 +12,7 @@ #include "base/memory/singleton.h" #include "base/message_loop.h" #include "base/metrics/stats_counters.h" +#include "base/stl_util.h" #include "base/synchronization/lock.h" #include "net/base/auth.h" #include "net/base/host_port_pair.h" @@ -712,6 +713,19 @@ const URLRequestContext* URLRequest::context() const { } void URLRequest::set_context(const URLRequestContext* context) { + // Update the URLRequest lists in the URLRequestContext. + if (context_) { + std::set<const URLRequest*>* url_requests = context_->url_requests(); + CHECK(ContainsKey(*url_requests, this)); + url_requests->erase(this); + } + + if (context) { + std::set<const URLRequest*>* url_requests = context->url_requests(); + CHECK(!ContainsKey(*url_requests, this)); + url_requests->insert(this); + } + scoped_refptr<const URLRequestContext> prev_context = context_; context_ = context; diff --git a/net/url_request/url_request_context.cc b/net/url_request/url_request_context.cc index e42d465..51a6dbf 100644 --- a/net/url_request/url_request_context.cc +++ b/net/url_request/url_request_context.cc @@ -5,11 +5,13 @@ #include "net/url_request/url_request_context.h" #include "base/compiler_specific.h" +#include "base/debug/alias.h" #include "base/string_util.h" #include "net/base/host_resolver.h" #include "net/cookies/cookie_store.h" #include "net/ftp/ftp_transaction_factory.h" #include "net/http/http_transaction_factory.h" +#include "net/url_request/url_request.h" namespace net { @@ -28,7 +30,8 @@ URLRequestContext::URLRequestContext() ftp_auth_cache_(new FtpAuthCache), http_transaction_factory_(NULL), ftp_transaction_factory_(NULL), - job_factory_(NULL) { + job_factory_(NULL), + url_requests_(new std::set<const URLRequest*>) { } void URLRequestContext::CopyFrom(URLRequestContext* other) { @@ -63,6 +66,17 @@ const std::string& URLRequestContext::GetUserAgent(const GURL& url) const { } URLRequestContext::~URLRequestContext() { + int num_requests = url_requests_->size(); + if (num_requests != 0) { + // We're leaking URLRequests :( Dump the URL of the first one and record how + // many we leaked so we have an idea of how bad it is. + char url_buf[128]; + const URLRequest* request = *url_requests_->begin(); + base::strlcpy(url_buf, request->url().spec().c_str(), arraysize(url_buf)); + base::debug::Alias(url_buf); + base::debug::Alias(&num_requests); + CHECK(false); + } } } // namespace net diff --git a/net/url_request/url_request_context.h b/net/url_request/url_request_context.h index f4fb5ea..1bdb772 100644 --- a/net/url_request/url_request_context.h +++ b/net/url_request/url_request_context.h @@ -11,6 +11,8 @@ #define NET_URL_REQUEST_URL_REQUEST_CONTEXT_H_ #pragma once +#include <set> + #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" @@ -189,6 +191,12 @@ class NET_EXPORT URLRequestContext job_factory_ = job_factory; } + // Gets the URLRequest objects that hold a reference to this + // URLRequestContext. + std::set<const URLRequest*>* url_requests() const { + return url_requests_.get(); + } + protected: friend class base::RefCountedThreadSafe<URLRequestContext>; @@ -232,6 +240,8 @@ class NET_EXPORT URLRequestContext // be added to CopyFrom. // --------------------------------------------------------------------------- + scoped_ptr<std::set<const URLRequest*> > url_requests_; + DISALLOW_COPY_AND_ASSIGN(URLRequestContext); }; |