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 "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/callback.h" | 9 #include "base/callback.h" |
10 #include "base/location.h" | 10 #include "base/location.h" |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 delete this; | 106 delete this; |
107 } | 107 } |
108 | 108 |
109 std::string SimpleEntryImpl::GetKey() const { | 109 std::string SimpleEntryImpl::GetKey() const { |
110 DCHECK(thread_checker_.CalledOnValidThread()); | 110 DCHECK(thread_checker_.CalledOnValidThread()); |
111 return key_; | 111 return key_; |
112 } | 112 } |
113 | 113 |
114 Time SimpleEntryImpl::GetLastUsed() const { | 114 Time SimpleEntryImpl::GetLastUsed() const { |
115 DCHECK(thread_checker_.CalledOnValidThread()); | 115 DCHECK(thread_checker_.CalledOnValidThread()); |
116 if (synchronous_entry_in_use_by_worker_) { | 116 return last_used_; |
117 NOTIMPLEMENTED() << ": Synchronous operations overlapping an asynchronous " | |
118 << "operation."; | |
119 NOTREACHED(); | |
120 } | |
121 return synchronous_entry_->last_used(); | |
122 } | 117 } |
123 | 118 |
124 Time SimpleEntryImpl::GetLastModified() const { | 119 Time SimpleEntryImpl::GetLastModified() const { |
125 DCHECK(thread_checker_.CalledOnValidThread()); | 120 DCHECK(thread_checker_.CalledOnValidThread()); |
126 if (synchronous_entry_in_use_by_worker_) { | 121 return last_modified_; |
127 NOTIMPLEMENTED() << ": Synchronous operations overlapping an asynchronous " | |
128 << "operation."; | |
129 NOTREACHED(); | |
130 } | |
131 return synchronous_entry_->last_modified(); | |
132 } | 122 } |
133 | 123 |
134 int32 SimpleEntryImpl::GetDataSize(int index) const { | 124 int32 SimpleEntryImpl::GetDataSize(int index) const { |
135 DCHECK(thread_checker_.CalledOnValidThread()); | 125 DCHECK(thread_checker_.CalledOnValidThread()); |
136 if (synchronous_entry_in_use_by_worker_) { | 126 return data_size_[index]; |
137 NOTIMPLEMENTED() << ": Synchronous operations overlapping an asynchronous " | |
138 << "operation."; | |
139 NOTREACHED(); | |
140 } | |
141 return synchronous_entry_->data_size(index); | |
142 } | 127 } |
143 | 128 |
144 int SimpleEntryImpl::ReadData(int index, | 129 int SimpleEntryImpl::ReadData(int index, |
145 int offset, | 130 int offset, |
146 net::IOBuffer* buf, | 131 net::IOBuffer* buf, |
147 int buf_len, | 132 int buf_len, |
148 const CompletionCallback& callback) { | 133 const CompletionCallback& callback) { |
149 DCHECK(thread_checker_.CalledOnValidThread()); | 134 DCHECK(thread_checker_.CalledOnValidThread()); |
150 // TODO(gavinp): Add support for overlapping reads. The net::HttpCache does | 135 // TODO(gavinp): Add support for overlapping reads. The net::HttpCache does |
151 // make overlapping read requests when multiple transactions access the same | 136 // make overlapping read requests when multiple transactions access the same |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 int SimpleEntryImpl::ReadyForSparseIO(const CompletionCallback& callback) { | 221 int SimpleEntryImpl::ReadyForSparseIO(const CompletionCallback& callback) { |
237 // TODO(gavinp): Determine if the simple backend should support sparse data. | 222 // TODO(gavinp): Determine if the simple backend should support sparse data. |
238 DCHECK(thread_checker_.CalledOnValidThread()); | 223 DCHECK(thread_checker_.CalledOnValidThread()); |
239 NOTIMPLEMENTED(); | 224 NOTIMPLEMENTED(); |
240 return net::ERR_FAILED; | 225 return net::ERR_FAILED; |
241 } | 226 } |
242 | 227 |
243 SimpleEntryImpl::SimpleEntryImpl( | 228 SimpleEntryImpl::SimpleEntryImpl( |
244 SimpleSynchronousEntry* synchronous_entry) | 229 SimpleSynchronousEntry* synchronous_entry) |
245 : ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)), | 230 : ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)), |
| 231 path_(synchronous_entry->path()), |
246 key_(synchronous_entry->key()), | 232 key_(synchronous_entry->key()), |
247 synchronous_entry_(synchronous_entry), | 233 synchronous_entry_(NULL), |
248 synchronous_entry_in_use_by_worker_(false), | 234 synchronous_entry_in_use_by_worker_(false), |
249 has_been_doomed_(false) { | 235 has_been_doomed_(false) { |
250 DCHECK(synchronous_entry); | 236 SetSynchronousData(); |
251 } | 237 } |
252 | 238 |
253 SimpleEntryImpl::~SimpleEntryImpl() { | 239 SimpleEntryImpl::~SimpleEntryImpl() { |
254 DCHECK(thread_checker_.CalledOnValidThread()); | 240 DCHECK(thread_checker_.CalledOnValidThread()); |
255 DCHECK(!synchronous_entry_) << "synchronous_entry_ = " << synchronous_entry_; | 241 DCHECK(!synchronous_entry_) << "synchronous_entry_ = " << synchronous_entry_; |
256 } | 242 } |
257 | 243 |
258 // static | 244 // static |
259 void SimpleEntryImpl::CreationOperationComplete( | 245 void SimpleEntryImpl::CreationOperationComplete( |
260 const CompletionCallback& completion_callback, | 246 const CompletionCallback& completion_callback, |
(...skipping 17 matching lines...) Expand all Loading... |
278 void SimpleEntryImpl::EntryOperationComplete( | 264 void SimpleEntryImpl::EntryOperationComplete( |
279 const CompletionCallback& completion_callback, | 265 const CompletionCallback& completion_callback, |
280 base::WeakPtr<SimpleEntryImpl> entry, | 266 base::WeakPtr<SimpleEntryImpl> entry, |
281 SimpleSynchronousEntry* sync_entry, | 267 SimpleSynchronousEntry* sync_entry, |
282 int result) { | 268 int result) { |
283 DCHECK(sync_entry); | 269 DCHECK(sync_entry); |
284 if (entry) { | 270 if (entry) { |
285 DCHECK(entry->synchronous_entry_in_use_by_worker_); | 271 DCHECK(entry->synchronous_entry_in_use_by_worker_); |
286 DCHECK_EQ(entry->synchronous_entry_, sync_entry); | 272 DCHECK_EQ(entry->synchronous_entry_, sync_entry); |
287 entry->synchronous_entry_in_use_by_worker_ = false; | 273 entry->synchronous_entry_in_use_by_worker_ = false; |
| 274 entry->SetSynchronousData(); |
288 } | 275 } |
289 completion_callback.Run(result); | 276 completion_callback.Run(result); |
290 } | 277 } |
291 | 278 |
| 279 void SimpleEntryImpl::SetSynchronousData() { |
| 280 DCHECK(thread_checker_.CalledOnValidThread()); |
| 281 DCHECK(!synchronous_entry_in_use_by_worker_); |
| 282 |
| 283 // TODO(felipeg): These copies to avoid data races are not optimal. While |
| 284 // adding an IO thread index (for fast misses etc...), we can store this data |
| 285 // in that structure. This also solves problems with last_used() on ext4 |
| 286 // filesystems not being accurate. |
| 287 |
| 288 last_used_ = synchronous_entry_->last_used(); |
| 289 last_modified_ = synchronous_entry_->last_modified(); |
| 290 for (int i = 0; i < kSimpleEntryFileCount; ++i) |
| 291 data_size_[i] = synchronous_entry_->data_size(i); |
| 292 } |
| 293 |
292 } // namespace disk_cache | 294 } // namespace disk_cache |
OLD | NEW |