diff options
author | rvargas@google.com <rvargas@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-09 20:50:41 +0000 |
---|---|---|
committer | rvargas@google.com <rvargas@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-09 20:50:41 +0000 |
commit | 0a3ab1ba3e98a21a336f48e7e972441b88f7468a (patch) | |
tree | 1c78da06cb61debc5dcd09c0c7c4aa553b72e5b6 | |
parent | 69b1fe0d5574eed94ad2fc235fe44eec2ea55f93 (diff) | |
download | chromium_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.cc | 21 |
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; |