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