Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/renderer_host/async_resource_handler.h" | 5 #include "chrome/browser/renderer_host/async_resource_handler.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/process.h" | 8 #include "base/process.h" |
| 9 #include "base/shared_memory.h" | 9 #include "base/shared_memory.h" |
| 10 #include "chrome/common/render_messages.h" | 10 #include "chrome/common/render_messages.h" |
| 11 #include "net/base/io_buffer.h" | 11 #include "net/base/io_buffer.h" |
| 12 | 12 |
| 13 namespace { | |
| 14 | |
| 13 // When reading, we don't know if we are going to get EOF (0 bytes read), so | 15 // When reading, we don't know if we are going to get EOF (0 bytes read), so |
| 14 // we typically have a buffer that we allocated but did not use. We keep | 16 // we typically have a buffer that we allocated but did not use. We keep |
| 15 // this buffer around for the next read as a small optimization. | 17 // this buffer around for the next read as a small optimization. |
| 16 static SharedIOBuffer* g_spare_read_buffer = NULL; | 18 SharedIOBuffer* g_spare_read_buffer = NULL; |
| 19 | |
| 20 // The initial size of the shared memory buffer. (32 kilobytes). | |
| 21 const int kReadBufSize = 32768; | |
|
agl
2009/10/23 17:01:12
static
Elliot Glaysher
2009/10/23 17:07:00
anonymous namespace
darin (slow to review)
2009/10/23 17:59:40
kInitialReadBufSize?
| |
| 22 | |
| 23 // The maximum size of the shared memory buffer. (512 kilobytes). | |
| 24 const int kMaxBufSize = 524288; | |
|
agl
2009/10/23 17:01:12
static
darin (slow to review)
2009/10/23 17:59:40
kMaxReadBufSize
| |
| 25 | |
| 26 } // namespace | |
| 17 | 27 |
| 18 // Our version of IOBuffer that uses shared memory. | 28 // Our version of IOBuffer that uses shared memory. |
| 19 class SharedIOBuffer : public net::IOBuffer { | 29 class SharedIOBuffer : public net::IOBuffer { |
| 20 public: | 30 public: |
| 21 SharedIOBuffer(int buffer_size) : net::IOBuffer(), ok_(false) { | 31 SharedIOBuffer(int buffer_size) |
| 32 : net::IOBuffer(), | |
| 33 ok_(false), | |
| 34 buffer_size_(buffer_size) { | |
| 22 if (shared_memory_.Create(std::wstring(), false, false, buffer_size) && | 35 if (shared_memory_.Create(std::wstring(), false, false, buffer_size) && |
| 23 shared_memory_.Map(buffer_size)) { | 36 shared_memory_.Map(buffer_size)) { |
| 24 ok_ = true; | 37 ok_ = true; |
| 25 data_ = reinterpret_cast<char*>(shared_memory_.memory()); | 38 data_ = reinterpret_cast<char*>(shared_memory_.memory()); |
| 26 } | 39 } |
| 27 } | 40 } |
| 28 ~SharedIOBuffer() { | 41 ~SharedIOBuffer() { |
| 29 // TODO(willchan): Remove after debugging bug 16371. | 42 // TODO(willchan): Remove after debugging bug 16371. |
| 30 CHECK(g_spare_read_buffer != this); | 43 CHECK(g_spare_read_buffer != this); |
| 31 data_ = NULL; | 44 data_ = NULL; |
| 32 } | 45 } |
| 33 | 46 |
| 34 base::SharedMemory* shared_memory() { return &shared_memory_; } | 47 base::SharedMemory* shared_memory() { return &shared_memory_; } |
| 35 bool ok() { return ok_; } | 48 bool ok() { return ok_; } |
| 49 int buffer_size() { return buffer_size_; } | |
| 36 | 50 |
| 37 private: | 51 private: |
| 38 base::SharedMemory shared_memory_; | 52 base::SharedMemory shared_memory_; |
| 39 bool ok_; | 53 bool ok_; |
| 54 int buffer_size_; | |
| 40 }; | 55 }; |
| 41 | 56 |
| 42 AsyncResourceHandler::AsyncResourceHandler( | 57 AsyncResourceHandler::AsyncResourceHandler( |
| 43 ResourceDispatcherHost::Receiver* receiver, | 58 ResourceDispatcherHost::Receiver* receiver, |
| 44 int process_id, | 59 int process_id, |
| 45 int routing_id, | 60 int routing_id, |
| 46 base::ProcessHandle process_handle, | 61 base::ProcessHandle process_handle, |
| 47 const GURL& url, | 62 const GURL& url, |
| 48 ResourceDispatcherHost* resource_dispatcher_host) | 63 ResourceDispatcherHost* resource_dispatcher_host) |
| 49 : receiver_(receiver), | 64 : receiver_(receiver), |
| 50 process_id_(process_id), | 65 process_id_(process_id), |
| 51 routing_id_(routing_id), | 66 routing_id_(routing_id), |
| 52 process_handle_(process_handle), | 67 process_handle_(process_handle), |
| 53 rdh_(resource_dispatcher_host) { | 68 rdh_(resource_dispatcher_host), |
| 69 next_buffer_size_(kReadBufSize) { | |
| 54 } | 70 } |
| 55 | 71 |
| 56 bool AsyncResourceHandler::OnUploadProgress(int request_id, | 72 bool AsyncResourceHandler::OnUploadProgress(int request_id, |
| 57 uint64 position, | 73 uint64 position, |
| 58 uint64 size) { | 74 uint64 size) { |
| 59 return receiver_->Send(new ViewMsg_Resource_UploadProgress(routing_id_, | 75 return receiver_->Send(new ViewMsg_Resource_UploadProgress(routing_id_, |
| 60 request_id, | 76 request_id, |
| 61 position, size)); | 77 position, size)); |
| 62 } | 78 } |
| 63 | 79 |
| 64 bool AsyncResourceHandler::OnRequestRedirected(int request_id, | 80 bool AsyncResourceHandler::OnRequestRedirected(int request_id, |
| 65 const GURL& new_url, | 81 const GURL& new_url, |
| 66 ResourceResponse* response, | 82 ResourceResponse* response, |
| 67 bool* defer) { | 83 bool* defer) { |
| 68 *defer = true; | 84 *defer = true; |
| 69 return receiver_->Send(new ViewMsg_Resource_ReceivedRedirect( | 85 return receiver_->Send(new ViewMsg_Resource_ReceivedRedirect( |
| 70 routing_id_, request_id, new_url, response->response_head)); | 86 routing_id_, request_id, new_url, response->response_head)); |
| 71 } | 87 } |
| 72 | 88 |
| 73 bool AsyncResourceHandler::OnResponseStarted(int request_id, | 89 bool AsyncResourceHandler::OnResponseStarted(int request_id, |
| 74 ResourceResponse* response) { | 90 ResourceResponse* response) { |
| 75 receiver_->Send(new ViewMsg_Resource_ReceivedResponse( | 91 receiver_->Send(new ViewMsg_Resource_ReceivedResponse( |
| 76 routing_id_, request_id, response->response_head)); | 92 routing_id_, request_id, response->response_head)); |
| 77 return true; | 93 return true; |
| 78 } | 94 } |
| 79 | 95 |
| 80 bool AsyncResourceHandler::OnWillRead(int request_id, net::IOBuffer** buf, | 96 bool AsyncResourceHandler::OnWillRead(int request_id, net::IOBuffer** buf, |
| 81 int* buf_size, int min_size) { | 97 int* buf_size, int min_size) { |
| 82 DCHECK(min_size == -1); | 98 DCHECK(min_size == -1); |
| 83 static const int kReadBufSize = 32768; | 99 |
| 84 if (g_spare_read_buffer) { | 100 if (g_spare_read_buffer) { |
| 85 DCHECK(!read_buffer_); | 101 DCHECK(!read_buffer_); |
| 86 read_buffer_.swap(&g_spare_read_buffer); | 102 read_buffer_.swap(&g_spare_read_buffer); |
| 87 // TODO(willchan): Remove after debugging bug 16371. | 103 // TODO(willchan): Remove after debugging bug 16371. |
| 88 CHECK(read_buffer_->data()); | 104 CHECK(read_buffer_->data()); |
| 105 | |
| 106 *buf = read_buffer_.get(); | |
| 107 *buf_size = read_buffer_.get()->buffer_size(); | |
|
rvargas (doing something else)
2009/10/23 17:52:04
nit: drop the get()
| |
| 89 } else { | 108 } else { |
| 90 read_buffer_ = new SharedIOBuffer(kReadBufSize); | 109 read_buffer_ = new SharedIOBuffer(next_buffer_size_); |
| 91 if (!read_buffer_->ok()) | 110 if (!read_buffer_->ok()) { |
| 111 DLOG(ERROR) << "Couldn't allocate shared io buffer"; | |
| 92 return false; | 112 return false; |
| 113 } | |
| 93 // TODO(willchan): Remove after debugging bug 16371. | 114 // TODO(willchan): Remove after debugging bug 16371. |
| 94 CHECK(read_buffer_->data()); | 115 CHECK(read_buffer_->data()); |
| 116 *buf = read_buffer_.get(); | |
| 117 *buf_size = next_buffer_size_; | |
| 95 } | 118 } |
| 96 *buf = read_buffer_.get(); | 119 |
| 97 *buf_size = kReadBufSize; | 120 next_buffer_size_ = std::min(next_buffer_size_ * 2, kMaxBufSize); |
|
darin (slow to review)
2009/10/23 17:59:40
we do allow up to 20 (iirc) unanswered resource IP
| |
| 121 | |
| 98 return true; | 122 return true; |
| 99 } | 123 } |
| 100 | 124 |
| 101 bool AsyncResourceHandler::OnReadCompleted(int request_id, int* bytes_read) { | 125 bool AsyncResourceHandler::OnReadCompleted(int request_id, int* bytes_read) { |
| 102 if (!*bytes_read) | 126 if (!*bytes_read) |
| 103 return true; | 127 return true; |
| 104 DCHECK(read_buffer_.get()); | 128 DCHECK(read_buffer_.get()); |
| 105 | 129 |
| 106 if (!rdh_->WillSendData(process_id_, request_id)) { | 130 if (!rdh_->WillSendData(process_id_, request_id)) { |
| 107 // We should not send this data now, we have too many pending requests. | 131 // We should not send this data now, we have too many pending requests. |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 150 | 174 |
| 151 // static | 175 // static |
| 152 void AsyncResourceHandler::GlobalCleanup() { | 176 void AsyncResourceHandler::GlobalCleanup() { |
| 153 if (g_spare_read_buffer) { | 177 if (g_spare_read_buffer) { |
| 154 // Avoid the CHECK in SharedIOBuffer::~SharedIOBuffer(). | 178 // Avoid the CHECK in SharedIOBuffer::~SharedIOBuffer(). |
| 155 SharedIOBuffer* tmp = g_spare_read_buffer; | 179 SharedIOBuffer* tmp = g_spare_read_buffer; |
| 156 g_spare_read_buffer = NULL; | 180 g_spare_read_buffer = NULL; |
| 157 tmp->Release(); | 181 tmp->Release(); |
| 158 } | 182 } |
| 159 } | 183 } |
| OLD | NEW |