summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrvargas@google.com <rvargas@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-09 20:50:41 +0000
committerrvargas@google.com <rvargas@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-09 20:50:41 +0000
commit0a3ab1ba3e98a21a336f48e7e972441b88f7468a (patch)
tree1c78da06cb61debc5dcd09c0c7c4aa553b72e5b6
parent69b1fe0d5574eed94ad2fc235fe44eec2ea55f93 (diff)
downloadchromium_src-0a3ab1ba3e98a21a336f48e7e972441b88f7468a.zip
chromium_src-0a3ab1ba3e98a21a336f48e7e972441b88f7468a.tar.gz
chromium_src-0a3ab1ba3e98a21a336f48e7e972441b88f7468a.tar.bz2
AsyncResourceHandler: When a URLRequest is canceled,
the network code may complete the request with a CANCELED status but hold on to the actual buffer that was used for the operation (that's the whole point about using IOBuffers instead of a plain, non-refcounted buffer). In this scenario, the AsyncResourceHandler should not recycle the buffer for another request, unless we want two requests using the same buffer. BUG=53910 TEST=none Review URL: http://codereview.chromium.org/3311019 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@58997 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/renderer_host/async_resource_handler.cc21
1 files changed, 9 insertions, 12 deletions
diff --git a/chrome/browser/renderer_host/async_resource_handler.cc b/chrome/browser/renderer_host/async_resource_handler.cc
index bbcb89e..da6a810 100644
--- a/chrome/browser/renderer_host/async_resource_handler.cc
+++ b/chrome/browser/renderer_host/async_resource_handler.cc
@@ -50,8 +50,7 @@ class SharedIOBuffer : public net::IOBuffer {
if (shared_memory_.Create(std::wstring(), false, false, buffer_size_) &&
shared_memory_.Map(buffer_size_)) {
data_ = reinterpret_cast<char*>(shared_memory_.memory());
- // TODO(hawk): Remove after debugging bug 16371.
- CHECK(data_);
+ DCHECK(data_);
ok_ = true;
}
return ok_;
@@ -63,8 +62,7 @@ class SharedIOBuffer : public net::IOBuffer {
private:
~SharedIOBuffer() {
- // TODO(willchan): Remove after debugging bug 16371.
- CHECK(g_spare_read_buffer != this);
+ DCHECK(g_spare_read_buffer != this);
data_ = NULL;
}
@@ -181,13 +179,12 @@ bool AsyncResourceHandler::OnWillStart(int request_id,
bool AsyncResourceHandler::OnWillRead(int request_id, net::IOBuffer** buf,
int* buf_size, int min_size) {
- DCHECK(min_size == -1);
+ DCHECK_EQ(-1, min_size);
if (g_spare_read_buffer) {
DCHECK(!read_buffer_);
read_buffer_.swap(&g_spare_read_buffer);
- // TODO(willchan): Remove after debugging bug 16371.
- CHECK(read_buffer_->data());
+ DCHECK(read_buffer_->data());
*buf = read_buffer_.get();
*buf_size = read_buffer_->buffer_size();
@@ -198,8 +195,7 @@ bool AsyncResourceHandler::OnWillRead(int request_id, net::IOBuffer** buf,
read_buffer_ = NULL;
return false;
}
- // TODO(willchan): Remove after debugging bug 16371.
- CHECK(read_buffer_->data());
+ DCHECK(read_buffer_->data());
*buf = read_buffer_.get();
*buf_size = next_buffer_size_;
}
@@ -254,11 +250,12 @@ bool AsyncResourceHandler::OnResponseCompleted(
security_info));
// If we still have a read buffer, then see about caching it for later...
- if (g_spare_read_buffer) {
+ // Note that we have to make sure the buffer is not still being used, so we
+ // have to perform an explicit check on the status code.
+ if (g_spare_read_buffer || URLRequestStatus::SUCCESS != status.status()) {
read_buffer_ = NULL;
} else if (read_buffer_.get()) {
- // TODO(willchan): Remove after debugging bug 16371.
- CHECK(read_buffer_->data());
+ DCHECK(read_buffer_->data());
read_buffer_.swap(&g_spare_read_buffer);
}
return true;