1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/disk_cache/in_flight_backend_io.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/compiler_specific.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_errors.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/disk_cache/backend_impl.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/disk_cache/entry_impl.h"
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/disk_cache/histogram_macros.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace disk_cache {
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochBackendIO::BackendIO(InFlightIO* controller, BackendImpl* backend,
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     net::CompletionCallback* callback)
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : BackgroundIO(controller), backend_(backend), callback_(callback),
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      operation_(OP_NONE),
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ALLOW_THIS_IN_INITIALIZER_LIST(
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          my_callback_(this, &BackendIO::OnIOComplete)) {
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  start_time_ = base::TimeTicks::Now();
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Runs on the background thread.
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::ExecuteOperation() {
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (IsEntryOperation())
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return ExecuteEntryOperation();
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExecuteBackendOperation();
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Runs on the background thread.
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::OnIOComplete(int result) {
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(IsEntryOperation());
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK_NE(result, net::ERR_IO_PENDING);
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  result_ = result;
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  controller_->OnIOComplete(this);
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BackendIO::IsEntryOperation() {
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return operation_ > OP_MAX_BACKEND;
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Runs on the background thread.
46513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BackendIO::ReferenceEntry() {
47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  entry_->AddRef();
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbase::TimeDelta BackendIO::ElapsedTime() const {
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return base::TimeTicks::Now() - start_time_;
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::Init() {
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_INIT;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::OpenEntry(const std::string& key, Entry** entry) {
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_OPEN;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  key_ = key;
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ptr_ = entry;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::CreateEntry(const std::string& key, Entry** entry) {
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_CREATE;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  key_ = key;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ptr_ = entry;
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::DoomEntry(const std::string& key) {
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_DOOM;
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  key_ = key;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::DoomAllEntries() {
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_DOOM_ALL;
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::DoomEntriesBetween(const base::Time initial_time,
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   const base::Time end_time) {
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_DOOM_BETWEEN;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  initial_time_ = initial_time;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  end_time_ = end_time;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::DoomEntriesSince(const base::Time initial_time) {
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_DOOM_SINCE;
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  initial_time_ = initial_time;
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::OpenNextEntry(void** iter, Entry** next_entry) {
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_OPEN_NEXT;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  iter_ptr_ = iter;
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ptr_ = next_entry;
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::OpenPrevEntry(void** iter, Entry** prev_entry) {
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_OPEN_PREV;
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  iter_ptr_ = iter;
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ptr_ = prev_entry;
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::EndEnumeration(void* iterator) {
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_END_ENUMERATION;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  iter_ = iterator;
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::CloseEntryImpl(EntryImpl* entry) {
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_CLOSE_ENTRY;
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ = entry;
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::DoomEntryImpl(EntryImpl* entry) {
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_DOOM_ENTRY;
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ = entry;
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::FlushQueue() {
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_FLUSH_QUEUE;
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackendIO::RunTask(Task* task) {
1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  operation_ = OP_RUN_TASK;
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  task_ = task;
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::ReadData(EntryImpl* entry, int index, int offset,
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         net::IOBuffer* buf, int buf_len) {
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_READ;
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ = entry;
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  index_ = index;
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  offset_ = offset;
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  buf_ = buf;
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  buf_len_ = buf_len;
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::WriteData(EntryImpl* entry, int index, int offset,
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          net::IOBuffer* buf, int buf_len, bool truncate) {
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_WRITE;
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ = entry;
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  index_ = index;
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  offset_ = offset;
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  buf_ = buf;
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  buf_len_ = buf_len;
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  truncate_ = truncate;
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::ReadSparseData(EntryImpl* entry, int64 offset,
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               net::IOBuffer* buf, int buf_len) {
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_READ_SPARSE;
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ = entry;
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  offset64_ = offset;
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  buf_ = buf;
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  buf_len_ = buf_len;
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::WriteSparseData(EntryImpl* entry, int64 offset,
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                net::IOBuffer* buf, int buf_len) {
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_WRITE_SPARSE;
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ = entry;
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  offset64_ = offset;
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  buf_ = buf;
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  buf_len_ = buf_len;
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::GetAvailableRange(EntryImpl* entry, int64 offset, int len,
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  int64* start) {
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_GET_RANGE;
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ = entry;
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  offset64_ = offset;
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  buf_len_ = len;
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  start_ = start;
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::CancelSparseIO(EntryImpl* entry) {
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_CANCEL_IO;
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ = entry;
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::ReadyForSparseIO(EntryImpl* entry) {
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_IS_READY;
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ = entry;
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
185731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBackendIO::~BackendIO() {}
186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Runs on the background thread.
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::ExecuteBackendOperation() {
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (operation_) {
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_INIT:
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = backend_->SyncInit();
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_OPEN:
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = backend_->SyncOpenEntry(key_, entry_ptr_);
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_CREATE:
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = backend_->SyncCreateEntry(key_, entry_ptr_);
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_DOOM:
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = backend_->SyncDoomEntry(key_);
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_DOOM_ALL:
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = backend_->SyncDoomAllEntries();
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_DOOM_BETWEEN:
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = backend_->SyncDoomEntriesBetween(initial_time_, end_time_);
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_DOOM_SINCE:
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = backend_->SyncDoomEntriesSince(initial_time_);
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_OPEN_NEXT:
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = backend_->SyncOpenNextEntry(iter_ptr_, entry_ptr_);
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_OPEN_PREV:
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = backend_->SyncOpenPrevEntry(iter_ptr_, entry_ptr_);
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_END_ENUMERATION:
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      backend_->SyncEndEnumeration(iter_);
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = net::OK;
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_CLOSE_ENTRY:
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      entry_->Release();
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = net::OK;
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_DOOM_ENTRY:
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      entry_->DoomImpl();
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = net::OK;
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_FLUSH_QUEUE:
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = net::OK;
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case OP_RUN_TASK:
2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      task_->Run();
2343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      delete task_;
2353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      result_ = net::OK;
2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      break;
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED() << "Invalid Operation";
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = net::ERR_UNEXPECTED;
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK_NE(net::ERR_IO_PENDING, result_);
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  controller_->OnIOComplete(this);
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Runs on the background thread.
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::ExecuteEntryOperation() {
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (operation_) {
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_READ:
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = entry_->ReadDataImpl(index_, offset_, buf_, buf_len_,
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     &my_callback_);
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_WRITE:
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = entry_->WriteDataImpl(index_, offset_, buf_, buf_len_,
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      &my_callback_, truncate_);
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_READ_SPARSE:
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = entry_->ReadSparseDataImpl(offset64_, buf_, buf_len_,
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           &my_callback_);
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_WRITE_SPARSE:
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = entry_->WriteSparseDataImpl(offset64_, buf_, buf_len_,
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            &my_callback_);
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_GET_RANGE:
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = entry_->GetAvailableRangeImpl(offset64_, buf_len_, start_);
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_CANCEL_IO:
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      entry_->CancelSparseIOImpl();
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = net::OK;
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_IS_READY:
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = entry_->ReadyForSparseIOImpl(&my_callback_);
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED() << "Invalid Operation";
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = net::ERR_UNEXPECTED;
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (result_ != net::ERR_IO_PENDING)
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    controller_->OnIOComplete(this);
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ---------------------------------------------------------------------------
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2843345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickInFlightBackendIO::InFlightBackendIO(BackendImpl* backend,
2853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                    base::MessageLoopProxy* background_thread)
2863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : backend_(backend),
287dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      background_thread_(background_thread) {
2883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2903345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickInFlightBackendIO::~InFlightBackendIO() {
2913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::Init(CompletionCallback* callback) {
294513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback));
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->Init();
296dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::OpenEntry(const std::string& key, Entry** entry,
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  CompletionCallback* callback) {
301513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback));
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->OpenEntry(key, entry);
303dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::CreateEntry(const std::string& key, Entry** entry,
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    CompletionCallback* callback) {
308513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback));
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->CreateEntry(key, entry);
310dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::DoomEntry(const std::string& key,
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  CompletionCallback* callback) {
315513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback));
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->DoomEntry(key);
317dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::DoomAllEntries(CompletionCallback* callback) {
321513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback));
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->DoomAllEntries();
323dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::DoomEntriesBetween(const base::Time initial_time,
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const base::Time end_time,
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        CompletionCallback* callback) {
329513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback));
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->DoomEntriesBetween(initial_time, end_time);
331dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::DoomEntriesSince(const base::Time initial_time,
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         CompletionCallback* callback) {
336513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback));
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->DoomEntriesSince(initial_time);
338dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::OpenNextEntry(void** iter, Entry** next_entry,
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      CompletionCallback* callback) {
343513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback));
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->OpenNextEntry(iter, next_entry);
345dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::OpenPrevEntry(void** iter, Entry** prev_entry,
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      CompletionCallback* callback) {
350513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback));
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->OpenPrevEntry(iter, prev_entry);
352dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::EndEnumeration(void* iterator) {
356513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, NULL));
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->EndEnumeration(iterator);
358dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::CloseEntryImpl(EntryImpl* entry) {
362513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, NULL));
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->CloseEntryImpl(entry);
364dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::DoomEntryImpl(EntryImpl* entry) {
368513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, NULL));
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->DoomEntryImpl(entry);
370dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::FlushQueue(net::CompletionCallback* callback) {
374513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback));
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->FlushQueue();
376dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid InFlightBackendIO::RunTask(Task* task, net::CompletionCallback* callback) {
380513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback));
3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  operation->RunTask(task);
382dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
3833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::ReadData(EntryImpl* entry, int index, int offset,
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 net::IOBuffer* buf, int buf_len,
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CompletionCallback* callback) {
388513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback));
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->ReadData(entry, index, offset, buf, buf_len);
390dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::WriteData(EntryImpl* entry, int index, int offset,
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  net::IOBuffer* buf, int buf_len,
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  bool truncate,
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  CompletionCallback* callback) {
397513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback));
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->WriteData(entry, index, offset, buf, buf_len, truncate);
399dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::ReadSparseData(EntryImpl* entry, int64 offset,
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       net::IOBuffer* buf, int buf_len,
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       CompletionCallback* callback) {
405513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback));
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->ReadSparseData(entry, offset, buf, buf_len);
407dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::WriteSparseData(EntryImpl* entry, int64 offset,
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        net::IOBuffer* buf, int buf_len,
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        CompletionCallback* callback) {
413513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback));
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->WriteSparseData(entry, offset, buf, buf_len);
415dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::GetAvailableRange(EntryImpl* entry, int64 offset,
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          int len, int64* start,
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          CompletionCallback* callback) {
421513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback));
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->GetAvailableRange(entry, offset, len, start);
423dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::CancelSparseIO(EntryImpl* entry) {
427513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, NULL));
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->CancelSparseIO(entry);
429dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::ReadyForSparseIO(EntryImpl* entry,
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         CompletionCallback* callback) {
434513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback));
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->ReadyForSparseIO(entry);
436dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  PostOperation(operation);
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::WaitForPendingIO() {
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  InFlightIO::WaitForPendingIO();
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::OnOperationComplete(BackgroundIO* operation,
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            bool cancel) {
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendIO* op = static_cast<BackendIO*>(operation);
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (op->IsEntryOperation()) {
448dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    CACHE_UMA(TIMES, "TotalIOTime", 0, op->ElapsedTime());
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (op->callback() && (!cancel || op->IsEntryOperation()))
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    op->callback()->Run(op->result());
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::PostOperation(BackendIO* operation) {
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  background_thread_->PostTask(FROM_HERE,
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewRunnableMethod(operation, &BackendIO::ExecuteOperation));
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OnOperationPosted(operation);
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
462