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/process.h" | 8 #include "base/process.h" |
8 #include "base/shared_memory.h" | 9 #include "base/shared_memory.h" |
9 #include "chrome/common/render_messages.h" | 10 #include "chrome/common/render_messages.h" |
10 #include "net/base/io_buffer.h" | 11 #include "net/base/io_buffer.h" |
11 | 12 |
12 SharedIOBuffer* AsyncResourceHandler::spare_read_buffer_; | 13 // 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 |
| 15 // this buffer around for the next read as a small optimization. |
| 16 static SharedIOBuffer* g_spare_read_buffer = NULL; |
13 | 17 |
14 // Our version of IOBuffer that uses shared memory. | 18 // Our version of IOBuffer that uses shared memory. |
15 class SharedIOBuffer : public net::IOBuffer { | 19 class SharedIOBuffer : public net::IOBuffer { |
16 public: | 20 public: |
17 SharedIOBuffer(int buffer_size) : net::IOBuffer(), ok_(false) { | 21 SharedIOBuffer(int buffer_size) : net::IOBuffer(), ok_(false) { |
18 if (shared_memory_.Create(std::wstring(), false, false, buffer_size) && | 22 if (shared_memory_.Create(std::wstring(), false, false, buffer_size) && |
19 shared_memory_.Map(buffer_size)) { | 23 shared_memory_.Map(buffer_size)) { |
20 ok_ = true; | 24 ok_ = true; |
21 data_ = reinterpret_cast<char*>(shared_memory_.memory()); | 25 data_ = reinterpret_cast<char*>(shared_memory_.memory()); |
22 } | 26 } |
23 } | 27 } |
24 ~SharedIOBuffer() { | 28 ~SharedIOBuffer() { |
| 29 // TODO(willchan): Remove after debugging bug 16371. |
| 30 CHECK(g_spare_read_buffer != this); |
25 data_ = NULL; | 31 data_ = NULL; |
26 } | 32 } |
27 | 33 |
28 base::SharedMemory* shared_memory() { return &shared_memory_; } | 34 base::SharedMemory* shared_memory() { return &shared_memory_; } |
29 bool ok() { return ok_; } | 35 bool ok() { return ok_; } |
30 | 36 |
31 private: | 37 private: |
32 base::SharedMemory shared_memory_; | 38 base::SharedMemory shared_memory_; |
33 bool ok_; | 39 bool ok_; |
34 }; | 40 }; |
(...skipping 31 matching lines...) Loading... |
66 ResourceResponse* response) { | 72 ResourceResponse* response) { |
67 receiver_->Send(new ViewMsg_Resource_ReceivedResponse( | 73 receiver_->Send(new ViewMsg_Resource_ReceivedResponse( |
68 routing_id_, request_id, response->response_head)); | 74 routing_id_, request_id, response->response_head)); |
69 return true; | 75 return true; |
70 } | 76 } |
71 | 77 |
72 bool AsyncResourceHandler::OnWillRead(int request_id, net::IOBuffer** buf, | 78 bool AsyncResourceHandler::OnWillRead(int request_id, net::IOBuffer** buf, |
73 int* buf_size, int min_size) { | 79 int* buf_size, int min_size) { |
74 DCHECK(min_size == -1); | 80 DCHECK(min_size == -1); |
75 static const int kReadBufSize = 32768; | 81 static const int kReadBufSize = 32768; |
76 if (spare_read_buffer_) { | 82 if (g_spare_read_buffer) { |
77 DCHECK(!read_buffer_); | 83 DCHECK(!read_buffer_); |
78 read_buffer_.swap(&spare_read_buffer_); | 84 read_buffer_.swap(&g_spare_read_buffer); |
| 85 // TODO(willchan): Remove after debugging bug 16371. |
| 86 CHECK(read_buffer_->data()); |
79 } else { | 87 } else { |
80 read_buffer_ = new SharedIOBuffer(kReadBufSize); | 88 read_buffer_ = new SharedIOBuffer(kReadBufSize); |
81 if (!read_buffer_->ok()) | 89 if (!read_buffer_->ok()) |
82 return false; | 90 return false; |
| 91 // TODO(willchan): Remove after debugging bug 16371. |
| 92 CHECK(read_buffer_->data()); |
83 } | 93 } |
84 *buf = read_buffer_.get(); | 94 *buf = read_buffer_.get(); |
85 *buf_size = kReadBufSize; | 95 *buf_size = kReadBufSize; |
86 return true; | 96 return true; |
87 } | 97 } |
88 | 98 |
89 bool AsyncResourceHandler::OnReadCompleted(int request_id, int* bytes_read) { | 99 bool AsyncResourceHandler::OnReadCompleted(int request_id, int* bytes_read) { |
90 if (!*bytes_read) | 100 if (!*bytes_read) |
91 return true; | 101 return true; |
92 DCHECK(read_buffer_.get()); | 102 DCHECK(read_buffer_.get()); |
(...skipping 26 matching lines...) Loading... |
119 bool AsyncResourceHandler::OnResponseCompleted( | 129 bool AsyncResourceHandler::OnResponseCompleted( |
120 int request_id, | 130 int request_id, |
121 const URLRequestStatus& status, | 131 const URLRequestStatus& status, |
122 const std::string& security_info) { | 132 const std::string& security_info) { |
123 receiver_->Send(new ViewMsg_Resource_RequestComplete(routing_id_, | 133 receiver_->Send(new ViewMsg_Resource_RequestComplete(routing_id_, |
124 request_id, | 134 request_id, |
125 status, | 135 status, |
126 security_info)); | 136 security_info)); |
127 | 137 |
128 // If we still have a read buffer, then see about caching it for later... | 138 // If we still have a read buffer, then see about caching it for later... |
129 if (spare_read_buffer_) { | 139 if (g_spare_read_buffer) { |
130 read_buffer_ = NULL; | 140 read_buffer_ = NULL; |
131 } else if (read_buffer_.get()) { | 141 } else if (read_buffer_.get()) { |
132 read_buffer_.swap(&spare_read_buffer_); | 142 read_buffer_.swap(&g_spare_read_buffer); |
133 } | 143 } |
134 return true; | 144 return true; |
135 } | 145 } |
136 | 146 |
137 // static | 147 // static |
138 void AsyncResourceHandler::GlobalCleanup() { | 148 void AsyncResourceHandler::GlobalCleanup() { |
139 if (spare_read_buffer_) { | 149 if (g_spare_read_buffer) { |
140 spare_read_buffer_->Release(); | 150 // Avoid the CHECK in SharedIOBuffer::~SharedIOBuffer(). |
141 spare_read_buffer_ = NULL; | 151 SharedIOBuffer* tmp = g_spare_read_buffer; |
| 152 g_spare_read_buffer = NULL; |
| 153 tmp->Release(); |
142 } | 154 } |
143 } | 155 } |
OLD | NEW |