| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "storage/browser/blob/blob_storage_context.h" | 5 #include "storage/browser/blob/blob_storage_context.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/location.h" | 11 #include "base/location.h" |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
| 14 #include "base/metrics/histogram.h" | 14 #include "base/metrics/histogram.h" |
| 15 #include "base/stl_util.h" | 15 #include "base/stl_util.h" |
| 16 #include "base/thread_task_runner_handle.h" | 16 #include "base/thread_task_runner_handle.h" |
| 17 #include "base/trace_event/trace_event.h" | 17 #include "base/trace_event/trace_event.h" |
| 18 #include "storage/browser/blob/blob_data_builder.h" | 18 #include "storage/browser/blob/blob_data_builder.h" |
| 19 #include "storage/browser/blob/shareable_file_reference.h" |
| 19 #include "url/gurl.h" | 20 #include "url/gurl.h" |
| 20 | 21 |
| 21 namespace storage { | 22 namespace storage { |
| 22 | 23 |
| 23 namespace { | 24 namespace { |
| 24 | 25 |
| 25 // We can't use GURL directly for these hash fragment manipulations | 26 // We can't use GURL directly for these hash fragment manipulations |
| 26 // since it doesn't have specific knowlege of the BlobURL format. GURL | 27 // since it doesn't have specific knowlege of the BlobURL format. GURL |
| 27 // treats BlobURLs as if they were PathURLs which don't support hash | 28 // treats BlobURLs as if they were PathURLs which don't support hash |
| 28 // fragments. | 29 // fragments. |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 ipc_data.offset(), length, | 277 ipc_data.offset(), length, |
| 277 ipc_data.expected_modification_time()); | 278 ipc_data.expected_modification_time()); |
| 278 blob_item = new BlobDataItem(element.Pass()); | 279 blob_item = new BlobDataItem(element.Pass()); |
| 279 break; | 280 break; |
| 280 case DataElement::TYPE_BLOB: | 281 case DataElement::TYPE_BLOB: |
| 281 // This is a temporary item that will be deconstructed later. | 282 // This is a temporary item that will be deconstructed later. |
| 282 element->SetToBlobRange(ipc_data.blob_uuid(), ipc_data.offset(), | 283 element->SetToBlobRange(ipc_data.blob_uuid(), ipc_data.offset(), |
| 283 ipc_data.length()); | 284 ipc_data.length()); |
| 284 blob_item = new BlobDataItem(element.Pass()); | 285 blob_item = new BlobDataItem(element.Pass()); |
| 285 break; | 286 break; |
| 287 case DataElement::TYPE_DISK_CACHE_ENTRY: // This type can't be sent by IPC. |
| 288 NOTREACHED(); |
| 289 break; |
| 286 default: | 290 default: |
| 287 NOTREACHED(); | 291 NOTREACHED(); |
| 288 break; | 292 break; |
| 289 } | 293 } |
| 290 | 294 |
| 291 return blob_item; | 295 return blob_item; |
| 292 } | 296 } |
| 293 | 297 |
| 294 bool BlobStorageContext::AppendAllocatedBlobItem( | 298 bool BlobStorageContext::AppendAllocatedBlobItem( |
| 295 const std::string& target_blob_uuid, | 299 const std::string& target_blob_uuid, |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 GetBlobDataFromUUID(data_element.blob_uuid()); | 362 GetBlobDataFromUUID(data_element.blob_uuid()); |
| 359 if (src) { | 363 if (src) { |
| 360 BlobMapEntry* other_entry = | 364 BlobMapEntry* other_entry = |
| 361 blob_map_.find(data_element.blob_uuid())->second; | 365 blob_map_.find(data_element.blob_uuid())->second; |
| 362 DCHECK(other_entry->data); | 366 DCHECK(other_entry->data); |
| 363 exceeded_memory = !AppendBlob(target_blob_uuid, *other_entry->data, | 367 exceeded_memory = !AppendBlob(target_blob_uuid, *other_entry->data, |
| 364 offset, length, target_blob_builder); | 368 offset, length, target_blob_builder); |
| 365 } | 369 } |
| 366 break; | 370 break; |
| 367 } | 371 } |
| 372 case DataElement::TYPE_DISK_CACHE_ENTRY: { |
| 373 UMA_HISTOGRAM_COUNTS("Storage.BlobItemSize.CacheEntry", |
| 374 (length - offset) / 1024); |
| 375 target_blob_builder->AppendSharedBlobItem( |
| 376 new ShareableBlobDataItem(target_blob_uuid, blob_item)); |
| 377 break; |
| 378 } |
| 368 default: | 379 default: |
| 369 NOTREACHED(); | 380 NOTREACHED(); |
| 370 break; | 381 break; |
| 371 } | 382 } |
| 372 UMA_HISTOGRAM_COUNTS("Storage.Blob.StorageSizeAfterAppend", | 383 UMA_HISTOGRAM_COUNTS("Storage.Blob.StorageSizeAfterAppend", |
| 373 memory_usage_ / 1024); | 384 memory_usage_ / 1024); |
| 374 | 385 |
| 375 return !exceeded_memory; | 386 return !exceeded_memory; |
| 376 } | 387 } |
| 377 | 388 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 DCHECK_NE(item.length(), std::numeric_limits<uint64>::max()) | 444 DCHECK_NE(item.length(), std::numeric_limits<uint64>::max()) |
| 434 << "We cannot use a section of a file with an unknown length"; | 445 << "We cannot use a section of a file with an unknown length"; |
| 435 UMA_HISTOGRAM_COUNTS("Storage.BlobItemSize.BlobSlice.File", | 446 UMA_HISTOGRAM_COUNTS("Storage.BlobItemSize.BlobSlice.File", |
| 436 new_length / 1024); | 447 new_length / 1024); |
| 437 scoped_ptr<DataElement> element(new DataElement()); | 448 scoped_ptr<DataElement> element(new DataElement()); |
| 438 element->SetToFilePathRange(item.path(), item.offset() + offset, | 449 element->SetToFilePathRange(item.path(), item.offset() + offset, |
| 439 new_length, | 450 new_length, |
| 440 item.expected_modification_time()); | 451 item.expected_modification_time()); |
| 441 target_blob_builder->AppendSharedBlobItem(new ShareableBlobDataItem( | 452 target_blob_builder->AppendSharedBlobItem(new ShareableBlobDataItem( |
| 442 target_blob_uuid, | 453 target_blob_uuid, |
| 443 new BlobDataItem(element.Pass(), item.file_handle_))); | 454 new BlobDataItem(element.Pass(), item.data_handle_))); |
| 444 } break; | 455 } break; |
| 445 case DataElement::TYPE_FILE_FILESYSTEM: { | 456 case DataElement::TYPE_FILE_FILESYSTEM: { |
| 446 UMA_HISTOGRAM_COUNTS("Storage.BlobItemSize.BlobSlice.FileSystem", | 457 UMA_HISTOGRAM_COUNTS("Storage.BlobItemSize.BlobSlice.FileSystem", |
| 447 new_length / 1024); | 458 new_length / 1024); |
| 448 scoped_ptr<DataElement> element(new DataElement()); | 459 scoped_ptr<DataElement> element(new DataElement()); |
| 449 element->SetToFileSystemUrlRange(item.filesystem_url(), | 460 element->SetToFileSystemUrlRange(item.filesystem_url(), |
| 450 item.offset() + offset, new_length, | 461 item.offset() + offset, new_length, |
| 451 item.expected_modification_time()); | 462 item.expected_modification_time()); |
| 452 target_blob_builder->AppendSharedBlobItem(new ShareableBlobDataItem( | 463 target_blob_builder->AppendSharedBlobItem(new ShareableBlobDataItem( |
| 453 target_blob_uuid, new BlobDataItem(element.Pass()))); | 464 target_blob_uuid, new BlobDataItem(element.Pass()))); |
| 454 } break; | 465 } break; |
| 466 case DataElement::TYPE_DISK_CACHE_ENTRY: { |
| 467 scoped_ptr<DataElement> element(new DataElement()); |
| 468 element->SetToDiskCacheEntryRange(item.offset() + offset, |
| 469 new_length); |
| 470 target_blob_builder->AppendSharedBlobItem(new ShareableBlobDataItem( |
| 471 target_blob_uuid, |
| 472 new BlobDataItem(element.Pass(), item.data_handle_, |
| 473 item.disk_cache_entry(), |
| 474 item.disk_cache_stream_index()))); |
| 475 } break; |
| 455 default: | 476 default: |
| 456 CHECK(false) << "Illegal blob item type: " << item.type(); | 477 CHECK(false) << "Illegal blob item type: " << item.type(); |
| 457 } | 478 } |
| 458 length -= new_length; | 479 length -= new_length; |
| 459 offset = 0; | 480 offset = 0; |
| 460 } | 481 } |
| 461 return true; | 482 return true; |
| 462 } | 483 } |
| 463 | 484 |
| 464 bool BlobStorageContext::IsInUse(const std::string& uuid) { | 485 bool BlobStorageContext::IsInUse(const std::string& uuid) { |
| 465 return blob_map_.find(uuid) != blob_map_.end(); | 486 return blob_map_.find(uuid) != blob_map_.end(); |
| 466 } | 487 } |
| 467 | 488 |
| 468 bool BlobStorageContext::IsBeingBuilt(const std::string& uuid) { | 489 bool BlobStorageContext::IsBeingBuilt(const std::string& uuid) { |
| 469 BlobMap::iterator found = blob_map_.find(uuid); | 490 BlobMap::iterator found = blob_map_.find(uuid); |
| 470 if (found == blob_map_.end()) | 491 if (found == blob_map_.end()) |
| 471 return false; | 492 return false; |
| 472 return found->second->IsBeingBuilt(); | 493 return found->second->IsBeingBuilt(); |
| 473 } | 494 } |
| 474 | 495 |
| 475 bool BlobStorageContext::IsUrlRegistered(const GURL& blob_url) { | 496 bool BlobStorageContext::IsUrlRegistered(const GURL& blob_url) { |
| 476 return public_blob_urls_.find(blob_url) != public_blob_urls_.end(); | 497 return public_blob_urls_.find(blob_url) != public_blob_urls_.end(); |
| 477 } | 498 } |
| 478 | 499 |
| 479 } // namespace storage | 500 } // namespace storage |
| OLD | NEW |