| Index: net/disk_cache/simple/simple_entry_impl.cc
|
| diff --git a/net/disk_cache/simple/simple_entry_impl.cc b/net/disk_cache/simple/simple_entry_impl.cc
|
| index 5cf4a7e4e7b1fe24fc72a902dcdd4930203c17e9..d0e9dadf9fb87ff6adaf2d8edf9093b1048c142d 100644
|
| --- a/net/disk_cache/simple/simple_entry_impl.cc
|
| +++ b/net/disk_cache/simple/simple_entry_impl.cc
|
| @@ -113,32 +113,17 @@ std::string SimpleEntryImpl::GetKey() const {
|
|
|
| Time SimpleEntryImpl::GetLastUsed() const {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| - if (synchronous_entry_in_use_by_worker_) {
|
| - NOTIMPLEMENTED() << ": Synchronous operations overlapping an asynchronous "
|
| - << "operation.";
|
| - NOTREACHED();
|
| - }
|
| - return synchronous_entry_->last_used();
|
| + return last_used_;
|
| }
|
|
|
| Time SimpleEntryImpl::GetLastModified() const {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| - if (synchronous_entry_in_use_by_worker_) {
|
| - NOTIMPLEMENTED() << ": Synchronous operations overlapping an asynchronous "
|
| - << "operation.";
|
| - NOTREACHED();
|
| - }
|
| - return synchronous_entry_->last_modified();
|
| + return last_modified_;
|
| }
|
|
|
| int32 SimpleEntryImpl::GetDataSize(int index) const {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| - if (synchronous_entry_in_use_by_worker_) {
|
| - NOTIMPLEMENTED() << ": Synchronous operations overlapping an asynchronous "
|
| - << "operation.";
|
| - NOTREACHED();
|
| - }
|
| - return synchronous_entry_->data_size(index);
|
| + return data_size_[index];
|
| }
|
|
|
| int SimpleEntryImpl::ReadData(int index,
|
| @@ -243,11 +228,12 @@ int SimpleEntryImpl::ReadyForSparseIO(const CompletionCallback& callback) {
|
| SimpleEntryImpl::SimpleEntryImpl(
|
| SimpleSynchronousEntry* synchronous_entry)
|
| : ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)),
|
| + path_(synchronous_entry->path()),
|
| key_(synchronous_entry->key()),
|
| - synchronous_entry_(synchronous_entry),
|
| + synchronous_entry_(NULL),
|
| synchronous_entry_in_use_by_worker_(false),
|
| has_been_doomed_(false) {
|
| - DCHECK(synchronous_entry);
|
| + SetSynchronousData();
|
| }
|
|
|
| SimpleEntryImpl::~SimpleEntryImpl() {
|
| @@ -285,8 +271,24 @@ void SimpleEntryImpl::EntryOperationComplete(
|
| DCHECK(entry->synchronous_entry_in_use_by_worker_);
|
| DCHECK_EQ(entry->synchronous_entry_, sync_entry);
|
| entry->synchronous_entry_in_use_by_worker_ = false;
|
| + entry->SetSynchronousData();
|
| }
|
| completion_callback.Run(result);
|
| }
|
|
|
| +void SimpleEntryImpl::SetSynchronousData() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + DCHECK(!synchronous_entry_in_use_by_worker_);
|
| +
|
| + // TODO(felipeg): These copies to avoid data races are not optimal. While
|
| + // adding an IO thread index (for fast misses etc...), we can store this data
|
| + // in that structure. This also solves problems with last_used() on ext4
|
| + // filesystems not being accurate.
|
| +
|
| + last_used_ = synchronous_entry_->last_used();
|
| + last_modified_ = synchronous_entry_->last_modified();
|
| + for (int i = 0; i < kSimpleEntryFileCount; ++i)
|
| + data_size_[i] = synchronous_entry_->data_size(i);
|
| +}
|
| +
|
| } // namespace disk_cache
|
|
|