| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/loader/async_resource_handler.h" | 5 #include "content/browser/loader/async_resource_handler.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| 11 #include "base/containers/hash_tables.h" | 11 #include "base/containers/hash_tables.h" |
| 12 #include "base/debug/alias.h" | 12 #include "base/debug/alias.h" |
| 13 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #include "base/memory/shared_memory.h" | 14 #include "base/memory/shared_memory.h" |
| 15 #include "base/metrics/histogram.h" | 15 #include "base/metrics/histogram_macros.h" |
| 16 #include "base/strings/string_number_conversions.h" | 16 #include "base/strings/string_number_conversions.h" |
| 17 #include "base/time/time.h" | 17 #include "base/time/time.h" |
| 18 #include "content/browser/devtools/devtools_netlog_observer.h" | 18 #include "content/browser/devtools/devtools_netlog_observer.h" |
| 19 #include "content/browser/host_zoom_map_impl.h" | 19 #include "content/browser/host_zoom_map_impl.h" |
| 20 #include "content/browser/loader/resource_buffer.h" | 20 #include "content/browser/loader/resource_buffer.h" |
| 21 #include "content/browser/loader/resource_dispatcher_host_impl.h" | 21 #include "content/browser/loader/resource_dispatcher_host_impl.h" |
| 22 #include "content/browser/loader/resource_message_filter.h" | 22 #include "content/browser/loader/resource_message_filter.h" |
| 23 #include "content/browser/loader/resource_request_info_impl.h" | 23 #include "content/browser/loader/resource_request_info_impl.h" |
| 24 #include "content/browser/resource_context_impl.h" | 24 #include "content/browser/resource_context_impl.h" |
| 25 #include "content/common/resource_messages.h" | 25 #include "content/common/resource_messages.h" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 52 static bool did_init = false; | 52 static bool did_init = false; |
| 53 if (did_init) | 53 if (did_init) |
| 54 return; | 54 return; |
| 55 did_init = true; | 55 did_init = true; |
| 56 | 56 |
| 57 GetNumericArg("resource-buffer-size", &kBufferSize); | 57 GetNumericArg("resource-buffer-size", &kBufferSize); |
| 58 GetNumericArg("resource-buffer-min-allocation-size", &kMinAllocationSize); | 58 GetNumericArg("resource-buffer-min-allocation-size", &kMinAllocationSize); |
| 59 GetNumericArg("resource-buffer-max-allocation-size", &kMaxAllocationSize); | 59 GetNumericArg("resource-buffer-max-allocation-size", &kMaxAllocationSize); |
| 60 } | 60 } |
| 61 | 61 |
| 62 int CalcUsedPercentage(int bytes_read, int buffer_size) { | |
| 63 double ratio = static_cast<double>(bytes_read) / buffer_size; | |
| 64 return static_cast<int>(ratio * 100.0 + 0.5); // Round to nearest integer. | |
| 65 } | |
| 66 | |
| 67 } // namespace | 62 } // namespace |
| 68 | 63 |
| 69 class DependentIOBuffer : public net::WrappedIOBuffer { | 64 class DependentIOBuffer : public net::WrappedIOBuffer { |
| 70 public: | 65 public: |
| 71 DependentIOBuffer(ResourceBuffer* backing, char* memory) | 66 DependentIOBuffer(ResourceBuffer* backing, char* memory) |
| 72 : net::WrappedIOBuffer(memory), | 67 : net::WrappedIOBuffer(memory), |
| 73 backing_(backing) { | 68 backing_(backing) { |
| 74 } | 69 } |
| 75 private: | 70 private: |
| 76 ~DependentIOBuffer() override {} | 71 ~DependentIOBuffer() override {} |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 if (!EnsureResourceBufferIsInitialized()) | 244 if (!EnsureResourceBufferIsInitialized()) |
| 250 return false; | 245 return false; |
| 251 | 246 |
| 252 DCHECK(buffer_->CanAllocate()); | 247 DCHECK(buffer_->CanAllocate()); |
| 253 char* memory = buffer_->Allocate(&allocation_size_); | 248 char* memory = buffer_->Allocate(&allocation_size_); |
| 254 CHECK(memory); | 249 CHECK(memory); |
| 255 | 250 |
| 256 *buf = new DependentIOBuffer(buffer_.get(), memory); | 251 *buf = new DependentIOBuffer(buffer_.get(), memory); |
| 257 *buf_size = allocation_size_; | 252 *buf_size = allocation_size_; |
| 258 | 253 |
| 259 UMA_HISTOGRAM_CUSTOM_COUNTS( | |
| 260 "Net.AsyncResourceHandler_SharedIOBuffer_Alloc", | |
| 261 *buf_size, 0, kMaxAllocationSize, 100); | |
| 262 return true; | 254 return true; |
| 263 } | 255 } |
| 264 | 256 |
| 265 bool AsyncResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { | 257 bool AsyncResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { |
| 266 DCHECK_GE(bytes_read, 0); | 258 DCHECK_GE(bytes_read, 0); |
| 267 | 259 |
| 268 if (!bytes_read) | 260 if (!bytes_read) |
| 269 return true; | 261 return true; |
| 270 | 262 |
| 271 ResourceMessageFilter* filter = GetFilter(); | 263 ResourceMessageFilter* filter = GetFilter(); |
| 272 if (!filter) | 264 if (!filter) |
| 273 return false; | 265 return false; |
| 274 | 266 |
| 275 buffer_->ShrinkLastAllocation(bytes_read); | 267 buffer_->ShrinkLastAllocation(bytes_read); |
| 276 | 268 |
| 277 UMA_HISTOGRAM_CUSTOM_COUNTS( | |
| 278 "Net.AsyncResourceHandler_SharedIOBuffer_Used", | |
| 279 bytes_read, 0, kMaxAllocationSize, 100); | |
| 280 UMA_HISTOGRAM_PERCENTAGE( | |
| 281 "Net.AsyncResourceHandler_SharedIOBuffer_UsedPercentage", | |
| 282 CalcUsedPercentage(bytes_read, allocation_size_)); | |
| 283 | |
| 284 if (!sent_first_data_msg_) { | 269 if (!sent_first_data_msg_) { |
| 285 base::SharedMemoryHandle handle; | 270 base::SharedMemoryHandle handle; |
| 286 int size; | 271 int size; |
| 287 if (!buffer_->ShareToProcess(filter->PeerHandle(), &handle, &size)) | 272 if (!buffer_->ShareToProcess(filter->PeerHandle(), &handle, &size)) |
| 288 return false; | 273 return false; |
| 289 filter->Send(new ResourceMsg_SetDataBuffer( | 274 filter->Send(new ResourceMsg_SetDataBuffer( |
| 290 GetRequestID(), handle, size, filter->peer_pid())); | 275 GetRequestID(), handle, size, filter->peer_pid())); |
| 291 sent_first_data_msg_ = true; | 276 sent_first_data_msg_ = true; |
| 292 } | 277 } |
| 293 | 278 |
| 294 int data_offset = buffer_->GetLastAllocationOffset(); | 279 int data_offset = buffer_->GetLastAllocationOffset(); |
| 295 | 280 |
| 296 int64_t current_transfer_size = request()->GetTotalReceivedBytes(); | 281 int64_t current_transfer_size = request()->GetTotalReceivedBytes(); |
| 297 int encoded_data_length = current_transfer_size - reported_transfer_size_; | 282 int encoded_data_length = current_transfer_size - reported_transfer_size_; |
| 298 reported_transfer_size_ = current_transfer_size; | 283 reported_transfer_size_ = current_transfer_size; |
| 299 | 284 |
| 300 filter->Send(new ResourceMsg_DataReceived( | 285 filter->Send(new ResourceMsg_DataReceived( |
| 301 GetRequestID(), data_offset, bytes_read, encoded_data_length)); | 286 GetRequestID(), data_offset, bytes_read, encoded_data_length)); |
| 302 ++pending_data_count_; | 287 ++pending_data_count_; |
| 303 UMA_HISTOGRAM_CUSTOM_COUNTS( | |
| 304 "Net.AsyncResourceHandler_PendingDataCount", | |
| 305 pending_data_count_, 0, 100, 100); | |
| 306 | 288 |
| 307 if (!buffer_->CanAllocate()) { | 289 if (!buffer_->CanAllocate()) { |
| 308 UMA_HISTOGRAM_CUSTOM_COUNTS( | |
| 309 "Net.AsyncResourceHandler_PendingDataCount_WhenFull", | |
| 310 pending_data_count_, 0, 100, 100); | |
| 311 *defer = did_defer_ = true; | 290 *defer = did_defer_ = true; |
| 312 OnDefer(); | 291 OnDefer(); |
| 313 } | 292 } |
| 314 | 293 |
| 315 return true; | 294 return true; |
| 316 } | 295 } |
| 317 | 296 |
| 318 void AsyncResourceHandler::OnDataDownloaded(int bytes_downloaded) { | 297 void AsyncResourceHandler::OnDataDownloaded(int bytes_downloaded) { |
| 319 int64_t current_transfer_size = request()->GetTotalReceivedBytes(); | 298 int64_t current_transfer_size = request()->GetTotalReceivedBytes(); |
| 320 int encoded_data_length = current_transfer_size - reported_transfer_size_; | 299 int encoded_data_length = current_transfer_size - reported_transfer_size_; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 request()->LogUnblocked(); | 383 request()->LogUnblocked(); |
| 405 controller()->Resume(); | 384 controller()->Resume(); |
| 406 } | 385 } |
| 407 } | 386 } |
| 408 | 387 |
| 409 void AsyncResourceHandler::OnDefer() { | 388 void AsyncResourceHandler::OnDefer() { |
| 410 request()->LogBlockedBy("AsyncResourceHandler"); | 389 request()->LogBlockedBy("AsyncResourceHandler"); |
| 411 } | 390 } |
| 412 | 391 |
| 413 } // namespace content | 392 } // namespace content |
| OLD | NEW |