summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-06 15:42:40 +0000
committerwillchan@chromium.org <willchan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-06 15:42:40 +0000
commit7c52ed9cf0a7ddbe2e266c638e36f293e54b409c (patch)
treed72718881752f7226323a5d801ad033c0f8b7604
parentb850f2d481fd5de6405abf77b020bb908cb7c96a (diff)
downloadchromium_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.cc14
-rw-r--r--net/url_request/url_request_context.cc16
-rw-r--r--net/url_request/url_request_context.h10
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);
};