Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(680)

Unified Diff: chrome/browser/renderer_host/async_resource_handler.cc

Issue 18390: Change URLRequest to use a ref-counted buffer for actual IO.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
}
« no previous file with comments | « chrome/browser/renderer_host/async_resource_handler.h ('k') | chrome/browser/renderer_host/buffered_resource_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698