| Index: chrome/browser/renderer_host/async_resource_handler.cc
|
| diff --git a/chrome/browser/renderer_host/async_resource_handler.cc b/chrome/browser/renderer_host/async_resource_handler.cc
|
| index 038fc8cf6f66fe29a9cbdb2ecb08584332f8e15a..6b69db35e5b132012e8a47ba060ddc91bda870bc 100644
|
| --- a/chrome/browser/renderer_host/async_resource_handler.cc
|
| +++ b/chrome/browser/renderer_host/async_resource_handler.cc
|
| @@ -4,12 +4,16 @@
|
|
|
| #include "chrome/browser/renderer_host/async_resource_handler.h"
|
|
|
| +#include "base/logging.h"
|
| #include "base/process.h"
|
| #include "base/shared_memory.h"
|
| #include "chrome/common/render_messages.h"
|
| #include "net/base/io_buffer.h"
|
|
|
| -SharedIOBuffer* AsyncResourceHandler::spare_read_buffer_;
|
| +// When reading, we don't know if we are going to get EOF (0 bytes read), so
|
| +// we typically have a buffer that we allocated but did not use. We keep
|
| +// this buffer around for the next read as a small optimization.
|
| +static SharedIOBuffer* g_spare_read_buffer = NULL;
|
|
|
| // Our version of IOBuffer that uses shared memory.
|
| class SharedIOBuffer : public net::IOBuffer {
|
| @@ -22,6 +26,8 @@ class SharedIOBuffer : public net::IOBuffer {
|
| }
|
| }
|
| ~SharedIOBuffer() {
|
| + // TODO(willchan): Remove after debugging bug 16371.
|
| + CHECK(g_spare_read_buffer != this);
|
| data_ = NULL;
|
| }
|
|
|
| @@ -73,13 +79,17 @@ bool AsyncResourceHandler::OnWillRead(int request_id, net::IOBuffer** buf,
|
| int* buf_size, int min_size) {
|
| DCHECK(min_size == -1);
|
| static const int kReadBufSize = 32768;
|
| - if (spare_read_buffer_) {
|
| + if (g_spare_read_buffer) {
|
| DCHECK(!read_buffer_);
|
| - read_buffer_.swap(&spare_read_buffer_);
|
| + read_buffer_.swap(&g_spare_read_buffer);
|
| + // TODO(willchan): Remove after debugging bug 16371.
|
| + CHECK(read_buffer_->data());
|
| } else {
|
| read_buffer_ = new SharedIOBuffer(kReadBufSize);
|
| if (!read_buffer_->ok())
|
| return false;
|
| + // TODO(willchan): Remove after debugging bug 16371.
|
| + CHECK(read_buffer_->data());
|
| }
|
| *buf = read_buffer_.get();
|
| *buf_size = kReadBufSize;
|
| @@ -126,18 +136,20 @@ bool AsyncResourceHandler::OnResponseCompleted(
|
| security_info));
|
|
|
| // If we still have a read buffer, then see about caching it for later...
|
| - if (spare_read_buffer_) {
|
| + if (g_spare_read_buffer) {
|
| read_buffer_ = NULL;
|
| } else if (read_buffer_.get()) {
|
| - read_buffer_.swap(&spare_read_buffer_);
|
| + read_buffer_.swap(&g_spare_read_buffer);
|
| }
|
| return true;
|
| }
|
|
|
| // static
|
| void AsyncResourceHandler::GlobalCleanup() {
|
| - if (spare_read_buffer_) {
|
| - spare_read_buffer_->Release();
|
| - spare_read_buffer_ = NULL;
|
| + if (g_spare_read_buffer) {
|
| + // Avoid the CHECK in SharedIOBuffer::~SharedIOBuffer().
|
| + SharedIOBuffer* tmp = g_spare_read_buffer;
|
| + g_spare_read_buffer = NULL;
|
| + tmp->Release();
|
| }
|
| }
|
|
|