From 0a3ab1ba3e98a21a336f48e7e972441b88f7468a Mon Sep 17 00:00:00 2001 From: "rvargas@google.com" Date: Thu, 9 Sep 2010 20:50:41 +0000 Subject: 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 --- .../browser/renderer_host/async_resource_handler.cc | 21 +++++++++------------ 1 file 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(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; -- cgit v1.1