| 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 <limits> |
| 9 #include <vector> | 10 #include <vector> |
| 10 | 11 |
| 11 #include "base/bind.h" | 12 #include "base/bind.h" |
| 12 #include "base/bind_helpers.h" | 13 #include "base/bind_helpers.h" |
| 13 #include "base/callback.h" | 14 #include "base/callback.h" |
| 14 #include "base/location.h" | 15 #include "base/location.h" |
| 15 #include "base/logging.h" | 16 #include "base/logging.h" |
| 16 #include "base/single_thread_task_runner.h" | 17 #include "base/single_thread_task_runner.h" |
| 17 #include "base/task_runner.h" | 18 #include "base/task_runner.h" |
| 18 #include "base/task_runner_util.h" | 19 #include "base/task_runner_util.h" |
| 19 #include "base/thread_task_runner_handle.h" | 20 #include "base/thread_task_runner_handle.h" |
| 20 #include "base/time/time.h" | 21 #include "base/time/time.h" |
| 21 #include "net/base/io_buffer.h" | 22 #include "net/base/io_buffer.h" |
| 22 #include "net/base/net_errors.h" | 23 #include "net/base/net_errors.h" |
| 23 #include "net/disk_cache/net_log_parameters.h" | 24 #include "net/disk_cache/net_log_parameters.h" |
| 24 #include "net/disk_cache/simple/simple_backend_impl.h" | 25 #include "net/disk_cache/simple/simple_backend_impl.h" |
| 25 #include "net/disk_cache/simple/simple_histogram_macros.h" | 26 #include "net/disk_cache/simple/simple_histogram_macros.h" |
| 26 #include "net/disk_cache/simple/simple_index.h" | 27 #include "net/disk_cache/simple/simple_index.h" |
| 27 #include "net/disk_cache/simple/simple_net_log_parameters.h" | 28 #include "net/disk_cache/simple/simple_net_log_parameters.h" |
| 28 #include "net/disk_cache/simple/simple_synchronous_entry.h" | 29 #include "net/disk_cache/simple/simple_synchronous_entry.h" |
| 29 #include "net/disk_cache/simple/simple_util.h" | 30 #include "net/disk_cache/simple/simple_util.h" |
| 30 #include "third_party/zlib/zlib.h" | 31 #include "third_party/zlib/zlib.h" |
| 31 | 32 |
| 32 namespace disk_cache { | 33 namespace disk_cache { |
| 33 namespace { | 34 namespace { |
| 34 | 35 |
| 35 // An entry can store sparse data taking up to 1 / kMaxSparseDataSizeDivisor of | 36 // An entry can store sparse data taking up to 1 / kMaxSparseDataSizeDivisor of |
| 36 // the cache. | 37 // the cache. |
| 37 const int64 kMaxSparseDataSizeDivisor = 10; | 38 const int64_t kMaxSparseDataSizeDivisor = 10; |
| 38 | 39 |
| 39 // Used in histograms, please only add entries at the end. | 40 // Used in histograms, please only add entries at the end. |
| 40 enum ReadResult { | 41 enum ReadResult { |
| 41 READ_RESULT_SUCCESS = 0, | 42 READ_RESULT_SUCCESS = 0, |
| 42 READ_RESULT_INVALID_ARGUMENT = 1, | 43 READ_RESULT_INVALID_ARGUMENT = 1, |
| 43 READ_RESULT_NONBLOCK_EMPTY_RETURN = 2, | 44 READ_RESULT_NONBLOCK_EMPTY_RETURN = 2, |
| 44 READ_RESULT_BAD_STATE = 3, | 45 READ_RESULT_BAD_STATE = 3, |
| 45 READ_RESULT_FAST_EMPTY_RETURN = 4, | 46 READ_RESULT_FAST_EMPTY_RETURN = 4, |
| 46 READ_RESULT_SYNC_READ_FAILURE = 5, | 47 READ_RESULT_SYNC_READ_FAILURE = 5, |
| 47 READ_RESULT_SYNC_CHECKSUM_FAILURE = 6, | 48 READ_RESULT_SYNC_CHECKSUM_FAILURE = 6, |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 } | 158 } |
| 158 | 159 |
| 159 private: | 160 private: |
| 160 SimpleEntryImpl* const entry_; | 161 SimpleEntryImpl* const entry_; |
| 161 }; | 162 }; |
| 162 | 163 |
| 163 SimpleEntryImpl::ActiveEntryProxy::~ActiveEntryProxy() {} | 164 SimpleEntryImpl::ActiveEntryProxy::~ActiveEntryProxy() {} |
| 164 | 165 |
| 165 SimpleEntryImpl::SimpleEntryImpl(net::CacheType cache_type, | 166 SimpleEntryImpl::SimpleEntryImpl(net::CacheType cache_type, |
| 166 const FilePath& path, | 167 const FilePath& path, |
| 167 const uint64 entry_hash, | 168 const uint64_t entry_hash, |
| 168 OperationsMode operations_mode, | 169 OperationsMode operations_mode, |
| 169 SimpleBackendImpl* backend, | 170 SimpleBackendImpl* backend, |
| 170 net::NetLog* net_log) | 171 net::NetLog* net_log) |
| 171 : backend_(backend->AsWeakPtr()), | 172 : backend_(backend->AsWeakPtr()), |
| 172 cache_type_(cache_type), | 173 cache_type_(cache_type), |
| 173 worker_pool_(backend->worker_pool()), | 174 worker_pool_(backend->worker_pool()), |
| 174 path_(path), | 175 path_(path), |
| 175 entry_hash_(entry_hash), | 176 entry_hash_(entry_hash), |
| 176 use_optimistic_operations_(operations_mode == OPTIMISTIC_OPERATIONS), | 177 use_optimistic_operations_(operations_mode == OPTIMISTIC_OPERATIONS), |
| 177 last_used_(Time::Now()), | 178 last_used_(Time::Now()), |
| 178 last_modified_(last_used_), | 179 last_modified_(last_used_), |
| 179 sparse_data_size_(0), | 180 sparse_data_size_(0), |
| 180 open_count_(0), | 181 open_count_(0), |
| 181 doomed_(false), | 182 doomed_(false), |
| 182 state_(STATE_UNINITIALIZED), | 183 state_(STATE_UNINITIALIZED), |
| 183 synchronous_entry_(NULL), | 184 synchronous_entry_(NULL), |
| 184 net_log_(net::BoundNetLog::Make( | 185 net_log_(net::BoundNetLog::Make(net_log, |
| 185 net_log, net::NetLog::SOURCE_DISK_CACHE_ENTRY)), | 186 net::NetLog::SOURCE_DISK_CACHE_ENTRY)), |
| 186 stream_0_data_(new net::GrowableIOBuffer()) { | 187 stream_0_data_(new net::GrowableIOBuffer()) { |
| 187 static_assert(arraysize(data_size_) == arraysize(crc32s_end_offset_), | 188 static_assert(arraysize(data_size_) == arraysize(crc32s_end_offset_), |
| 188 "arrays should be the same size"); | 189 "arrays should be the same size"); |
| 189 static_assert(arraysize(data_size_) == arraysize(crc32s_), | 190 static_assert(arraysize(data_size_) == arraysize(crc32s_), |
| 190 "arrays should be the same size"); | 191 "arrays should be the same size"); |
| 191 static_assert(arraysize(data_size_) == arraysize(have_written_), | 192 static_assert(arraysize(data_size_) == arraysize(have_written_), |
| 192 "arrays should be the same size"); | 193 "arrays should be the same size"); |
| 193 static_assert(arraysize(data_size_) == arraysize(crc_check_state_), | 194 static_assert(arraysize(data_size_) == arraysize(crc_check_state_), |
| 194 "arrays should be the same size"); | 195 "arrays should be the same size"); |
| 195 MakeUninitialized(); | 196 MakeUninitialized(); |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 326 Time SimpleEntryImpl::GetLastUsed() const { | 327 Time SimpleEntryImpl::GetLastUsed() const { |
| 327 DCHECK(io_thread_checker_.CalledOnValidThread()); | 328 DCHECK(io_thread_checker_.CalledOnValidThread()); |
| 328 return last_used_; | 329 return last_used_; |
| 329 } | 330 } |
| 330 | 331 |
| 331 Time SimpleEntryImpl::GetLastModified() const { | 332 Time SimpleEntryImpl::GetLastModified() const { |
| 332 DCHECK(io_thread_checker_.CalledOnValidThread()); | 333 DCHECK(io_thread_checker_.CalledOnValidThread()); |
| 333 return last_modified_; | 334 return last_modified_; |
| 334 } | 335 } |
| 335 | 336 |
| 336 int32 SimpleEntryImpl::GetDataSize(int stream_index) const { | 337 int32_t SimpleEntryImpl::GetDataSize(int stream_index) const { |
| 337 DCHECK(io_thread_checker_.CalledOnValidThread()); | 338 DCHECK(io_thread_checker_.CalledOnValidThread()); |
| 338 DCHECK_LE(0, data_size_[stream_index]); | 339 DCHECK_LE(0, data_size_[stream_index]); |
| 339 return data_size_[stream_index]; | 340 return data_size_[stream_index]; |
| 340 } | 341 } |
| 341 | 342 |
| 342 int SimpleEntryImpl::ReadData(int stream_index, | 343 int SimpleEntryImpl::ReadData(int stream_index, |
| 343 int offset, | 344 int offset, |
| 344 net::IOBuffer* buf, | 345 net::IOBuffer* buf, |
| 345 int buf_len, | 346 int buf_len, |
| 346 const CompletionCallback& callback) { | 347 const CompletionCallback& callback) { |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 464 stream_index, | 465 stream_index, |
| 465 offset, | 466 offset, |
| 466 buf_len, | 467 buf_len, |
| 467 op_buf.get(), | 468 op_buf.get(), |
| 468 truncate, | 469 truncate, |
| 469 optimistic, | 470 optimistic, |
| 470 op_callback)); | 471 op_callback)); |
| 471 return ret_value; | 472 return ret_value; |
| 472 } | 473 } |
| 473 | 474 |
| 474 int SimpleEntryImpl::ReadSparseData(int64 offset, | 475 int SimpleEntryImpl::ReadSparseData(int64_t offset, |
| 475 net::IOBuffer* buf, | 476 net::IOBuffer* buf, |
| 476 int buf_len, | 477 int buf_len, |
| 477 const CompletionCallback& callback) { | 478 const CompletionCallback& callback) { |
| 478 DCHECK(io_thread_checker_.CalledOnValidThread()); | 479 DCHECK(io_thread_checker_.CalledOnValidThread()); |
| 479 | 480 |
| 480 ScopedOperationRunner operation_runner(this); | 481 ScopedOperationRunner operation_runner(this); |
| 481 pending_operations_.push(SimpleEntryOperation::ReadSparseOperation( | 482 pending_operations_.push(SimpleEntryOperation::ReadSparseOperation( |
| 482 this, offset, buf_len, buf, callback)); | 483 this, offset, buf_len, buf, callback)); |
| 483 return net::ERR_IO_PENDING; | 484 return net::ERR_IO_PENDING; |
| 484 } | 485 } |
| 485 | 486 |
| 486 int SimpleEntryImpl::WriteSparseData(int64 offset, | 487 int SimpleEntryImpl::WriteSparseData(int64_t offset, |
| 487 net::IOBuffer* buf, | 488 net::IOBuffer* buf, |
| 488 int buf_len, | 489 int buf_len, |
| 489 const CompletionCallback& callback) { | 490 const CompletionCallback& callback) { |
| 490 DCHECK(io_thread_checker_.CalledOnValidThread()); | 491 DCHECK(io_thread_checker_.CalledOnValidThread()); |
| 491 | 492 |
| 492 ScopedOperationRunner operation_runner(this); | 493 ScopedOperationRunner operation_runner(this); |
| 493 pending_operations_.push(SimpleEntryOperation::WriteSparseOperation( | 494 pending_operations_.push(SimpleEntryOperation::WriteSparseOperation( |
| 494 this, offset, buf_len, buf, callback)); | 495 this, offset, buf_len, buf, callback)); |
| 495 return net::ERR_IO_PENDING; | 496 return net::ERR_IO_PENDING; |
| 496 } | 497 } |
| 497 | 498 |
| 498 int SimpleEntryImpl::GetAvailableRange(int64 offset, | 499 int SimpleEntryImpl::GetAvailableRange(int64_t offset, |
| 499 int len, | 500 int len, |
| 500 int64* start, | 501 int64_t* start, |
| 501 const CompletionCallback& callback) { | 502 const CompletionCallback& callback) { |
| 502 DCHECK(io_thread_checker_.CalledOnValidThread()); | 503 DCHECK(io_thread_checker_.CalledOnValidThread()); |
| 503 | 504 |
| 504 ScopedOperationRunner operation_runner(this); | 505 ScopedOperationRunner operation_runner(this); |
| 505 pending_operations_.push(SimpleEntryOperation::GetAvailableRangeOperation( | 506 pending_operations_.push(SimpleEntryOperation::GetAvailableRangeOperation( |
| 506 this, offset, len, start, callback)); | 507 this, offset, len, start, callback)); |
| 507 return net::ERR_IO_PENDING; | 508 return net::ERR_IO_PENDING; |
| 508 } | 509 } |
| 509 | 510 |
| 510 bool SimpleEntryImpl::CouldBeSparse() const { | 511 bool SimpleEntryImpl::CouldBeSparse() const { |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 758 crc32s_to_write(new std::vector<CRCRecord>()); | 759 crc32s_to_write(new std::vector<CRCRecord>()); |
| 759 | 760 |
| 760 net_log_.AddEvent(net::NetLog::TYPE_SIMPLE_CACHE_ENTRY_CLOSE_BEGIN); | 761 net_log_.AddEvent(net::NetLog::TYPE_SIMPLE_CACHE_ENTRY_CLOSE_BEGIN); |
| 761 | 762 |
| 762 if (state_ == STATE_READY) { | 763 if (state_ == STATE_READY) { |
| 763 DCHECK(synchronous_entry_); | 764 DCHECK(synchronous_entry_); |
| 764 state_ = STATE_IO_PENDING; | 765 state_ = STATE_IO_PENDING; |
| 765 for (int i = 0; i < kSimpleEntryStreamCount; ++i) { | 766 for (int i = 0; i < kSimpleEntryStreamCount; ++i) { |
| 766 if (have_written_[i]) { | 767 if (have_written_[i]) { |
| 767 if (GetDataSize(i) == crc32s_end_offset_[i]) { | 768 if (GetDataSize(i) == crc32s_end_offset_[i]) { |
| 768 int32 crc = GetDataSize(i) == 0 ? crc32(0, Z_NULL, 0) : crc32s_[i]; | 769 int32_t crc = GetDataSize(i) == 0 ? crc32(0, Z_NULL, 0) : crc32s_[i]; |
| 769 crc32s_to_write->push_back(CRCRecord(i, true, crc)); | 770 crc32s_to_write->push_back(CRCRecord(i, true, crc)); |
| 770 } else { | 771 } else { |
| 771 crc32s_to_write->push_back(CRCRecord(i, false, 0)); | 772 crc32s_to_write->push_back(CRCRecord(i, false, 0)); |
| 772 } | 773 } |
| 773 } | 774 } |
| 774 } | 775 } |
| 775 } else { | 776 } else { |
| 776 DCHECK(STATE_UNINITIALIZED == state_ || STATE_FAILURE == state_); | 777 DCHECK(STATE_UNINITIALIZED == state_ || STATE_FAILURE == state_); |
| 777 } | 778 } |
| 778 | 779 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 851 base::ThreadTaskRunnerHandle::Get()->PostTask( | 852 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 852 FROM_HERE, base::Bind(callback, ret_value)); | 853 FROM_HERE, base::Bind(callback, ret_value)); |
| 853 } | 854 } |
| 854 return; | 855 return; |
| 855 } | 856 } |
| 856 | 857 |
| 857 state_ = STATE_IO_PENDING; | 858 state_ = STATE_IO_PENDING; |
| 858 if (!doomed_ && backend_.get()) | 859 if (!doomed_ && backend_.get()) |
| 859 backend_->index()->UseIfExists(entry_hash_); | 860 backend_->index()->UseIfExists(entry_hash_); |
| 860 | 861 |
| 861 scoped_ptr<uint32> read_crc32(new uint32()); | 862 scoped_ptr<uint32_t> read_crc32(new uint32_t()); |
| 862 scoped_ptr<int> result(new int()); | 863 scoped_ptr<int> result(new int()); |
| 863 scoped_ptr<SimpleEntryStat> entry_stat( | 864 scoped_ptr<SimpleEntryStat> entry_stat( |
| 864 new SimpleEntryStat(last_used_, last_modified_, data_size_, | 865 new SimpleEntryStat(last_used_, last_modified_, data_size_, |
| 865 sparse_data_size_)); | 866 sparse_data_size_)); |
| 866 Closure task = base::Bind( | 867 Closure task = base::Bind( |
| 867 &SimpleSynchronousEntry::ReadData, | 868 &SimpleSynchronousEntry::ReadData, |
| 868 base::Unretained(synchronous_entry_), | 869 base::Unretained(synchronous_entry_), |
| 869 SimpleSynchronousEntry::EntryOperationData(stream_index, offset, buf_len), | 870 SimpleSynchronousEntry::EntryOperationData(stream_index, offset, buf_len), |
| 870 make_scoped_refptr(buf), | 871 make_scoped_refptr(buf), |
| 871 read_crc32.get(), | 872 read_crc32.get(), |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 920 int ret_value = SetStream0Data(buf, offset, buf_len, truncate); | 921 int ret_value = SetStream0Data(buf, offset, buf_len, truncate); |
| 921 if (!callback.is_null()) { | 922 if (!callback.is_null()) { |
| 922 base::ThreadTaskRunnerHandle::Get()->PostTask( | 923 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 923 FROM_HERE, base::Bind(callback, ret_value)); | 924 FROM_HERE, base::Bind(callback, ret_value)); |
| 924 } | 925 } |
| 925 return; | 926 return; |
| 926 } | 927 } |
| 927 | 928 |
| 928 // Ignore zero-length writes that do not change the file size. | 929 // Ignore zero-length writes that do not change the file size. |
| 929 if (buf_len == 0) { | 930 if (buf_len == 0) { |
| 930 int32 data_size = data_size_[stream_index]; | 931 int32_t data_size = data_size_[stream_index]; |
| 931 if (truncate ? (offset == data_size) : (offset <= data_size)) { | 932 if (truncate ? (offset == data_size) : (offset <= data_size)) { |
| 932 RecordWriteResult(cache_type_, WRITE_RESULT_FAST_EMPTY_RETURN); | 933 RecordWriteResult(cache_type_, WRITE_RESULT_FAST_EMPTY_RETURN); |
| 933 if (!callback.is_null()) { | 934 if (!callback.is_null()) { |
| 934 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, | 935 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 935 base::Bind(callback, 0)); | 936 base::Bind(callback, 0)); |
| 936 } | 937 } |
| 937 return; | 938 return; |
| 938 } | 939 } |
| 939 } | 940 } |
| 940 state_ = STATE_IO_PENDING; | 941 state_ = STATE_IO_PENDING; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 976 Closure reply = base::Bind(&SimpleEntryImpl::WriteOperationComplete, | 977 Closure reply = base::Bind(&SimpleEntryImpl::WriteOperationComplete, |
| 977 this, | 978 this, |
| 978 stream_index, | 979 stream_index, |
| 979 callback, | 980 callback, |
| 980 base::Passed(&entry_stat), | 981 base::Passed(&entry_stat), |
| 981 base::Passed(&result)); | 982 base::Passed(&result)); |
| 982 worker_pool_->PostTaskAndReply(FROM_HERE, task, reply); | 983 worker_pool_->PostTaskAndReply(FROM_HERE, task, reply); |
| 983 } | 984 } |
| 984 | 985 |
| 985 void SimpleEntryImpl::ReadSparseDataInternal( | 986 void SimpleEntryImpl::ReadSparseDataInternal( |
| 986 int64 sparse_offset, | 987 int64_t sparse_offset, |
| 987 net::IOBuffer* buf, | 988 net::IOBuffer* buf, |
| 988 int buf_len, | 989 int buf_len, |
| 989 const CompletionCallback& callback) { | 990 const CompletionCallback& callback) { |
| 990 DCHECK(io_thread_checker_.CalledOnValidThread()); | 991 DCHECK(io_thread_checker_.CalledOnValidThread()); |
| 991 ScopedOperationRunner operation_runner(this); | 992 ScopedOperationRunner operation_runner(this); |
| 992 | 993 |
| 993 DCHECK_EQ(STATE_READY, state_); | 994 DCHECK_EQ(STATE_READY, state_); |
| 994 state_ = STATE_IO_PENDING; | 995 state_ = STATE_IO_PENDING; |
| 995 | 996 |
| 996 scoped_ptr<int> result(new int()); | 997 scoped_ptr<int> result(new int()); |
| 997 scoped_ptr<base::Time> last_used(new base::Time()); | 998 scoped_ptr<base::Time> last_used(new base::Time()); |
| 998 Closure task = base::Bind(&SimpleSynchronousEntry::ReadSparseData, | 999 Closure task = base::Bind(&SimpleSynchronousEntry::ReadSparseData, |
| 999 base::Unretained(synchronous_entry_), | 1000 base::Unretained(synchronous_entry_), |
| 1000 SimpleSynchronousEntry::EntryOperationData( | 1001 SimpleSynchronousEntry::EntryOperationData( |
| 1001 sparse_offset, buf_len), | 1002 sparse_offset, buf_len), |
| 1002 make_scoped_refptr(buf), | 1003 make_scoped_refptr(buf), |
| 1003 last_used.get(), | 1004 last_used.get(), |
| 1004 result.get()); | 1005 result.get()); |
| 1005 Closure reply = base::Bind(&SimpleEntryImpl::ReadSparseOperationComplete, | 1006 Closure reply = base::Bind(&SimpleEntryImpl::ReadSparseOperationComplete, |
| 1006 this, | 1007 this, |
| 1007 callback, | 1008 callback, |
| 1008 base::Passed(&last_used), | 1009 base::Passed(&last_used), |
| 1009 base::Passed(&result)); | 1010 base::Passed(&result)); |
| 1010 worker_pool_->PostTaskAndReply(FROM_HERE, task, reply); | 1011 worker_pool_->PostTaskAndReply(FROM_HERE, task, reply); |
| 1011 } | 1012 } |
| 1012 | 1013 |
| 1013 void SimpleEntryImpl::WriteSparseDataInternal( | 1014 void SimpleEntryImpl::WriteSparseDataInternal( |
| 1014 int64 sparse_offset, | 1015 int64_t sparse_offset, |
| 1015 net::IOBuffer* buf, | 1016 net::IOBuffer* buf, |
| 1016 int buf_len, | 1017 int buf_len, |
| 1017 const CompletionCallback& callback) { | 1018 const CompletionCallback& callback) { |
| 1018 DCHECK(io_thread_checker_.CalledOnValidThread()); | 1019 DCHECK(io_thread_checker_.CalledOnValidThread()); |
| 1019 ScopedOperationRunner operation_runner(this); | 1020 ScopedOperationRunner operation_runner(this); |
| 1020 | 1021 |
| 1021 DCHECK_EQ(STATE_READY, state_); | 1022 DCHECK_EQ(STATE_READY, state_); |
| 1022 state_ = STATE_IO_PENDING; | 1023 state_ = STATE_IO_PENDING; |
| 1023 | 1024 |
| 1024 uint64 max_sparse_data_size = kint64max; | 1025 uint64_t max_sparse_data_size = std::numeric_limits<int64_t>::max(); |
| 1025 if (backend_.get()) { | 1026 if (backend_.get()) { |
| 1026 uint64 max_cache_size = backend_->index()->max_size(); | 1027 uint64_t max_cache_size = backend_->index()->max_size(); |
| 1027 max_sparse_data_size = max_cache_size / kMaxSparseDataSizeDivisor; | 1028 max_sparse_data_size = max_cache_size / kMaxSparseDataSizeDivisor; |
| 1028 } | 1029 } |
| 1029 | 1030 |
| 1030 scoped_ptr<SimpleEntryStat> entry_stat( | 1031 scoped_ptr<SimpleEntryStat> entry_stat( |
| 1031 new SimpleEntryStat(last_used_, last_modified_, data_size_, | 1032 new SimpleEntryStat(last_used_, last_modified_, data_size_, |
| 1032 sparse_data_size_)); | 1033 sparse_data_size_)); |
| 1033 | 1034 |
| 1034 last_used_ = last_modified_ = base::Time::Now(); | 1035 last_used_ = last_modified_ = base::Time::Now(); |
| 1035 | 1036 |
| 1036 scoped_ptr<int> result(new int()); | 1037 scoped_ptr<int> result(new int()); |
| 1037 Closure task = base::Bind(&SimpleSynchronousEntry::WriteSparseData, | 1038 Closure task = base::Bind(&SimpleSynchronousEntry::WriteSparseData, |
| 1038 base::Unretained(synchronous_entry_), | 1039 base::Unretained(synchronous_entry_), |
| 1039 SimpleSynchronousEntry::EntryOperationData( | 1040 SimpleSynchronousEntry::EntryOperationData( |
| 1040 sparse_offset, buf_len), | 1041 sparse_offset, buf_len), |
| 1041 make_scoped_refptr(buf), | 1042 make_scoped_refptr(buf), |
| 1042 max_sparse_data_size, | 1043 max_sparse_data_size, |
| 1043 entry_stat.get(), | 1044 entry_stat.get(), |
| 1044 result.get()); | 1045 result.get()); |
| 1045 Closure reply = base::Bind(&SimpleEntryImpl::WriteSparseOperationComplete, | 1046 Closure reply = base::Bind(&SimpleEntryImpl::WriteSparseOperationComplete, |
| 1046 this, | 1047 this, |
| 1047 callback, | 1048 callback, |
| 1048 base::Passed(&entry_stat), | 1049 base::Passed(&entry_stat), |
| 1049 base::Passed(&result)); | 1050 base::Passed(&result)); |
| 1050 worker_pool_->PostTaskAndReply(FROM_HERE, task, reply); | 1051 worker_pool_->PostTaskAndReply(FROM_HERE, task, reply); |
| 1051 } | 1052 } |
| 1052 | 1053 |
| 1053 void SimpleEntryImpl::GetAvailableRangeInternal( | 1054 void SimpleEntryImpl::GetAvailableRangeInternal( |
| 1054 int64 sparse_offset, | 1055 int64_t sparse_offset, |
| 1055 int len, | 1056 int len, |
| 1056 int64* out_start, | 1057 int64_t* out_start, |
| 1057 const CompletionCallback& callback) { | 1058 const CompletionCallback& callback) { |
| 1058 DCHECK(io_thread_checker_.CalledOnValidThread()); | 1059 DCHECK(io_thread_checker_.CalledOnValidThread()); |
| 1059 ScopedOperationRunner operation_runner(this); | 1060 ScopedOperationRunner operation_runner(this); |
| 1060 | 1061 |
| 1061 DCHECK_EQ(STATE_READY, state_); | 1062 DCHECK_EQ(STATE_READY, state_); |
| 1062 state_ = STATE_IO_PENDING; | 1063 state_ = STATE_IO_PENDING; |
| 1063 | 1064 |
| 1064 scoped_ptr<int> result(new int()); | 1065 scoped_ptr<int> result(new int()); |
| 1065 Closure task = base::Bind(&SimpleSynchronousEntry::GetAvailableRange, | 1066 Closure task = base::Bind(&SimpleSynchronousEntry::GetAvailableRange, |
| 1066 base::Unretained(synchronous_entry_), | 1067 base::Unretained(synchronous_entry_), |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1159 base::ThreadTaskRunnerHandle::Get()->PostTask( | 1160 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 1160 FROM_HERE, base::Bind(completion_callback, *result)); | 1161 FROM_HERE, base::Bind(completion_callback, *result)); |
| 1161 } | 1162 } |
| 1162 RunNextOperationIfNeeded(); | 1163 RunNextOperationIfNeeded(); |
| 1163 } | 1164 } |
| 1164 | 1165 |
| 1165 void SimpleEntryImpl::ReadOperationComplete( | 1166 void SimpleEntryImpl::ReadOperationComplete( |
| 1166 int stream_index, | 1167 int stream_index, |
| 1167 int offset, | 1168 int offset, |
| 1168 const CompletionCallback& completion_callback, | 1169 const CompletionCallback& completion_callback, |
| 1169 scoped_ptr<uint32> read_crc32, | 1170 scoped_ptr<uint32_t> read_crc32, |
| 1170 scoped_ptr<SimpleEntryStat> entry_stat, | 1171 scoped_ptr<SimpleEntryStat> entry_stat, |
| 1171 scoped_ptr<int> result) { | 1172 scoped_ptr<int> result) { |
| 1172 DCHECK(io_thread_checker_.CalledOnValidThread()); | 1173 DCHECK(io_thread_checker_.CalledOnValidThread()); |
| 1173 DCHECK(synchronous_entry_); | 1174 DCHECK(synchronous_entry_); |
| 1174 DCHECK_EQ(STATE_IO_PENDING, state_); | 1175 DCHECK_EQ(STATE_IO_PENDING, state_); |
| 1175 DCHECK(read_crc32); | 1176 DCHECK(read_crc32); |
| 1176 DCHECK(result); | 1177 DCHECK(result); |
| 1177 | 1178 |
| 1178 if (*result > 0 && | 1179 if (*result > 0 && |
| 1179 crc_check_state_[stream_index] == CRC_CHECK_NEVER_READ_AT_ALL) { | 1180 crc_check_state_[stream_index] == CRC_CHECK_NEVER_READ_AT_ALL) { |
| 1180 crc_check_state_[stream_index] = CRC_CHECK_NEVER_READ_TO_END; | 1181 crc_check_state_[stream_index] = CRC_CHECK_NEVER_READ_TO_END; |
| 1181 } | 1182 } |
| 1182 | 1183 |
| 1183 if (*result > 0 && crc32s_end_offset_[stream_index] == offset) { | 1184 if (*result > 0 && crc32s_end_offset_[stream_index] == offset) { |
| 1184 uint32 current_crc = offset == 0 ? crc32(0, Z_NULL, 0) | 1185 uint32_t current_crc = |
| 1185 : crc32s_[stream_index]; | 1186 offset == 0 ? crc32(0, Z_NULL, 0) : crc32s_[stream_index]; |
| 1186 crc32s_[stream_index] = crc32_combine(current_crc, *read_crc32, *result); | 1187 crc32s_[stream_index] = crc32_combine(current_crc, *read_crc32, *result); |
| 1187 crc32s_end_offset_[stream_index] += *result; | 1188 crc32s_end_offset_[stream_index] += *result; |
| 1188 if (!have_written_[stream_index] && | 1189 if (!have_written_[stream_index] && |
| 1189 GetDataSize(stream_index) == crc32s_end_offset_[stream_index]) { | 1190 GetDataSize(stream_index) == crc32s_end_offset_[stream_index]) { |
| 1190 // We have just read a file from start to finish, and so we have | 1191 // We have just read a file from start to finish, and so we have |
| 1191 // computed a crc of the entire file. We can check it now. If a cache | 1192 // computed a crc of the entire file. We can check it now. If a cache |
| 1192 // entry has a single reader, the normal pattern is to read from start | 1193 // entry has a single reader, the normal pattern is to read from start |
| 1193 // to finish. | 1194 // to finish. |
| 1194 | 1195 |
| 1195 net_log_.AddEvent(net::NetLog::TYPE_SIMPLE_CACHE_ENTRY_CHECKSUM_BEGIN); | 1196 net_log_.AddEvent(net::NetLog::TYPE_SIMPLE_CACHE_ENTRY_CHECKSUM_BEGIN); |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1358 last_used_ = entry_stat.last_used(); | 1359 last_used_ = entry_stat.last_used(); |
| 1359 last_modified_ = entry_stat.last_modified(); | 1360 last_modified_ = entry_stat.last_modified(); |
| 1360 for (int i = 0; i < kSimpleEntryStreamCount; ++i) { | 1361 for (int i = 0; i < kSimpleEntryStreamCount; ++i) { |
| 1361 data_size_[i] = entry_stat.data_size(i); | 1362 data_size_[i] = entry_stat.data_size(i); |
| 1362 } | 1363 } |
| 1363 sparse_data_size_ = entry_stat.sparse_data_size(); | 1364 sparse_data_size_ = entry_stat.sparse_data_size(); |
| 1364 if (!doomed_ && backend_.get()) | 1365 if (!doomed_ && backend_.get()) |
| 1365 backend_->index()->UpdateEntrySize(entry_hash_, GetDiskUsage()); | 1366 backend_->index()->UpdateEntrySize(entry_hash_, GetDiskUsage()); |
| 1366 } | 1367 } |
| 1367 | 1368 |
| 1368 int64 SimpleEntryImpl::GetDiskUsage() const { | 1369 int64_t SimpleEntryImpl::GetDiskUsage() const { |
| 1369 int64 file_size = 0; | 1370 int64_t file_size = 0; |
| 1370 for (int i = 0; i < kSimpleEntryStreamCount; ++i) { | 1371 for (int i = 0; i < kSimpleEntryStreamCount; ++i) { |
| 1371 file_size += | 1372 file_size += |
| 1372 simple_util::GetFileSizeFromKeyAndDataSize(key_, data_size_[i]); | 1373 simple_util::GetFileSizeFromKeyAndDataSize(key_, data_size_[i]); |
| 1373 } | 1374 } |
| 1374 file_size += sparse_data_size_; | 1375 file_size += sparse_data_size_; |
| 1375 return file_size; | 1376 return file_size; |
| 1376 } | 1377 } |
| 1377 | 1378 |
| 1378 void SimpleEntryImpl::RecordReadIsParallelizable( | 1379 void SimpleEntryImpl::RecordReadIsParallelizable( |
| 1379 const SimpleEntryOperation& operation) const { | 1380 const SimpleEntryOperation& operation) const { |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1503 void SimpleEntryImpl::AdvanceCrc(net::IOBuffer* buffer, | 1504 void SimpleEntryImpl::AdvanceCrc(net::IOBuffer* buffer, |
| 1504 int offset, | 1505 int offset, |
| 1505 int length, | 1506 int length, |
| 1506 int stream_index) { | 1507 int stream_index) { |
| 1507 // It is easy to incrementally compute the CRC from [0 .. |offset + buf_len|) | 1508 // It is easy to incrementally compute the CRC from [0 .. |offset + buf_len|) |
| 1508 // if |offset == 0| or we have already computed the CRC for [0 .. offset). | 1509 // if |offset == 0| or we have already computed the CRC for [0 .. offset). |
| 1509 // We rely on most write operations being sequential, start to end to compute | 1510 // We rely on most write operations being sequential, start to end to compute |
| 1510 // the crc of the data. When we write to an entry and close without having | 1511 // the crc of the data. When we write to an entry and close without having |
| 1511 // done a sequential write, we don't check the CRC on read. | 1512 // done a sequential write, we don't check the CRC on read. |
| 1512 if (offset == 0 || crc32s_end_offset_[stream_index] == offset) { | 1513 if (offset == 0 || crc32s_end_offset_[stream_index] == offset) { |
| 1513 uint32 initial_crc = | 1514 uint32_t initial_crc = |
| 1514 (offset != 0) ? crc32s_[stream_index] : crc32(0, Z_NULL, 0); | 1515 (offset != 0) ? crc32s_[stream_index] : crc32(0, Z_NULL, 0); |
| 1515 if (length > 0) { | 1516 if (length > 0) { |
| 1516 crc32s_[stream_index] = crc32( | 1517 crc32s_[stream_index] = crc32( |
| 1517 initial_crc, reinterpret_cast<const Bytef*>(buffer->data()), length); | 1518 initial_crc, reinterpret_cast<const Bytef*>(buffer->data()), length); |
| 1518 } | 1519 } |
| 1519 crc32s_end_offset_[stream_index] = offset + length; | 1520 crc32s_end_offset_[stream_index] = offset + length; |
| 1520 } else if (offset < crc32s_end_offset_[stream_index]) { | 1521 } else if (offset < crc32s_end_offset_[stream_index]) { |
| 1521 // If a range for which the crc32 was already computed is rewritten, the | 1522 // If a range for which the crc32 was already computed is rewritten, the |
| 1522 // computation of the crc32 need to start from 0 again. | 1523 // computation of the crc32 need to start from 0 again. |
| 1523 crc32s_end_offset_[stream_index] = 0; | 1524 crc32s_end_offset_[stream_index] = 0; |
| 1524 } | 1525 } |
| 1525 } | 1526 } |
| 1526 | 1527 |
| 1527 } // namespace disk_cache | 1528 } // namespace disk_cache |
| OLD | NEW |