| 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 "net/disk_cache/simple/simple_entry_impl.h" | 5 #include "net/disk_cache/simple/simple_entry_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cstring> | 8 #include <cstring> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 net::NetLog* net_log) | 154 net::NetLog* net_log) |
| 155 : backend_(backend->AsWeakPtr()), | 155 : backend_(backend->AsWeakPtr()), |
| 156 cache_type_(cache_type), | 156 cache_type_(cache_type), |
| 157 worker_pool_(backend->worker_pool()), | 157 worker_pool_(backend->worker_pool()), |
| 158 path_(path), | 158 path_(path), |
| 159 entry_hash_(entry_hash), | 159 entry_hash_(entry_hash), |
| 160 use_optimistic_operations_(operations_mode == OPTIMISTIC_OPERATIONS), | 160 use_optimistic_operations_(operations_mode == OPTIMISTIC_OPERATIONS), |
| 161 last_used_(Time::Now()), | 161 last_used_(Time::Now()), |
| 162 last_modified_(last_used_), | 162 last_modified_(last_used_), |
| 163 open_count_(0), | 163 open_count_(0), |
| 164 doomed_(false), |
| 164 state_(STATE_UNINITIALIZED), | 165 state_(STATE_UNINITIALIZED), |
| 165 synchronous_entry_(NULL), | 166 synchronous_entry_(NULL), |
| 166 net_log_(net::BoundNetLog::Make( | 167 net_log_(net::BoundNetLog::Make( |
| 167 net_log, net::NetLog::SOURCE_DISK_CACHE_ENTRY)) { | 168 net_log, net::NetLog::SOURCE_DISK_CACHE_ENTRY)) { |
| 168 COMPILE_ASSERT(arraysize(data_size_) == arraysize(crc32s_end_offset_), | 169 COMPILE_ASSERT(arraysize(data_size_) == arraysize(crc32s_end_offset_), |
| 169 arrays_should_be_same_size); | 170 arrays_should_be_same_size); |
| 170 COMPILE_ASSERT(arraysize(data_size_) == arraysize(crc32s_), | 171 COMPILE_ASSERT(arraysize(data_size_) == arraysize(crc32s_), |
| 171 arrays_should_be_same_size); | 172 arrays_should_be_same_size); |
| 172 COMPILE_ASSERT(arraysize(data_size_) == arraysize(have_written_), | 173 COMPILE_ASSERT(arraysize(data_size_) == arraysize(have_written_), |
| 173 arrays_should_be_same_size); | 174 arrays_should_be_same_size); |
| (...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 518 DCHECK(out_entry); | 519 DCHECK(out_entry); |
| 519 ++open_count_; | 520 ++open_count_; |
| 520 AddRef(); // Balanced in Close() | 521 AddRef(); // Balanced in Close() |
| 521 *out_entry = this; | 522 *out_entry = this; |
| 522 } | 523 } |
| 523 | 524 |
| 524 void SimpleEntryImpl::RemoveSelfFromBackend() { | 525 void SimpleEntryImpl::RemoveSelfFromBackend() { |
| 525 if (!backend_.get()) | 526 if (!backend_.get()) |
| 526 return; | 527 return; |
| 527 backend_->OnDeactivated(this); | 528 backend_->OnDeactivated(this); |
| 528 backend_.reset(); | |
| 529 } | 529 } |
| 530 | 530 |
| 531 void SimpleEntryImpl::MarkAsDoomed() { | 531 void SimpleEntryImpl::MarkAsDoomed() { |
| 532 if (!backend_.get()) | 532 if (!backend_.get()) |
| 533 return; | 533 return; |
| 534 doomed_ = true; |
| 534 backend_->index()->Remove(entry_hash_); | 535 backend_->index()->Remove(entry_hash_); |
| 535 RemoveSelfFromBackend(); | 536 RemoveSelfFromBackend(); |
| 536 } | 537 } |
| 537 | 538 |
| 538 void SimpleEntryImpl::RunNextOperationIfNeeded() { | 539 void SimpleEntryImpl::RunNextOperationIfNeeded() { |
| 539 DCHECK(io_thread_checker_.CalledOnValidThread()); | 540 DCHECK(io_thread_checker_.CalledOnValidThread()); |
| 540 SIMPLE_CACHE_UMA(CUSTOM_COUNTS, | 541 SIMPLE_CACHE_UMA(CUSTOM_COUNTS, |
| 541 "EntryOperationsPending", cache_type_, | 542 "EntryOperationsPending", cache_type_, |
| 542 pending_operations_.size(), 0, 100, 20); | 543 pending_operations_.size(), 0, 100, 20); |
| 543 if (!pending_operations_.empty() && state_ != STATE_IO_PENDING) { | 544 if (!pending_operations_.empty() && state_ != STATE_IO_PENDING) { |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 774 // STATE_IO_PENDING. | 775 // STATE_IO_PENDING. |
| 775 if (!callback.is_null()) | 776 if (!callback.is_null()) |
| 776 MessageLoopProxy::current()->PostTask(FROM_HERE, base::Bind( | 777 MessageLoopProxy::current()->PostTask(FROM_HERE, base::Bind( |
| 777 callback, 0)); | 778 callback, 0)); |
| 778 return; | 779 return; |
| 779 } | 780 } |
| 780 | 781 |
| 781 buf_len = std::min(buf_len, GetDataSize(stream_index) - offset); | 782 buf_len = std::min(buf_len, GetDataSize(stream_index) - offset); |
| 782 | 783 |
| 783 state_ = STATE_IO_PENDING; | 784 state_ = STATE_IO_PENDING; |
| 784 if (backend_.get()) | 785 if (!doomed_ && backend_.get()) |
| 785 backend_->index()->UseIfExists(entry_hash_); | 786 backend_->index()->UseIfExists(entry_hash_); |
| 786 | 787 |
| 787 scoped_ptr<uint32> read_crc32(new uint32()); | 788 scoped_ptr<uint32> read_crc32(new uint32()); |
| 788 scoped_ptr<int> result(new int()); | 789 scoped_ptr<int> result(new int()); |
| 789 scoped_ptr<base::Time> last_used(new base::Time()); | 790 scoped_ptr<base::Time> last_used(new base::Time()); |
| 790 Closure task = base::Bind( | 791 Closure task = base::Bind( |
| 791 &SimpleSynchronousEntry::ReadData, | 792 &SimpleSynchronousEntry::ReadData, |
| 792 base::Unretained(synchronous_entry_), | 793 base::Unretained(synchronous_entry_), |
| 793 SimpleSynchronousEntry::EntryOperationData(stream_index, offset, buf_len), | 794 SimpleSynchronousEntry::EntryOperationData(stream_index, offset, buf_len), |
| 794 make_scoped_refptr(buf), | 795 make_scoped_refptr(buf), |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 834 // callback directly. | 835 // callback directly. |
| 835 MessageLoopProxy::current()->PostTask(FROM_HERE, base::Bind( | 836 MessageLoopProxy::current()->PostTask(FROM_HERE, base::Bind( |
| 836 callback, net::ERR_FAILED)); | 837 callback, net::ERR_FAILED)); |
| 837 } | 838 } |
| 838 // |this| may be destroyed after return here. | 839 // |this| may be destroyed after return here. |
| 839 return; | 840 return; |
| 840 } | 841 } |
| 841 | 842 |
| 842 DCHECK_EQ(STATE_READY, state_); | 843 DCHECK_EQ(STATE_READY, state_); |
| 843 state_ = STATE_IO_PENDING; | 844 state_ = STATE_IO_PENDING; |
| 844 if (backend_.get()) | 845 if (!doomed_ && backend_.get()) |
| 845 backend_->index()->UseIfExists(entry_hash_); | 846 backend_->index()->UseIfExists(entry_hash_); |
| 846 // It is easy to incrementally compute the CRC from [0 .. |offset + buf_len|) | 847 // It is easy to incrementally compute the CRC from [0 .. |offset + buf_len|) |
| 847 // if |offset == 0| or we have already computed the CRC for [0 .. offset). | 848 // if |offset == 0| or we have already computed the CRC for [0 .. offset). |
| 848 // We rely on most write operations being sequential, start to end to compute | 849 // We rely on most write operations being sequential, start to end to compute |
| 849 // the crc of the data. When we write to an entry and close without having | 850 // the crc of the data. When we write to an entry and close without having |
| 850 // done a sequential write, we don't check the CRC on read. | 851 // done a sequential write, we don't check the CRC on read. |
| 851 if (offset == 0 || crc32s_end_offset_[stream_index] == offset) { | 852 if (offset == 0 || crc32s_end_offset_[stream_index] == offset) { |
| 852 uint32 initial_crc = (offset != 0) ? crc32s_[stream_index] | 853 uint32 initial_crc = (offset != 0) ? crc32s_[stream_index] |
| 853 : crc32(0, Z_NULL, 0); | 854 : crc32(0, Z_NULL, 0); |
| 854 if (buf_len > 0) { | 855 if (buf_len > 0) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 886 Closure reply = base::Bind(&SimpleEntryImpl::WriteOperationComplete, | 887 Closure reply = base::Bind(&SimpleEntryImpl::WriteOperationComplete, |
| 887 this, | 888 this, |
| 888 stream_index, | 889 stream_index, |
| 889 callback, | 890 callback, |
| 890 base::Passed(&entry_stat), | 891 base::Passed(&entry_stat), |
| 891 base::Passed(&result)); | 892 base::Passed(&result)); |
| 892 worker_pool_->PostTaskAndReply(FROM_HERE, task, reply); | 893 worker_pool_->PostTaskAndReply(FROM_HERE, task, reply); |
| 893 } | 894 } |
| 894 | 895 |
| 895 void SimpleEntryImpl::DoomEntryInternal(const CompletionCallback& callback) { | 896 void SimpleEntryImpl::DoomEntryInternal(const CompletionCallback& callback) { |
| 897 if (backend_) |
| 898 backend_->OnDoomStart(entry_hash_); |
| 896 PostTaskAndReplyWithResult( | 899 PostTaskAndReplyWithResult( |
| 897 worker_pool_, FROM_HERE, | 900 worker_pool_, FROM_HERE, |
| 898 base::Bind(&SimpleSynchronousEntry::DoomEntry, path_, key_, entry_hash_), | 901 base::Bind(&SimpleSynchronousEntry::DoomEntry, path_, key_, entry_hash_), |
| 899 base::Bind(&SimpleEntryImpl::DoomOperationComplete, this, callback, | 902 base::Bind(&SimpleEntryImpl::DoomOperationComplete, this, callback, |
| 900 state_)); | 903 state_)); |
| 901 state_ = STATE_IO_PENDING; | 904 state_ = STATE_IO_PENDING; |
| 902 } | 905 } |
| 903 | 906 |
| 904 void SimpleEntryImpl::CreationOperationComplete( | 907 void SimpleEntryImpl::CreationOperationComplete( |
| 905 const CompletionCallback& completion_callback, | 908 const CompletionCallback& completion_callback, |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1066 RecordWriteResult(cache_type_, WRITE_RESULT_SYNC_WRITE_FAILURE); | 1069 RecordWriteResult(cache_type_, WRITE_RESULT_SYNC_WRITE_FAILURE); |
| 1067 if (net_log_.IsLoggingAllEvents()) { | 1070 if (net_log_.IsLoggingAllEvents()) { |
| 1068 net_log_.AddEvent(net::NetLog::TYPE_SIMPLE_CACHE_ENTRY_WRITE_END, | 1071 net_log_.AddEvent(net::NetLog::TYPE_SIMPLE_CACHE_ENTRY_WRITE_END, |
| 1069 CreateNetLogReadWriteCompleteCallback(*result)); | 1072 CreateNetLogReadWriteCompleteCallback(*result)); |
| 1070 } | 1073 } |
| 1071 | 1074 |
| 1072 EntryOperationComplete( | 1075 EntryOperationComplete( |
| 1073 stream_index, completion_callback, *entry_stat, result.Pass()); | 1076 stream_index, completion_callback, *entry_stat, result.Pass()); |
| 1074 } | 1077 } |
| 1075 | 1078 |
| 1076 void SimpleEntryImpl::DoomOperationComplete(const CompletionCallback& callback, | 1079 void SimpleEntryImpl::DoomOperationComplete( |
| 1077 State state_to_restore, | 1080 const CompletionCallback& callback, |
| 1078 int result) { | 1081 State state_to_restore, |
| 1082 int result) { |
| 1079 state_ = state_to_restore; | 1083 state_ = state_to_restore; |
| 1080 if (!callback.is_null()) | 1084 if (!callback.is_null()) |
| 1081 callback.Run(result); | 1085 callback.Run(result); |
| 1082 RunNextOperationIfNeeded(); | 1086 RunNextOperationIfNeeded(); |
| 1087 if (backend_) |
| 1088 backend_->OnDoomComplete(entry_hash_); |
| 1083 } | 1089 } |
| 1084 | 1090 |
| 1085 void SimpleEntryImpl::ChecksumOperationComplete( | 1091 void SimpleEntryImpl::ChecksumOperationComplete( |
| 1086 int orig_result, | 1092 int orig_result, |
| 1087 int stream_index, | 1093 int stream_index, |
| 1088 const CompletionCallback& completion_callback, | 1094 const CompletionCallback& completion_callback, |
| 1089 scoped_ptr<int> result) { | 1095 scoped_ptr<int> result) { |
| 1090 DCHECK(io_thread_checker_.CalledOnValidThread()); | 1096 DCHECK(io_thread_checker_.CalledOnValidThread()); |
| 1091 DCHECK(synchronous_entry_); | 1097 DCHECK(synchronous_entry_); |
| 1092 DCHECK_EQ(STATE_IO_PENDING, state_); | 1098 DCHECK_EQ(STATE_IO_PENDING, state_); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1134 const SimpleEntryStat& entry_stat) { | 1140 const SimpleEntryStat& entry_stat) { |
| 1135 DCHECK(io_thread_checker_.CalledOnValidThread()); | 1141 DCHECK(io_thread_checker_.CalledOnValidThread()); |
| 1136 DCHECK(synchronous_entry_); | 1142 DCHECK(synchronous_entry_); |
| 1137 DCHECK_EQ(STATE_READY, state_); | 1143 DCHECK_EQ(STATE_READY, state_); |
| 1138 | 1144 |
| 1139 last_used_ = entry_stat.last_used; | 1145 last_used_ = entry_stat.last_used; |
| 1140 last_modified_ = entry_stat.last_modified; | 1146 last_modified_ = entry_stat.last_modified; |
| 1141 for (int i = 0; i < kSimpleEntryFileCount; ++i) { | 1147 for (int i = 0; i < kSimpleEntryFileCount; ++i) { |
| 1142 data_size_[i] = entry_stat.data_size[i]; | 1148 data_size_[i] = entry_stat.data_size[i]; |
| 1143 } | 1149 } |
| 1144 if (backend_.get()) | 1150 if (!doomed_ && backend_.get()) |
| 1145 backend_->index()->UpdateEntrySize(entry_hash_, GetDiskUsage()); | 1151 backend_->index()->UpdateEntrySize(entry_hash_, GetDiskUsage()); |
| 1146 } | 1152 } |
| 1147 | 1153 |
| 1148 int64 SimpleEntryImpl::GetDiskUsage() const { | 1154 int64 SimpleEntryImpl::GetDiskUsage() const { |
| 1149 int64 file_size = 0; | 1155 int64 file_size = 0; |
| 1150 for (int i = 0; i < kSimpleEntryFileCount; ++i) { | 1156 for (int i = 0; i < kSimpleEntryFileCount; ++i) { |
| 1151 file_size += | 1157 file_size += |
| 1152 simple_util::GetFileSizeFromKeyAndDataSize(key_, data_size_[i]); | 1158 simple_util::GetFileSizeFromKeyAndDataSize(key_, data_size_[i]); |
| 1153 } | 1159 } |
| 1154 return file_size; | 1160 return file_size; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1219 type = conflicting ? WRITE_FOLLOWS_CONFLICTING_WRITE | 1225 type = conflicting ? WRITE_FOLLOWS_CONFLICTING_WRITE |
| 1220 : WRITE_FOLLOWS_NON_CONFLICTING_WRITE; | 1226 : WRITE_FOLLOWS_NON_CONFLICTING_WRITE; |
| 1221 } | 1227 } |
| 1222 } | 1228 } |
| 1223 SIMPLE_CACHE_UMA(ENUMERATION, | 1229 SIMPLE_CACHE_UMA(ENUMERATION, |
| 1224 "WriteDependencyType", cache_type_, | 1230 "WriteDependencyType", cache_type_, |
| 1225 type, WRITE_DEPENDENCY_TYPE_MAX); | 1231 type, WRITE_DEPENDENCY_TYPE_MAX); |
| 1226 } | 1232 } |
| 1227 | 1233 |
| 1228 } // namespace disk_cache | 1234 } // namespace disk_cache |
| OLD | NEW |