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

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

Issue 12192005: Add new simple disk cache backend. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remediate to felipeg review 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "net/disk_cache/simple/simple_entry_impl.h"
6
7 #include "base/bind.h"
8 #include "base/bind_helpers.h"
9 #include "base/callback.h"
10 #include "base/location.h"
11 #include "base/message_loop_proxy.h"
12 #include "base/threading/worker_pool.h"
13 #include "net/base/io_buffer.h"
14 #include "net/base/net_errors.h"
15 #include "net/disk_cache/simple/simple_synchronous_entry.h"
16
17
rvargas (doing something else) 2013/02/13 01:48:46 remove extra line
gavinp 2013/02/14 15:29:55 Done.
18 namespace {
19
20 typedef disk_cache::Entry::CompletionCallback CompletionCallback;
21 typedef disk_cache::SimpleSynchronousEntry::SynchronousEntryCallback
22 SynchronousEntryCallback;
23
24 } // namespace
25
26 namespace disk_cache {
27
28 using base::FilePath;
29 using base::MessageLoopProxy;
30 using base::Time;
31 using base::WeakPtr;
32 using base::WorkerPool;
33
34 // static
35 int SimpleEntryImpl::OpenEntry(const FilePath& path,
36 const std::string& key,
37 Entry** entry,
38 const CompletionCallback& callback) {
39 SynchronousEntryCallback sync_entry_callback =
40 base::Bind(&SimpleEntryImpl::CreationOperationComplete, callback, entry);
41 WorkerPool::PostTask(FROM_HERE,
42 base::Bind(&SimpleSynchronousEntry::OpenEntry, path, key,
43 MessageLoopProxy::current(),
44 sync_entry_callback),
45 true);
46 return net::ERR_IO_PENDING;
47 }
48
49 // static
50 int SimpleEntryImpl::CreateEntry(const FilePath& path,
51 const std::string& key,
52 Entry** entry,
53 const CompletionCallback& callback) {
54 SynchronousEntryCallback sync_entry_callback =
55 base::Bind(&SimpleEntryImpl::CreationOperationComplete, callback, entry);
56 WorkerPool::PostTask(FROM_HERE,
57 base::Bind(&SimpleSynchronousEntry::CreateEntry, path,
58 key, MessageLoopProxy::current(),
59 sync_entry_callback),
60 true);
61 return net::ERR_IO_PENDING;
62 }
63
64 // static
65 int SimpleEntryImpl::DoomEntry(const FilePath& path,
66 const std::string& key,
67 const CompletionCallback& callback) {
68 WorkerPool::PostTask(FROM_HERE,
69 base::Bind(&SimpleSynchronousEntry::DoomEntry, path, key,
70 MessageLoopProxy::current(), callback),
71 true);
72 return net::ERR_IO_PENDING;
73 }
74
75 void SimpleEntryImpl::Doom() {
76 DCHECK(thread_checker_.CalledOnValidThread());
77 if (synchronous_entry_in_use_by_worker_) {
78 NOTIMPLEMENTED() << ": Overlapping an asynchronous operation.";
79 return;
80 }
81 WorkerPool::PostTask(FROM_HERE,
82 base::Bind(&SimpleSynchronousEntry::DoomAndClose,
83 base::Unretained(synchronous_entry_)),
84 true);
85 synchronous_entry_ = NULL;
86 has_been_doomed_ = true;
87 }
88
89 void SimpleEntryImpl::Close() {
90 DCHECK(thread_checker_.CalledOnValidThread());
91 if (synchronous_entry_in_use_by_worker_) {
92 NOTIMPLEMENTED() << ": Overlapping an asynchronous operation.";
93 delete this;
94 return;
95 }
96 DCHECK(synchronous_entry_ || has_been_doomed_);
97 if (!has_been_doomed_) {
98 WorkerPool::PostTask(FROM_HERE,
99 base::Bind(&SimpleSynchronousEntry::Close,
100 base::Unretained(synchronous_entry_)),
101 true);
102 synchronous_entry_ = NULL;
103 }
104 // Entry::Close() is expected to release this entry. See disk_cache.h for
105 // details.
106 delete this;
107 }
108
109 std::string SimpleEntryImpl::GetKey() const {
110 DCHECK(thread_checker_.CalledOnValidThread());
111 return key_;
112 }
113
114 Time SimpleEntryImpl::GetLastUsed() const {
115 DCHECK(thread_checker_.CalledOnValidThread());
116 if (synchronous_entry_in_use_by_worker_) {
117 NOTIMPLEMENTED() << ": Synchronous operations overlapping an asynchronous "
118 << "operation.";
119 NOTREACHED();
rvargas (doing something else) 2013/02/13 01:48:46 nit: sounds like this should be removed (not a cod
gavinp 2013/02/14 15:29:55 Done. I replaced them with CHECK(false), which is
120 }
121 return synchronous_entry_->last_used();
122 }
123
124 Time SimpleEntryImpl::GetLastModified() const {
125 DCHECK(thread_checker_.CalledOnValidThread());
126 if (synchronous_entry_in_use_by_worker_) {
127 NOTIMPLEMENTED() << ": Synchronous operations overlapping an asynchronous "
128 << "operation.";
129 NOTREACHED();
130 }
131 return synchronous_entry_->last_modified();
132 }
133
134 int32 SimpleEntryImpl::GetDataSize(int index) const {
135 DCHECK(thread_checker_.CalledOnValidThread());
136 if (synchronous_entry_in_use_by_worker_) {
137 NOTIMPLEMENTED() << ": Synchronous operations overlapping an asynchronous "
138 << "operation.";
139 NOTREACHED();
140 }
141 return synchronous_entry_->data_size(index);
142 }
143
144 int SimpleEntryImpl::ReadData(int index,
145 int offset,
146 net::IOBuffer* buf,
147 int buf_len,
148 const CompletionCallback& callback) {
149 DCHECK(thread_checker_.CalledOnValidThread());
150 // TODO(gavinp): Add support for overlapping reads. The net::HttpCache does
151 // make overlapping read requests when multiple transactions access the same
152 // entry as read only.
153 if (synchronous_entry_in_use_by_worker_) {
154 NOTIMPLEMENTED() << ": Overlapping calls to ReadData.";
155 NOTREACHED();
156 }
157 synchronous_entry_in_use_by_worker_ = true;
158 SynchronousEntryCallback sync_entry_callback =
159 base::Bind(&SimpleEntryImpl::EntryOperationComplete,
160 callback, weak_ptr_factory_.GetWeakPtr());
161 WorkerPool::PostTask(FROM_HERE,
162 base::Bind(&SimpleSynchronousEntry::ReadData,
163 base::Unretained(synchronous_entry_),
164 index, offset, scoped_refptr<IOBuffer>(buf),
rvargas (doing something else) 2013/02/13 01:48:46 make_scoped_refptr (if you want to force a scoped
gavinp 2013/02/14 15:29:55 Done.
165 buf_len, sync_entry_callback),
166 true);
167 return net::ERR_IO_PENDING;
168 }
169
170 int SimpleEntryImpl::WriteData(int index,
171 int offset,
172 net::IOBuffer* buf,
173 int buf_len,
174 const CompletionCallback& callback,
175 bool truncate) {
176 DCHECK(thread_checker_.CalledOnValidThread());
177 if (synchronous_entry_in_use_by_worker_) {
178 NOTIMPLEMENTED() << ": Overlapping calls to WriteData.";
179 NOTREACHED();
180 }
181 synchronous_entry_in_use_by_worker_ = true;
182 SynchronousEntryCallback sync_entry_callback =
183 base::Bind(&SimpleEntryImpl::EntryOperationComplete,
184 callback, weak_ptr_factory_.GetWeakPtr());
185 WorkerPool::PostTask(FROM_HERE,
186 base::Bind(&SimpleSynchronousEntry::WriteData,
187 base::Unretained(synchronous_entry_),
188 index, offset, scoped_refptr<IOBuffer>(buf),
189 buf_len, sync_entry_callback, truncate),
190 true);
191 return net::ERR_IO_PENDING;
192 }
193
194 int SimpleEntryImpl::ReadSparseData(int64 offset,
195 net::IOBuffer* buf,
196 int buf_len,
197 const CompletionCallback& callback) {
198 // TODO(gavinp): Determine if the simple backend should support sparse data.
199 DCHECK(thread_checker_.CalledOnValidThread());
200 NOTIMPLEMENTED();
201 return net::ERR_FAILED;
202 }
203
204 int SimpleEntryImpl::WriteSparseData(int64 offset,
205 net::IOBuffer* buf,
206 int buf_len,
207 const CompletionCallback& callback) {
208 // TODO(gavinp): Determine if the simple backend should support sparse data.
209 DCHECK(thread_checker_.CalledOnValidThread());
210 NOTIMPLEMENTED();
211 return net::ERR_FAILED;
212 }
213
214 int SimpleEntryImpl::GetAvailableRange(int64 offset,
215 int len,
216 int64* start,
217 const CompletionCallback& callback) {
218 // TODO(gavinp): Determine if the simple backend should support sparse data.
219 DCHECK(thread_checker_.CalledOnValidThread());
220 NOTIMPLEMENTED();
221 return net::ERR_FAILED;
222 }
223
224 bool SimpleEntryImpl::CouldBeSparse() const {
225 // TODO(gavinp): Determine if the simple backend should support sparse data.
226 DCHECK(thread_checker_.CalledOnValidThread());
227 return false;
228 }
229
230 void SimpleEntryImpl::CancelSparseIO() {
231 // TODO(gavinp): Determine if the simple backend should support sparse data.
232 DCHECK(thread_checker_.CalledOnValidThread());
233 NOTIMPLEMENTED();
234 }
235
236 int SimpleEntryImpl::ReadyForSparseIO(const CompletionCallback& callback) {
237 // TODO(gavinp): Determine if the simple backend should support sparse data.
238 DCHECK(thread_checker_.CalledOnValidThread());
239 NOTIMPLEMENTED();
240 return net::ERR_FAILED;
241 }
242
243 SimpleEntryImpl::SimpleEntryImpl(
244 SimpleSynchronousEntry* synchronous_entry)
245 : ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)),
246 key_(synchronous_entry->key()),
247 synchronous_entry_(synchronous_entry),
248 synchronous_entry_in_use_by_worker_(false),
249 has_been_doomed_(false) {
250 DCHECK(synchronous_entry);
251 }
252
253 SimpleEntryImpl::~SimpleEntryImpl() {
254 DCHECK(thread_checker_.CalledOnValidThread());
255 DCHECK(!synchronous_entry_) << "synchronous_entry_ = " << synchronous_entry_;
rvargas (doing something else) 2013/02/13 01:48:46 In general I would not bother to add more logging
gavinp 2013/02/14 15:29:55 Done.
256 }
257
258 // static
259 void SimpleEntryImpl::CreationOperationComplete(
260 const CompletionCallback& completion_callback,
261 Entry** out_entry,
262 SimpleSynchronousEntry* sync_entry,
263 int result) {
264 DCHECK_NE(net::ERR_IO_PENDING, result);
265
266 if (result != net::OK) {
267 DCHECK(!sync_entry) << "sync_entry = " << sync_entry;
268 completion_callback.Run(result);
269 return;
270 }
271 DCHECK(sync_entry);
272 *out_entry = new SimpleEntryImpl(sync_entry);
273 DCHECK(*out_entry);
274 completion_callback.Run(net::OK);
275 }
276
277 // static
278 void SimpleEntryImpl::EntryOperationComplete(
279 const CompletionCallback& completion_callback,
280 base::WeakPtr<SimpleEntryImpl> entry,
281 SimpleSynchronousEntry* sync_entry,
rvargas (doing something else) 2013/02/13 01:48:46 is it really worth passing sync_entry back just to
gavinp 2013/02/14 15:29:55 No. Removed.
282 int result) {
283 DCHECK(sync_entry);
284 if (entry) {
285 DCHECK(entry->synchronous_entry_in_use_by_worker_);
286 DCHECK_EQ(entry->synchronous_entry_, sync_entry);
287 entry->synchronous_entry_in_use_by_worker_ = false;
288 }
289 completion_callback.Run(result);
290 }
291
292 } // namespace disk_cache
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698