| Index: chrome/browser/renderer_host/async_resource_handler.cc
|
| ===================================================================
|
| --- chrome/browser/renderer_host/async_resource_handler.cc (revision 8565)
|
| +++ chrome/browser/renderer_host/async_resource_handler.cc (working copy)
|
| @@ -5,9 +5,32 @@
|
| #include "chrome/browser/renderer_host/async_resource_handler.h"
|
|
|
| #include "base/process.h"
|
| +#include "net/base/io_buffer.h"
|
|
|
| -base::SharedMemory* AsyncResourceHandler::spare_read_buffer_;
|
| +SharedIOBuffer* AsyncResourceHandler::spare_read_buffer_;
|
|
|
| +// Our version of IOBuffer that uses shared memory.
|
| +class SharedIOBuffer : public net::IOBuffer {
|
| + public:
|
| + SharedIOBuffer(int buffer_size) : net::IOBuffer(NULL), ok_(false) {
|
| + if (shared_memory_.Create(std::wstring(), false, false, buffer_size) &&
|
| + shared_memory_.Map(buffer_size)) {
|
| + ok_ = true;
|
| + data_ = reinterpret_cast<char*>(shared_memory_.memory());
|
| + }
|
| + }
|
| + ~SharedIOBuffer() {
|
| + data_ = NULL;
|
| + }
|
| +
|
| + base::SharedMemory* shared_memory() { return &shared_memory_; }
|
| + bool ok() { return ok_; }
|
| +
|
| + private:
|
| + base::SharedMemory shared_memory_;
|
| + bool ok_;
|
| +};
|
| +
|
| AsyncResourceHandler::AsyncResourceHandler(
|
| ResourceDispatcherHost::Receiver* receiver,
|
| int render_process_host_id,
|
| @@ -44,22 +67,19 @@
|
| return true;
|
| }
|
|
|
| -bool AsyncResourceHandler::OnWillRead(int request_id,
|
| - char** buf, int* buf_size,
|
| - int min_size) {
|
| +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_) {
|
| - read_buffer_.reset(spare_read_buffer_);
|
| + read_buffer_ = spare_read_buffer_;
|
| spare_read_buffer_ = NULL;
|
| } else {
|
| - read_buffer_.reset(new base::SharedMemory);
|
| - if (!read_buffer_->Create(std::wstring(), false, false, kReadBufSize))
|
| + read_buffer_ = new SharedIOBuffer(kReadBufSize);
|
| + if (!read_buffer_->ok())
|
| return false;
|
| - if (!read_buffer_->Map(kReadBufSize))
|
| - return false;
|
| }
|
| - *buf = static_cast<char*>(read_buffer_->memory());
|
| + *buf = read_buffer_.get();
|
| *buf_size = kReadBufSize;
|
| return true;
|
| }
|
| @@ -75,7 +95,7 @@
|
| }
|
|
|
| base::SharedMemoryHandle handle;
|
| - if (!read_buffer_->GiveToProcess(render_process_, &handle)) {
|
| + if (!read_buffer_->shared_memory()->GiveToProcess(render_process_, &handle)) {
|
| // We wrongfully incremented the pending data count. Fake an ACK message
|
| // to fix this. We can't move this call above the WillSendData because
|
| // it's killing our read_buffer_, and we don't want that when we pause
|
| @@ -97,15 +117,14 @@
|
|
|
| // If we still have a read buffer, then see about caching it for later...
|
| if (spare_read_buffer_) {
|
| - read_buffer_.reset();
|
| - } else if (read_buffer_.get() && read_buffer_->memory()) {
|
| - spare_read_buffer_ = read_buffer_.release();
|
| + read_buffer_ = NULL;
|
| + } else if (read_buffer_.get() && read_buffer_->data()) {
|
| + read_buffer_.swap(&spare_read_buffer_);
|
| }
|
| return true;
|
| }
|
|
|
| // static
|
| void AsyncResourceHandler::GlobalCleanup() {
|
| - delete spare_read_buffer_;
|
| spare_read_buffer_ = NULL;
|
| }
|
|
|