OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 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/blockfile/in_flight_backend_io.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/bind_helpers.h" | |
9 #include "base/compiler_specific.h" | |
10 #include "base/logging.h" | |
11 #include "base/profiler/scoped_tracker.h" | |
12 #include "base/single_thread_task_runner.h" | |
13 #include "net/base/net_errors.h" | |
14 #include "net/disk_cache/blockfile/backend_impl.h" | |
15 #include "net/disk_cache/blockfile/entry_impl.h" | |
16 #include "net/disk_cache/blockfile/histogram_macros.h" | |
17 | |
18 // Provide a BackendImpl object to macros from histogram_macros.h. | |
19 #define CACHE_UMA_BACKEND_IMPL_OBJ backend_ | |
20 | |
21 namespace disk_cache { | |
22 | |
23 BackendIO::BackendIO(InFlightIO* controller, BackendImpl* backend, | |
24 const net::CompletionCallback& callback) | |
25 : BackgroundIO(controller), | |
26 backend_(backend), | |
27 callback_(callback), | |
28 operation_(OP_NONE), | |
29 entry_ptr_(NULL), | |
30 iterator_(NULL), | |
31 entry_(NULL), | |
32 index_(0), | |
33 offset_(0), | |
34 buf_len_(0), | |
35 truncate_(false), | |
36 offset64_(0), | |
37 start_(NULL) { | |
38 start_time_ = base::TimeTicks::Now(); | |
39 } | |
40 | |
41 // Runs on the background thread. | |
42 void BackendIO::ExecuteOperation() { | |
43 if (IsEntryOperation()) | |
44 return ExecuteEntryOperation(); | |
45 | |
46 ExecuteBackendOperation(); | |
47 } | |
48 | |
49 // Runs on the background thread. | |
50 void BackendIO::OnIOComplete(int result) { | |
51 DCHECK(IsEntryOperation()); | |
52 DCHECK_NE(result, net::ERR_IO_PENDING); | |
53 result_ = result; | |
54 NotifyController(); | |
55 } | |
56 | |
57 // Runs on the primary thread. | |
58 void BackendIO::OnDone(bool cancel) { | |
59 if (IsEntryOperation()) { | |
60 CACHE_UMA(TIMES, "TotalIOTime", 0, ElapsedTime()); | |
61 } | |
62 | |
63 if (!ReturnsEntry()) | |
64 return; | |
65 | |
66 if (result() == net::OK) { | |
67 static_cast<EntryImpl*>(*entry_ptr_)->OnEntryCreated(backend_); | |
68 if (cancel) { | |
69 // TODO(vadimt): Remove ScopedTracker below once crbug.com/422516 is | |
70 // fixed. | |
71 tracked_objects::ScopedTracker tracking_profile( | |
72 FROM_HERE_WITH_EXPLICIT_FUNCTION("422516 BackendIO::OnDone")); | |
73 | |
74 (*entry_ptr_)->Close(); | |
75 } | |
76 } | |
77 } | |
78 | |
79 bool BackendIO::IsEntryOperation() { | |
80 return operation_ > OP_MAX_BACKEND; | |
81 } | |
82 | |
83 // Runs on the background thread. | |
84 void BackendIO::ReferenceEntry() { | |
85 entry_->AddRef(); | |
86 } | |
87 | |
88 void BackendIO::Init() { | |
89 operation_ = OP_INIT; | |
90 } | |
91 | |
92 void BackendIO::OpenEntry(const std::string& key, Entry** entry) { | |
93 operation_ = OP_OPEN; | |
94 key_ = key; | |
95 entry_ptr_ = entry; | |
96 } | |
97 | |
98 void BackendIO::CreateEntry(const std::string& key, Entry** entry) { | |
99 operation_ = OP_CREATE; | |
100 key_ = key; | |
101 entry_ptr_ = entry; | |
102 } | |
103 | |
104 void BackendIO::DoomEntry(const std::string& key) { | |
105 operation_ = OP_DOOM; | |
106 key_ = key; | |
107 } | |
108 | |
109 void BackendIO::DoomAllEntries() { | |
110 operation_ = OP_DOOM_ALL; | |
111 } | |
112 | |
113 void BackendIO::DoomEntriesBetween(const base::Time initial_time, | |
114 const base::Time end_time) { | |
115 operation_ = OP_DOOM_BETWEEN; | |
116 initial_time_ = initial_time; | |
117 end_time_ = end_time; | |
118 } | |
119 | |
120 void BackendIO::DoomEntriesSince(const base::Time initial_time) { | |
121 operation_ = OP_DOOM_SINCE; | |
122 initial_time_ = initial_time; | |
123 } | |
124 | |
125 void BackendIO::OpenNextEntry(Rankings::Iterator* iterator, | |
126 Entry** next_entry) { | |
127 operation_ = OP_OPEN_NEXT; | |
128 iterator_ = iterator; | |
129 entry_ptr_ = next_entry; | |
130 } | |
131 | |
132 void BackendIO::EndEnumeration(scoped_ptr<Rankings::Iterator> iterator) { | |
133 operation_ = OP_END_ENUMERATION; | |
134 scoped_iterator_ = iterator.Pass(); | |
135 } | |
136 | |
137 void BackendIO::OnExternalCacheHit(const std::string& key) { | |
138 operation_ = OP_ON_EXTERNAL_CACHE_HIT; | |
139 key_ = key; | |
140 } | |
141 | |
142 void BackendIO::CloseEntryImpl(EntryImpl* entry) { | |
143 operation_ = OP_CLOSE_ENTRY; | |
144 entry_ = entry; | |
145 } | |
146 | |
147 void BackendIO::DoomEntryImpl(EntryImpl* entry) { | |
148 operation_ = OP_DOOM_ENTRY; | |
149 entry_ = entry; | |
150 } | |
151 | |
152 void BackendIO::FlushQueue() { | |
153 operation_ = OP_FLUSH_QUEUE; | |
154 } | |
155 | |
156 void BackendIO::RunTask(const base::Closure& task) { | |
157 operation_ = OP_RUN_TASK; | |
158 task_ = task; | |
159 } | |
160 | |
161 void BackendIO::ReadData(EntryImpl* entry, int index, int offset, | |
162 net::IOBuffer* buf, int buf_len) { | |
163 operation_ = OP_READ; | |
164 entry_ = entry; | |
165 index_ = index; | |
166 offset_ = offset; | |
167 buf_ = buf; | |
168 buf_len_ = buf_len; | |
169 } | |
170 | |
171 void BackendIO::WriteData(EntryImpl* entry, int index, int offset, | |
172 net::IOBuffer* buf, int buf_len, bool truncate) { | |
173 operation_ = OP_WRITE; | |
174 entry_ = entry; | |
175 index_ = index; | |
176 offset_ = offset; | |
177 buf_ = buf; | |
178 buf_len_ = buf_len; | |
179 truncate_ = truncate; | |
180 } | |
181 | |
182 void BackendIO::ReadSparseData(EntryImpl* entry, int64 offset, | |
183 net::IOBuffer* buf, int buf_len) { | |
184 operation_ = OP_READ_SPARSE; | |
185 entry_ = entry; | |
186 offset64_ = offset; | |
187 buf_ = buf; | |
188 buf_len_ = buf_len; | |
189 } | |
190 | |
191 void BackendIO::WriteSparseData(EntryImpl* entry, int64 offset, | |
192 net::IOBuffer* buf, int buf_len) { | |
193 operation_ = OP_WRITE_SPARSE; | |
194 entry_ = entry; | |
195 offset64_ = offset; | |
196 buf_ = buf; | |
197 buf_len_ = buf_len; | |
198 } | |
199 | |
200 void BackendIO::GetAvailableRange(EntryImpl* entry, int64 offset, int len, | |
201 int64* start) { | |
202 operation_ = OP_GET_RANGE; | |
203 entry_ = entry; | |
204 offset64_ = offset; | |
205 buf_len_ = len; | |
206 start_ = start; | |
207 } | |
208 | |
209 void BackendIO::CancelSparseIO(EntryImpl* entry) { | |
210 operation_ = OP_CANCEL_IO; | |
211 entry_ = entry; | |
212 } | |
213 | |
214 void BackendIO::ReadyForSparseIO(EntryImpl* entry) { | |
215 operation_ = OP_IS_READY; | |
216 entry_ = entry; | |
217 } | |
218 | |
219 BackendIO::~BackendIO() {} | |
220 | |
221 bool BackendIO::ReturnsEntry() { | |
222 return operation_ == OP_OPEN || operation_ == OP_CREATE || | |
223 operation_ == OP_OPEN_NEXT; | |
224 } | |
225 | |
226 base::TimeDelta BackendIO::ElapsedTime() const { | |
227 return base::TimeTicks::Now() - start_time_; | |
228 } | |
229 | |
230 // Runs on the background thread. | |
231 void BackendIO::ExecuteBackendOperation() { | |
232 switch (operation_) { | |
233 case OP_INIT: | |
234 result_ = backend_->SyncInit(); | |
235 break; | |
236 case OP_OPEN: | |
237 result_ = backend_->SyncOpenEntry(key_, entry_ptr_); | |
238 break; | |
239 case OP_CREATE: | |
240 result_ = backend_->SyncCreateEntry(key_, entry_ptr_); | |
241 break; | |
242 case OP_DOOM: | |
243 result_ = backend_->SyncDoomEntry(key_); | |
244 break; | |
245 case OP_DOOM_ALL: | |
246 result_ = backend_->SyncDoomAllEntries(); | |
247 break; | |
248 case OP_DOOM_BETWEEN: | |
249 result_ = backend_->SyncDoomEntriesBetween(initial_time_, end_time_); | |
250 break; | |
251 case OP_DOOM_SINCE: | |
252 result_ = backend_->SyncDoomEntriesSince(initial_time_); | |
253 break; | |
254 case OP_OPEN_NEXT: | |
255 result_ = backend_->SyncOpenNextEntry(iterator_, entry_ptr_); | |
256 break; | |
257 case OP_END_ENUMERATION: | |
258 backend_->SyncEndEnumeration(scoped_iterator_.Pass()); | |
259 result_ = net::OK; | |
260 break; | |
261 case OP_ON_EXTERNAL_CACHE_HIT: | |
262 backend_->SyncOnExternalCacheHit(key_); | |
263 result_ = net::OK; | |
264 break; | |
265 case OP_CLOSE_ENTRY: | |
266 entry_->Release(); | |
267 result_ = net::OK; | |
268 break; | |
269 case OP_DOOM_ENTRY: | |
270 entry_->DoomImpl(); | |
271 result_ = net::OK; | |
272 break; | |
273 case OP_FLUSH_QUEUE: | |
274 result_ = net::OK; | |
275 break; | |
276 case OP_RUN_TASK: | |
277 task_.Run(); | |
278 result_ = net::OK; | |
279 break; | |
280 default: | |
281 NOTREACHED() << "Invalid Operation"; | |
282 result_ = net::ERR_UNEXPECTED; | |
283 } | |
284 DCHECK_NE(net::ERR_IO_PENDING, result_); | |
285 NotifyController(); | |
286 } | |
287 | |
288 // Runs on the background thread. | |
289 void BackendIO::ExecuteEntryOperation() { | |
290 switch (operation_) { | |
291 case OP_READ: | |
292 result_ = | |
293 entry_->ReadDataImpl(index_, offset_, buf_.get(), buf_len_, | |
294 base::Bind(&BackendIO::OnIOComplete, this)); | |
295 break; | |
296 case OP_WRITE: | |
297 result_ = | |
298 entry_->WriteDataImpl(index_, offset_, buf_.get(), buf_len_, | |
299 base::Bind(&BackendIO::OnIOComplete, this), | |
300 truncate_); | |
301 break; | |
302 case OP_READ_SPARSE: | |
303 result_ = entry_->ReadSparseDataImpl( | |
304 offset64_, buf_.get(), buf_len_, | |
305 base::Bind(&BackendIO::OnIOComplete, this)); | |
306 break; | |
307 case OP_WRITE_SPARSE: | |
308 result_ = entry_->WriteSparseDataImpl( | |
309 offset64_, buf_.get(), buf_len_, | |
310 base::Bind(&BackendIO::OnIOComplete, this)); | |
311 break; | |
312 case OP_GET_RANGE: | |
313 result_ = entry_->GetAvailableRangeImpl(offset64_, buf_len_, start_); | |
314 break; | |
315 case OP_CANCEL_IO: | |
316 entry_->CancelSparseIOImpl(); | |
317 result_ = net::OK; | |
318 break; | |
319 case OP_IS_READY: | |
320 result_ = entry_->ReadyForSparseIOImpl( | |
321 base::Bind(&BackendIO::OnIOComplete, this)); | |
322 break; | |
323 default: | |
324 NOTREACHED() << "Invalid Operation"; | |
325 result_ = net::ERR_UNEXPECTED; | |
326 } | |
327 buf_ = NULL; | |
328 if (result_ != net::ERR_IO_PENDING) | |
329 NotifyController(); | |
330 } | |
331 | |
332 InFlightBackendIO::InFlightBackendIO( | |
333 BackendImpl* backend, | |
334 const scoped_refptr<base::SingleThreadTaskRunner>& background_thread) | |
335 : backend_(backend), | |
336 background_thread_(background_thread), | |
337 ptr_factory_(this) { | |
338 } | |
339 | |
340 InFlightBackendIO::~InFlightBackendIO() { | |
341 } | |
342 | |
343 void InFlightBackendIO::Init(const net::CompletionCallback& callback) { | |
344 // TODO(vadimt): Remove wrapping the callback with | |
345 // ScopedTracker::TrackCallback() once crbug.com/422516 is fixed. | |
346 scoped_refptr<BackendIO> operation(new BackendIO( | |
347 this, backend_, | |
348 tracked_objects::ScopedTracker::TrackCallback( | |
349 FROM_HERE_WITH_EXPLICIT_FUNCTION("422516 InFlightBackendIO::Init"), | |
350 callback))); | |
351 operation->Init(); | |
352 PostOperation(operation.get()); | |
353 } | |
354 | |
355 void InFlightBackendIO::OpenEntry(const std::string& key, Entry** entry, | |
356 const net::CompletionCallback& callback) { | |
357 scoped_refptr<BackendIO> operation(new BackendIO( | |
358 this, backend_, tracked_objects::ScopedTracker::TrackCallback( | |
359 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
360 "422516 InFlightBackendIO::OpenEntry"), | |
361 callback))); | |
362 operation->OpenEntry(key, entry); | |
363 PostOperation(operation.get()); | |
364 } | |
365 | |
366 void InFlightBackendIO::CreateEntry(const std::string& key, Entry** entry, | |
367 const net::CompletionCallback& callback) { | |
368 scoped_refptr<BackendIO> operation(new BackendIO( | |
369 this, backend_, tracked_objects::ScopedTracker::TrackCallback( | |
370 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
371 "422516 InFlightBackendIO::CreateEntry"), | |
372 callback))); | |
373 operation->CreateEntry(key, entry); | |
374 PostOperation(operation.get()); | |
375 } | |
376 | |
377 void InFlightBackendIO::DoomEntry(const std::string& key, | |
378 const net::CompletionCallback& callback) { | |
379 scoped_refptr<BackendIO> operation(new BackendIO( | |
380 this, backend_, tracked_objects::ScopedTracker::TrackCallback( | |
381 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
382 "422516 InFlightBackendIO::DoomEntry"), | |
383 callback))); | |
384 operation->DoomEntry(key); | |
385 PostOperation(operation.get()); | |
386 } | |
387 | |
388 void InFlightBackendIO::DoomAllEntries( | |
389 const net::CompletionCallback& callback) { | |
390 scoped_refptr<BackendIO> operation(new BackendIO( | |
391 this, backend_, tracked_objects::ScopedTracker::TrackCallback( | |
392 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
393 "422516 InFlightBackendIO::DoomAllEntries"), | |
394 callback))); | |
395 operation->DoomAllEntries(); | |
396 PostOperation(operation.get()); | |
397 } | |
398 | |
399 void InFlightBackendIO::DoomEntriesBetween(const base::Time initial_time, | |
400 const base::Time end_time, | |
401 const net::CompletionCallback& callback) { | |
402 scoped_refptr<BackendIO> operation(new BackendIO( | |
403 this, backend_, tracked_objects::ScopedTracker::TrackCallback( | |
404 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
405 "422516 InFlightBackendIO::DoomEntriesBetween"), | |
406 callback))); | |
407 operation->DoomEntriesBetween(initial_time, end_time); | |
408 PostOperation(operation.get()); | |
409 } | |
410 | |
411 void InFlightBackendIO::DoomEntriesSince( | |
412 const base::Time initial_time, const net::CompletionCallback& callback) { | |
413 scoped_refptr<BackendIO> operation(new BackendIO( | |
414 this, backend_, tracked_objects::ScopedTracker::TrackCallback( | |
415 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
416 "422516 InFlightBackendIO::DoomEntriesSince"), | |
417 callback))); | |
418 operation->DoomEntriesSince(initial_time); | |
419 PostOperation(operation.get()); | |
420 } | |
421 | |
422 void InFlightBackendIO::OpenNextEntry(Rankings::Iterator* iterator, | |
423 Entry** next_entry, | |
424 const net::CompletionCallback& callback) { | |
425 scoped_refptr<BackendIO> operation(new BackendIO( | |
426 this, backend_, tracked_objects::ScopedTracker::TrackCallback( | |
427 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
428 "422516 InFlightBackendIO::OpenNextEntry"), | |
429 callback))); | |
430 operation->OpenNextEntry(iterator, next_entry); | |
431 PostOperation(operation.get()); | |
432 } | |
433 | |
434 void InFlightBackendIO::EndEnumeration( | |
435 scoped_ptr<Rankings::Iterator> iterator) { | |
436 scoped_refptr<BackendIO> operation( | |
437 new BackendIO(this, backend_, net::CompletionCallback())); | |
438 operation->EndEnumeration(iterator.Pass()); | |
439 PostOperation(operation.get()); | |
440 } | |
441 | |
442 void InFlightBackendIO::OnExternalCacheHit(const std::string& key) { | |
443 scoped_refptr<BackendIO> operation( | |
444 new BackendIO(this, backend_, net::CompletionCallback())); | |
445 operation->OnExternalCacheHit(key); | |
446 PostOperation(operation.get()); | |
447 } | |
448 | |
449 void InFlightBackendIO::CloseEntryImpl(EntryImpl* entry) { | |
450 scoped_refptr<BackendIO> operation( | |
451 new BackendIO(this, backend_, net::CompletionCallback())); | |
452 operation->CloseEntryImpl(entry); | |
453 PostOperation(operation.get()); | |
454 } | |
455 | |
456 void InFlightBackendIO::DoomEntryImpl(EntryImpl* entry) { | |
457 scoped_refptr<BackendIO> operation( | |
458 new BackendIO(this, backend_, net::CompletionCallback())); | |
459 operation->DoomEntryImpl(entry); | |
460 PostOperation(operation.get()); | |
461 } | |
462 | |
463 void InFlightBackendIO::FlushQueue(const net::CompletionCallback& callback) { | |
464 scoped_refptr<BackendIO> operation(new BackendIO( | |
465 this, backend_, tracked_objects::ScopedTracker::TrackCallback( | |
466 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
467 "422516 InFlightBackendIO::FlushQueue"), | |
468 callback))); | |
469 operation->FlushQueue(); | |
470 PostOperation(operation.get()); | |
471 } | |
472 | |
473 void InFlightBackendIO::RunTask( | |
474 const base::Closure& task, const net::CompletionCallback& callback) { | |
475 scoped_refptr<BackendIO> operation(new BackendIO( | |
476 this, backend_, | |
477 tracked_objects::ScopedTracker::TrackCallback( | |
478 FROM_HERE_WITH_EXPLICIT_FUNCTION("422516 InFlightBackendIO::RunTask"), | |
479 callback))); | |
480 operation->RunTask(task); | |
481 PostOperation(operation.get()); | |
482 } | |
483 | |
484 void InFlightBackendIO::ReadData(EntryImpl* entry, int index, int offset, | |
485 net::IOBuffer* buf, int buf_len, | |
486 const net::CompletionCallback& callback) { | |
487 scoped_refptr<BackendIO> operation(new BackendIO( | |
488 this, backend_, tracked_objects::ScopedTracker::TrackCallback( | |
489 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
490 "422516 InFlightBackendIO::ReadData"), | |
491 callback))); | |
492 operation->ReadData(entry, index, offset, buf, buf_len); | |
493 PostOperation(operation.get()); | |
494 } | |
495 | |
496 void InFlightBackendIO::WriteData(EntryImpl* entry, int index, int offset, | |
497 net::IOBuffer* buf, int buf_len, | |
498 bool truncate, | |
499 const net::CompletionCallback& callback) { | |
500 scoped_refptr<BackendIO> operation(new BackendIO( | |
501 this, backend_, tracked_objects::ScopedTracker::TrackCallback( | |
502 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
503 "422516 InFlightBackendIO::WriteData"), | |
504 callback))); | |
505 operation->WriteData(entry, index, offset, buf, buf_len, truncate); | |
506 PostOperation(operation.get()); | |
507 } | |
508 | |
509 void InFlightBackendIO::ReadSparseData( | |
510 EntryImpl* entry, int64 offset, net::IOBuffer* buf, int buf_len, | |
511 const net::CompletionCallback& callback) { | |
512 scoped_refptr<BackendIO> operation(new BackendIO( | |
513 this, backend_, tracked_objects::ScopedTracker::TrackCallback( | |
514 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
515 "422516 InFlightBackendIO::ReadSparseData"), | |
516 callback))); | |
517 operation->ReadSparseData(entry, offset, buf, buf_len); | |
518 PostOperation(operation.get()); | |
519 } | |
520 | |
521 void InFlightBackendIO::WriteSparseData( | |
522 EntryImpl* entry, int64 offset, net::IOBuffer* buf, int buf_len, | |
523 const net::CompletionCallback& callback) { | |
524 scoped_refptr<BackendIO> operation(new BackendIO( | |
525 this, backend_, tracked_objects::ScopedTracker::TrackCallback( | |
526 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
527 "422516 InFlightBackendIO::WriteSparseData"), | |
528 callback))); | |
529 operation->WriteSparseData(entry, offset, buf, buf_len); | |
530 PostOperation(operation.get()); | |
531 } | |
532 | |
533 void InFlightBackendIO::GetAvailableRange( | |
534 EntryImpl* entry, int64 offset, int len, int64* start, | |
535 const net::CompletionCallback& callback) { | |
536 scoped_refptr<BackendIO> operation(new BackendIO( | |
537 this, backend_, tracked_objects::ScopedTracker::TrackCallback( | |
538 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
539 "422516 InFlightBackendIO::GetAvailableRange"), | |
540 callback))); | |
541 operation->GetAvailableRange(entry, offset, len, start); | |
542 PostOperation(operation.get()); | |
543 } | |
544 | |
545 void InFlightBackendIO::CancelSparseIO(EntryImpl* entry) { | |
546 scoped_refptr<BackendIO> operation( | |
547 new BackendIO(this, backend_, net::CompletionCallback())); | |
548 operation->CancelSparseIO(entry); | |
549 PostOperation(operation.get()); | |
550 } | |
551 | |
552 void InFlightBackendIO::ReadyForSparseIO( | |
553 EntryImpl* entry, const net::CompletionCallback& callback) { | |
554 scoped_refptr<BackendIO> operation(new BackendIO( | |
555 this, backend_, tracked_objects::ScopedTracker::TrackCallback( | |
556 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
557 "422516 InFlightBackendIO::CancelSparseIO"), | |
558 callback))); | |
559 operation->ReadyForSparseIO(entry); | |
560 PostOperation(operation.get()); | |
561 } | |
562 | |
563 void InFlightBackendIO::WaitForPendingIO() { | |
564 InFlightIO::WaitForPendingIO(); | |
565 } | |
566 | |
567 void InFlightBackendIO::OnOperationComplete(BackgroundIO* operation, | |
568 bool cancel) { | |
569 BackendIO* op = static_cast<BackendIO*>(operation); | |
570 op->OnDone(cancel); | |
571 | |
572 if (!op->callback().is_null() && (!cancel || op->IsEntryOperation())) { | |
573 // TODO(vadimt): Remove ScopedTracker below once crbug.com/422516 is fixed. | |
574 tracked_objects::ScopedTracker tracking_profile( | |
575 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
576 "422516 InFlightBackendIO::OnOperationComplete")); | |
577 | |
578 op->callback().Run(op->result()); | |
579 } | |
580 } | |
581 | |
582 void InFlightBackendIO::PostOperation(BackendIO* operation) { | |
583 background_thread_->PostTask( | |
584 FROM_HERE, base::Bind(&BackendIO::ExecuteOperation, operation)); | |
585 OnOperationPosted(operation); | |
586 } | |
587 | |
588 base::WeakPtr<InFlightBackendIO> InFlightBackendIO::GetWeakPtr() { | |
589 return ptr_factory_.GetWeakPtr(); | |
590 } | |
591 | |
592 } // namespace | |
OLD | NEW |