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