in_flight_backend_io.cc revision 3345a6884c488ff3a535c2c9acdd33d74b37e311
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
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::ReleaseEntry() {
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ = NULL;
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbase::TimeDelta BackendIO::ElapsedTime() const {
503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return base::TimeTicks::Now() - start_time_;
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::Init() {
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_INIT;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::OpenEntry(const std::string& key, Entry** entry) {
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_OPEN;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  key_ = key;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ptr_ = entry;
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::CreateEntry(const std::string& key, Entry** entry) {
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_CREATE;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  key_ = key;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ptr_ = entry;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::DoomEntry(const std::string& key) {
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_DOOM;
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  key_ = key;
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::DoomAllEntries() {
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_DOOM_ALL;
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::DoomEntriesBetween(const base::Time initial_time,
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   const base::Time end_time) {
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_DOOM_BETWEEN;
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  initial_time_ = initial_time;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  end_time_ = end_time;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::DoomEntriesSince(const base::Time initial_time) {
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_DOOM_SINCE;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  initial_time_ = initial_time;
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::OpenNextEntry(void** iter, Entry** next_entry) {
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_OPEN_NEXT;
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  iter_ptr_ = iter;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ptr_ = next_entry;
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::OpenPrevEntry(void** iter, Entry** prev_entry) {
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_OPEN_PREV;
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  iter_ptr_ = iter;
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ptr_ = prev_entry;
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::EndEnumeration(void* iterator) {
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_END_ENUMERATION;
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  iter_ = iterator;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::CloseEntryImpl(EntryImpl* entry) {
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_CLOSE_ENTRY;
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ = entry;
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::DoomEntryImpl(EntryImpl* entry) {
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_DOOM_ENTRY;
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ = entry;
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::FlushQueue() {
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_FLUSH_QUEUE;
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid BackendIO::RunTask(Task* task) {
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  operation_ = OP_RUN_TASK;
1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  task_ = task;
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::ReadData(EntryImpl* entry, int index, int offset,
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         net::IOBuffer* buf, int buf_len) {
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_READ;
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ = entry;
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  index_ = index;
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  offset_ = offset;
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  buf_ = buf;
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  buf_len_ = buf_len;
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::WriteData(EntryImpl* entry, int index, int offset,
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          net::IOBuffer* buf, int buf_len, bool truncate) {
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_WRITE;
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ = entry;
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  index_ = index;
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  offset_ = offset;
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  buf_ = buf;
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  buf_len_ = buf_len;
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  truncate_ = truncate;
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::ReadSparseData(EntryImpl* entry, int64 offset,
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               net::IOBuffer* buf, int buf_len) {
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_READ_SPARSE;
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ = entry;
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  offset64_ = offset;
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  buf_ = buf;
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  buf_len_ = buf_len;
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::WriteSparseData(EntryImpl* entry, int64 offset,
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                net::IOBuffer* buf, int buf_len) {
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_WRITE_SPARSE;
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ = entry;
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  offset64_ = offset;
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  buf_ = buf;
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  buf_len_ = buf_len;
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::GetAvailableRange(EntryImpl* entry, int64 offset, int len,
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  int64* start) {
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_GET_RANGE;
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ = entry;
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  offset64_ = offset;
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  buf_len_ = len;
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  start_ = start;
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::CancelSparseIO(EntryImpl* entry) {
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_CANCEL_IO;
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ = entry;
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::ReadyForSparseIO(EntryImpl* entry) {
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation_ = OP_IS_READY;
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  entry_ = entry;
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Runs on the background thread.
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::ExecuteBackendOperation() {
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (operation_) {
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_INIT:
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = backend_->SyncInit();
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_OPEN:
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = backend_->SyncOpenEntry(key_, entry_ptr_);
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_CREATE:
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = backend_->SyncCreateEntry(key_, entry_ptr_);
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_DOOM:
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = backend_->SyncDoomEntry(key_);
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_DOOM_ALL:
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = backend_->SyncDoomAllEntries();
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_DOOM_BETWEEN:
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = backend_->SyncDoomEntriesBetween(initial_time_, end_time_);
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_DOOM_SINCE:
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = backend_->SyncDoomEntriesSince(initial_time_);
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_OPEN_NEXT:
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = backend_->SyncOpenNextEntry(iter_ptr_, entry_ptr_);
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_OPEN_PREV:
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = backend_->SyncOpenPrevEntry(iter_ptr_, entry_ptr_);
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_END_ENUMERATION:
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      backend_->SyncEndEnumeration(iter_);
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = net::OK;
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_CLOSE_ENTRY:
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      entry_->Release();
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = net::OK;
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_DOOM_ENTRY:
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      entry_->DoomImpl();
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = net::OK;
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_FLUSH_QUEUE:
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = net::OK;
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
2293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case OP_RUN_TASK:
2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      task_->Run();
2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      delete task_;
2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      result_ = net::OK;
2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      break;
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED() << "Invalid Operation";
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = net::ERR_UNEXPECTED;
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK_NE(net::ERR_IO_PENDING, result_);
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  controller_->OnIOComplete(this);
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Runs on the background thread.
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BackendIO::ExecuteEntryOperation() {
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (operation_) {
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_READ:
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = entry_->ReadDataImpl(index_, offset_, buf_, buf_len_,
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     &my_callback_);
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_WRITE:
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = entry_->WriteDataImpl(index_, offset_, buf_, buf_len_,
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      &my_callback_, truncate_);
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_READ_SPARSE:
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = entry_->ReadSparseDataImpl(offset64_, buf_, buf_len_,
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           &my_callback_);
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_WRITE_SPARSE:
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = entry_->WriteSparseDataImpl(offset64_, buf_, buf_len_,
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            &my_callback_);
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_GET_RANGE:
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = entry_->GetAvailableRangeImpl(offset64_, buf_len_, start_);
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_CANCEL_IO:
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      entry_->CancelSparseIOImpl();
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = net::OK;
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case OP_IS_READY:
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = entry_->ReadyForSparseIOImpl(&my_callback_);
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED() << "Invalid Operation";
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      result_ = net::ERR_UNEXPECTED;
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (result_ != net::ERR_IO_PENDING)
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    controller_->OnIOComplete(this);
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ---------------------------------------------------------------------------
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2813345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickInFlightBackendIO::InFlightBackendIO(BackendImpl* backend,
2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                    base::MessageLoopProxy* background_thread)
2833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : backend_(backend),
2843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      background_thread_(background_thread),
2853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      queue_entry_ops_(false) {
2863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2883345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickInFlightBackendIO::~InFlightBackendIO() {
2893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::Init(CompletionCallback* callback) {
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, callback);
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->Init();
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::OpenEntry(const std::string& key, Entry** entry,
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  CompletionCallback* callback) {
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, callback);
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->OpenEntry(key, entry);
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::CreateEntry(const std::string& key, Entry** entry,
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    CompletionCallback* callback) {
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, callback);
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->CreateEntry(key, entry);
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::DoomEntry(const std::string& key,
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  CompletionCallback* callback) {
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, callback);
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->DoomEntry(key);
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::DoomAllEntries(CompletionCallback* callback) {
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, callback);
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->DoomAllEntries();
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::DoomEntriesBetween(const base::Time initial_time,
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const base::Time end_time,
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        CompletionCallback* callback) {
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, callback);
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->DoomEntriesBetween(initial_time, end_time);
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::DoomEntriesSince(const base::Time initial_time,
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         CompletionCallback* callback) {
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, callback);
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->DoomEntriesSince(initial_time);
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::OpenNextEntry(void** iter, Entry** next_entry,
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      CompletionCallback* callback) {
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, callback);
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->OpenNextEntry(iter, next_entry);
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::OpenPrevEntry(void** iter, Entry** prev_entry,
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      CompletionCallback* callback) {
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, callback);
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->OpenPrevEntry(iter, prev_entry);
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::EndEnumeration(void* iterator) {
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, NULL);
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->EndEnumeration(iterator);
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::CloseEntryImpl(EntryImpl* entry) {
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, NULL);
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->CloseEntryImpl(entry);
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::DoomEntryImpl(EntryImpl* entry) {
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, NULL);
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->DoomEntryImpl(entry);
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::FlushQueue(net::CompletionCallback* callback) {
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, callback);
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->FlushQueue();
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid InFlightBackendIO::RunTask(Task* task, net::CompletionCallback* callback) {
3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, callback);
3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  operation->RunTask(task);
3803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  QueueOperation(operation);
3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::ReadData(EntryImpl* entry, int index, int offset,
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 net::IOBuffer* buf, int buf_len,
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 CompletionCallback* callback) {
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, callback);
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->ReadData(entry, index, offset, buf, buf_len);
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::WriteData(EntryImpl* entry, int index, int offset,
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  net::IOBuffer* buf, int buf_len,
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  bool truncate,
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  CompletionCallback* callback) {
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, callback);
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->WriteData(entry, index, offset, buf, buf_len, truncate);
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::ReadSparseData(EntryImpl* entry, int64 offset,
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       net::IOBuffer* buf, int buf_len,
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       CompletionCallback* callback) {
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, callback);
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->ReadSparseData(entry, offset, buf, buf_len);
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::WriteSparseData(EntryImpl* entry, int64 offset,
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        net::IOBuffer* buf, int buf_len,
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        CompletionCallback* callback) {
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, callback);
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->WriteSparseData(entry, offset, buf, buf_len);
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::GetAvailableRange(EntryImpl* entry, int64 offset,
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          int len, int64* start,
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          CompletionCallback* callback) {
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, callback);
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->GetAvailableRange(entry, offset, len, start);
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::CancelSparseIO(EntryImpl* entry) {
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, NULL);
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->CancelSparseIO(entry);
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::ReadyForSparseIO(EntryImpl* entry,
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         CompletionCallback* callback) {
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BackendIO> operation = new BackendIO(this, backend_, callback);
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operation->ReadyForSparseIO(entry);
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  QueueOperation(operation);
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::WaitForPendingIO() {
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We clear the list first so that we don't post more operations after this
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // point.
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  pending_ops_.clear();
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  InFlightIO::WaitForPendingIO();
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid InFlightBackendIO::StartQueingOperations() {
4453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  queue_entry_ops_ = true;
4463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
4473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid InFlightBackendIO::StopQueingOperations() {
4493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  queue_entry_ops_ = false;
4503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
4513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::OnOperationComplete(BackgroundIO* operation,
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            bool cancel) {
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BackendIO* op = static_cast<BackendIO*>(operation);
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!op->IsEntryOperation() && !pending_ops_.empty()) {
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Process the next request. Note that invoking the callback may result
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // in the backend destruction (and with it this object), so we should deal
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // with the next operation before invoking the callback.
4603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    PostQueuedOperation(&pending_ops_);
4613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
4623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (op->IsEntryOperation()) {
4643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    backend_->OnOperationCompleted(op->ElapsedTime());
4653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!pending_entry_ops_.empty()) {
4663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      PostQueuedOperation(&pending_entry_ops_);
4673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      // If we are not throttling requests anymore, dispatch the whole queue.
4693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      if (!queue_entry_ops_) {
4703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        CACHE_UMA(COUNTS_10000, "FinalQueuedOperations", 0,
4713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                  pending_entry_ops_.size());
4723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        while (!pending_entry_ops_.empty())
4733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          PostQueuedOperation(&pending_entry_ops_);
4743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      }
4753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (op->callback() && (!cancel || op->IsEntryOperation()))
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    op->callback()->Run(op->result());
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (cancel)
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    op->ReleaseEntry();
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::QueueOperation(BackendIO* operation) {
4863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!operation->IsEntryOperation())
4873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return QueueOperationToList(operation, &pending_ops_);
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!queue_entry_ops_)
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return PostOperation(operation);
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CACHE_UMA(COUNTS_10000, "QueuedOperations", 0, pending_entry_ops_.size());
4933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  QueueOperationToList(operation, &pending_entry_ops_);
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid InFlightBackendIO::PostOperation(BackendIO* operation) {
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  background_thread_->PostTask(FROM_HERE,
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NewRunnableMethod(operation, &BackendIO::ExecuteOperation));
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OnOperationPosted(operation);
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid InFlightBackendIO::PostQueuedOperation(OperationList* from_list) {
5043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_refptr<BackendIO> next_op = from_list->front();
5053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  from_list->pop_front();
5063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  PostOperation(next_op);
5073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
5083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid InFlightBackendIO::QueueOperationToList(BackendIO* operation,
5103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                             OperationList* list) {
5113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (list->empty())
5123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return PostOperation(operation);
5133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  list->push_back(operation);
5153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
5163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
518