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 "net/disk_cache/entry_impl.h" | 5 #include "net/disk_cache/entry_impl.h" |
6 | 6 |
7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
10 #include "net/base/io_buffer.h" | 10 #include "net/base/io_buffer.h" |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 | 54 |
55 DISALLOW_COPY_AND_ASSIGN(SyncCallback); | 55 DISALLOW_COPY_AND_ASSIGN(SyncCallback); |
56 }; | 56 }; |
57 | 57 |
58 void SyncCallback::OnFileIOComplete(int bytes_copied) { | 58 void SyncCallback::OnFileIOComplete(int bytes_copied) { |
59 entry_->DecrementIoCount(); | 59 entry_->DecrementIoCount(); |
60 if (!callback_.is_null()) { | 60 if (!callback_.is_null()) { |
61 if (entry_->net_log().IsLoggingAllEvents()) { | 61 if (entry_->net_log().IsLoggingAllEvents()) { |
62 entry_->net_log().EndEvent( | 62 entry_->net_log().EndEvent( |
63 end_event_type_, | 63 end_event_type_, |
64 make_scoped_refptr( | 64 disk_cache::CreateNetLogReadWriteCompleteCallback(bytes_copied)); |
65 new disk_cache::ReadWriteCompleteParameters(bytes_copied))); | |
66 } | 65 } |
67 entry_->ReportIOTime(disk_cache::EntryImpl::kAsyncIO, start_); | 66 entry_->ReportIOTime(disk_cache::EntryImpl::kAsyncIO, start_); |
68 callback_.Run(bytes_copied); | 67 callback_.Run(bytes_copied); |
69 } | 68 } |
70 entry_->Release(); | 69 entry_->Release(); |
71 delete this; | 70 delete this; |
72 } | 71 } |
73 | 72 |
74 void SyncCallback::Discard() { | 73 void SyncCallback::Discard() { |
75 callback_.Reset(); | 74 callback_.Reset(); |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
307 | 306 |
308 SetPointerForInvalidEntry(backend_->GetCurrentEntryId()); | 307 SetPointerForInvalidEntry(backend_->GetCurrentEntryId()); |
309 backend_->InternalDoomEntry(this); | 308 backend_->InternalDoomEntry(this); |
310 } | 309 } |
311 | 310 |
312 int EntryImpl::ReadDataImpl(int index, int offset, IOBuffer* buf, int buf_len, | 311 int EntryImpl::ReadDataImpl(int index, int offset, IOBuffer* buf, int buf_len, |
313 const CompletionCallback& callback) { | 312 const CompletionCallback& callback) { |
314 if (net_log_.IsLoggingAllEvents()) { | 313 if (net_log_.IsLoggingAllEvents()) { |
315 net_log_.BeginEvent( | 314 net_log_.BeginEvent( |
316 net::NetLog::TYPE_ENTRY_READ_DATA, | 315 net::NetLog::TYPE_ENTRY_READ_DATA, |
317 make_scoped_refptr( | 316 CreateNetLogReadWriteDataCallback(index, offset, buf_len, false)); |
318 new ReadWriteDataParameters(index, offset, buf_len, false))); | |
319 } | 317 } |
320 | 318 |
321 int result = InternalReadData(index, offset, buf, buf_len, callback); | 319 int result = InternalReadData(index, offset, buf, buf_len, callback); |
322 | 320 |
323 if (result != net::ERR_IO_PENDING && net_log_.IsLoggingAllEvents()) { | 321 if (result != net::ERR_IO_PENDING && net_log_.IsLoggingAllEvents()) { |
324 net_log_.EndEvent( | 322 net_log_.EndEvent( |
325 net::NetLog::TYPE_ENTRY_READ_DATA, | 323 net::NetLog::TYPE_ENTRY_READ_DATA, |
326 make_scoped_refptr(new ReadWriteCompleteParameters(result))); | 324 CreateNetLogReadWriteCompleteCallback(result)); |
327 } | 325 } |
328 return result; | 326 return result; |
329 } | 327 } |
330 | 328 |
331 int EntryImpl::WriteDataImpl(int index, int offset, IOBuffer* buf, int buf_len, | 329 int EntryImpl::WriteDataImpl(int index, int offset, IOBuffer* buf, int buf_len, |
332 const CompletionCallback& callback, | 330 const CompletionCallback& callback, |
333 bool truncate) { | 331 bool truncate) { |
334 if (net_log_.IsLoggingAllEvents()) { | 332 if (net_log_.IsLoggingAllEvents()) { |
335 net_log_.BeginEvent( | 333 net_log_.BeginEvent( |
336 net::NetLog::TYPE_ENTRY_WRITE_DATA, | 334 net::NetLog::TYPE_ENTRY_WRITE_DATA, |
337 make_scoped_refptr( | 335 CreateNetLogReadWriteDataCallback(index, offset, buf_len, truncate)); |
338 new ReadWriteDataParameters(index, offset, buf_len, truncate))); | |
339 } | 336 } |
340 | 337 |
341 int result = InternalWriteData(index, offset, buf, buf_len, callback, | 338 int result = InternalWriteData(index, offset, buf, buf_len, callback, |
342 truncate); | 339 truncate); |
343 | 340 |
344 if (result != net::ERR_IO_PENDING && net_log_.IsLoggingAllEvents()) { | 341 if (result != net::ERR_IO_PENDING && net_log_.IsLoggingAllEvents()) { |
345 net_log_.EndEvent( | 342 net_log_.EndEvent( |
346 net::NetLog::TYPE_ENTRY_WRITE_DATA, | 343 net::NetLog::TYPE_ENTRY_WRITE_DATA, |
347 make_scoped_refptr(new ReadWriteCompleteParameters(result))); | 344 CreateNetLogReadWriteCompleteCallback(result)); |
348 } | 345 } |
349 return result; | 346 return result; |
350 } | 347 } |
351 | 348 |
352 int EntryImpl::ReadSparseDataImpl(int64 offset, IOBuffer* buf, int buf_len, | 349 int EntryImpl::ReadSparseDataImpl(int64 offset, IOBuffer* buf, int buf_len, |
353 const CompletionCallback& callback) { | 350 const CompletionCallback& callback) { |
354 DCHECK(node_.Data()->dirty || read_only_); | 351 DCHECK(node_.Data()->dirty || read_only_); |
355 int result = InitSparseData(); | 352 int result = InitSparseData(); |
356 if (net::OK != result) | 353 if (net::OK != result) |
357 return result; | 354 return result; |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 bool EntryImpl::IsSameEntry(const std::string& key, uint32 hash) { | 448 bool EntryImpl::IsSameEntry(const std::string& key, uint32 hash) { |
452 if (entry_.Data()->hash != hash || | 449 if (entry_.Data()->hash != hash || |
453 static_cast<size_t>(entry_.Data()->key_len) != key.size()) | 450 static_cast<size_t>(entry_.Data()->key_len) != key.size()) |
454 return false; | 451 return false; |
455 | 452 |
456 std::string my_key = GetKey(); | 453 std::string my_key = GetKey(); |
457 return key.compare(my_key) ? false : true; | 454 return key.compare(my_key) ? false : true; |
458 } | 455 } |
459 | 456 |
460 void EntryImpl::InternalDoom() { | 457 void EntryImpl::InternalDoom() { |
461 net_log_.AddEvent(net::NetLog::TYPE_ENTRY_DOOM, NULL); | 458 net_log_.AddEvent(net::NetLog::TYPE_ENTRY_DOOM); |
462 DCHECK(node_.HasData()); | 459 DCHECK(node_.HasData()); |
463 if (!node_.Data()->dirty) { | 460 if (!node_.Data()->dirty) { |
464 node_.Data()->dirty = backend_->GetCurrentEntryId(); | 461 node_.Data()->dirty = backend_->GetCurrentEntryId(); |
465 node_.Store(); | 462 node_.Store(); |
466 } | 463 } |
467 doomed_ = true; | 464 doomed_ = true; |
468 } | 465 } |
469 | 466 |
470 void EntryImpl::DeleteEntryData(bool everything) { | 467 void EntryImpl::DeleteEntryData(bool everything) { |
471 DCHECK(doomed_ || !everything); | 468 DCHECK(doomed_ || !everything); |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
717 NOTREACHED(); | 714 NOTREACHED(); |
718 } | 715 } |
719 } | 716 } |
720 | 717 |
721 void EntryImpl::BeginLogging(net::NetLog* net_log, bool created) { | 718 void EntryImpl::BeginLogging(net::NetLog* net_log, bool created) { |
722 DCHECK(!net_log_.net_log()); | 719 DCHECK(!net_log_.net_log()); |
723 net_log_ = net::BoundNetLog::Make( | 720 net_log_ = net::BoundNetLog::Make( |
724 net_log, net::NetLog::SOURCE_DISK_CACHE_ENTRY); | 721 net_log, net::NetLog::SOURCE_DISK_CACHE_ENTRY); |
725 net_log_.BeginEvent( | 722 net_log_.BeginEvent( |
726 net::NetLog::TYPE_DISK_CACHE_ENTRY_IMPL, | 723 net::NetLog::TYPE_DISK_CACHE_ENTRY_IMPL, |
727 make_scoped_refptr(new EntryCreationParameters(GetKey(), created))); | 724 CreateNetLogEntryCreationCallback(this, created)); |
728 } | 725 } |
729 | 726 |
730 const net::BoundNetLog& EntryImpl::net_log() const { | 727 const net::BoundNetLog& EntryImpl::net_log() const { |
731 return net_log_; | 728 return net_log_; |
732 } | 729 } |
733 | 730 |
734 // static | 731 // static |
735 int EntryImpl::NumBlocksForEntry(int key_size) { | 732 int EntryImpl::NumBlocksForEntry(int key_size) { |
736 // The longest key that can be stored using one block. | 733 // The longest key that can be stored using one block. |
737 int key1_len = | 734 int key1_len = |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
927 | 924 |
928 // Remove this entry from the list of open entries. | 925 // Remove this entry from the list of open entries. |
929 backend_->OnEntryDestroyBegin(entry_.address()); | 926 backend_->OnEntryDestroyBegin(entry_.address()); |
930 | 927 |
931 if (doomed_) { | 928 if (doomed_) { |
932 DeleteEntryData(true); | 929 DeleteEntryData(true); |
933 } else { | 930 } else { |
934 #if defined(NET_BUILD_STRESS_CACHE) | 931 #if defined(NET_BUILD_STRESS_CACHE) |
935 SanityCheck(); | 932 SanityCheck(); |
936 #endif | 933 #endif |
937 net_log_.AddEvent(net::NetLog::TYPE_ENTRY_CLOSE, NULL); | 934 net_log_.AddEvent(net::NetLog::TYPE_ENTRY_CLOSE); |
938 bool ret = true; | 935 bool ret = true; |
939 for (int index = 0; index < kNumStreams; index++) { | 936 for (int index = 0; index < kNumStreams; index++) { |
940 if (user_buffers_[index].get()) { | 937 if (user_buffers_[index].get()) { |
941 if (!(ret = Flush(index, 0))) | 938 if (!(ret = Flush(index, 0))) |
942 LOG(ERROR) << "Failed to save user data"; | 939 LOG(ERROR) << "Failed to save user data"; |
943 } | 940 } |
944 if (unreported_size_[index]) { | 941 if (unreported_size_[index]) { |
945 backend_->ModifyStorageSize( | 942 backend_->ModifyStorageSize( |
946 entry_.Data()->data_size[index] - unreported_size_[index], | 943 entry_.Data()->data_size[index] - unreported_size_[index], |
947 entry_.Data()->data_size[index]); | 944 entry_.Data()->data_size[index]); |
948 } | 945 } |
949 } | 946 } |
950 | 947 |
951 if (!ret) { | 948 if (!ret) { |
952 // There was a failure writing the actual data. Mark the entry as dirty. | 949 // There was a failure writing the actual data. Mark the entry as dirty. |
953 int current_id = backend_->GetCurrentEntryId(); | 950 int current_id = backend_->GetCurrentEntryId(); |
954 node_.Data()->dirty = current_id == 1 ? -1 : current_id - 1; | 951 node_.Data()->dirty = current_id == 1 ? -1 : current_id - 1; |
955 node_.Store(); | 952 node_.Store(); |
956 } else if (node_.HasData() && !dirty_ && node_.Data()->dirty) { | 953 } else if (node_.HasData() && !dirty_ && node_.Data()->dirty) { |
957 node_.Data()->dirty = 0; | 954 node_.Data()->dirty = 0; |
958 node_.Store(); | 955 node_.Store(); |
959 } | 956 } |
960 } | 957 } |
961 | 958 |
962 Trace("~EntryImpl out 0x%p", reinterpret_cast<void*>(this)); | 959 Trace("~EntryImpl out 0x%p", reinterpret_cast<void*>(this)); |
963 net_log_.EndEvent(net::NetLog::TYPE_DISK_CACHE_ENTRY_IMPL, NULL); | 960 net_log_.EndEvent(net::NetLog::TYPE_DISK_CACHE_ENTRY_IMPL); |
964 backend_->OnEntryDestroyEnd(); | 961 backend_->OnEntryDestroyEnd(); |
965 } | 962 } |
966 | 963 |
967 // ------------------------------------------------------------------------ | 964 // ------------------------------------------------------------------------ |
968 | 965 |
969 int EntryImpl::InternalReadData(int index, int offset, | 966 int EntryImpl::InternalReadData(int index, int offset, |
970 IOBuffer* buf, int buf_len, | 967 IOBuffer* buf, int buf_len, |
971 const CompletionCallback& callback) { | 968 const CompletionCallback& callback) { |
972 DCHECK(node_.Data()->dirty || read_only_); | 969 DCHECK(node_.Data()->dirty || read_only_); |
973 DVLOG(2) << "Read from " << index << " at " << offset << " : " << buf_len; | 970 DVLOG(2) << "Read from " << index << " at " << offset << " : " << buf_len; |
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1540 Trace("%s 0x%p 0x%x 0x%x", msg, reinterpret_cast<void*>(this), | 1537 Trace("%s 0x%p 0x%x 0x%x", msg, reinterpret_cast<void*>(this), |
1541 entry_.address().value(), node_.address().value()); | 1538 entry_.address().value(), node_.address().value()); |
1542 | 1539 |
1543 Trace(" data: 0x%x 0x%x 0x%x", entry_.Data()->data_addr[0], | 1540 Trace(" data: 0x%x 0x%x 0x%x", entry_.Data()->data_addr[0], |
1544 entry_.Data()->data_addr[1], entry_.Data()->long_key); | 1541 entry_.Data()->data_addr[1], entry_.Data()->long_key); |
1545 | 1542 |
1546 Trace(" doomed: %d 0x%x", doomed_, dirty); | 1543 Trace(" doomed: %d 0x%x", doomed_, dirty); |
1547 } | 1544 } |
1548 | 1545 |
1549 } // namespace disk_cache | 1546 } // namespace disk_cache |
OLD | NEW |