Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(79)

Side by Side Diff: net/disk_cache/simple/simple_entry_impl.cc

Issue 12226095: Make synchronous methods on disk_cache::SimpleEntryImpl() reentrant. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove bad blank line Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698