15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef NET_DISK_CACHE_BLOCKFILE_IN_FLIGHT_BACKEND_IO_H_ 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define NET_DISK_CACHE_BLOCKFILE_IN_FLIGHT_BACKEND_IO_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/memory/ref_counted.h" 1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/single_thread_task_runner.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/completion_callback.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/disk_cache/blockfile/in_flight_io.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/disk_cache/blockfile/rankings.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace disk_cache { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BackendImpl; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Entry; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EntryImpl; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class represents a single asynchronous disk cache IO operation while it 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is being bounced between threads. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BackendIO : public BackgroundIO { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendIO(InFlightIO* controller, BackendImpl* backend, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Runs the actual operation on the background thread. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExecuteOperation(); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback implementation. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnIOComplete(int result); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when we are finishing this operation. If |cancel| is true, the user 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callback will not be invoked. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnDone(bool cancel); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if this operation is directed to an entry (vs. the backend). 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsEntryOperation(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CompletionCallback callback() const { return callback_; } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Grabs an extra reference of entry_. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReferenceEntry(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The operations we proxy: 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Init(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenEntry(const std::string& key, Entry** entry); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateEntry(const std::string& key, Entry** entry); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoomEntry(const std::string& key); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoomAllEntries(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoomEntriesBetween(const base::Time initial_time, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time end_time); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoomEntriesSince(const base::Time initial_time); 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OpenNextEntry(Rankings::Iterator* iterator, Entry** next_entry); 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void EndEnumeration(scoped_ptr<Rankings::Iterator> iterator); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnExternalCacheHit(const std::string& key); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CloseEntryImpl(EntryImpl* entry); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoomEntryImpl(EntryImpl* entry); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FlushQueue(); // Dummy operation. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunTask(const base::Closure& task); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReadData(EntryImpl* entry, int index, int offset, net::IOBuffer* buf, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buf_len); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WriteData(EntryImpl* entry, int index, int offset, net::IOBuffer* buf, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buf_len, bool truncate); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReadSparseData(EntryImpl* entry, int64 offset, net::IOBuffer* buf, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buf_len); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WriteSparseData(EntryImpl* entry, int64 offset, net::IOBuffer* buf, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buf_len); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetAvailableRange(EntryImpl* entry, int64 offset, int len, int64* start); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelSparseIO(EntryImpl* entry); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReadyForSparseIO(EntryImpl* entry); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There are two types of operations to proxy: regular backend operations are 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // executed sequentially (queued by the message loop). On the other hand, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // operations targeted to a given entry can be long lived and support multiple 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // simultaneous users (multiple reads or writes to the same entry), and they 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are subject to throttling, so we keep an explicit queue. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Operation { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_NONE = 0, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_INIT, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_OPEN, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_CREATE, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_DOOM, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_DOOM_ALL, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_DOOM_BETWEEN, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_DOOM_SINCE, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_OPEN_NEXT, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_END_ENUMERATION, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_ON_EXTERNAL_CACHE_HIT, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_CLOSE_ENTRY, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_DOOM_ENTRY, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_FLUSH_QUEUE, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_RUN_TASK, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_MAX_BACKEND, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_READ, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_WRITE, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_READ_SPARSE, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_WRITE_SPARSE, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_GET_RANGE, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_CANCEL_IO, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OP_IS_READY 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BackendIO(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if this operation returns an entry. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ReturnsEntry(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the time that has passed since the operation was created. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta ElapsedTime() const; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExecuteBackendOperation(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExecuteEntryOperation(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendImpl* backend_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CompletionCallback callback_; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Operation operation_; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The arguments of all the operations we proxy: 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string key_; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Entry** entry_ptr_; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time initial_time_; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time end_time_; 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Rankings::Iterator* iterator_; 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<Rankings::Iterator> scoped_iterator_; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EntryImpl* entry_; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int offset_; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buf_; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buf_len_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool truncate_; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 offset64_; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64* start_; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks start_time_; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure task_; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BackendIO); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The specialized controller that keeps track of current operations. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InFlightBackendIO : public InFlightIO { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) InFlightBackendIO( 15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) BackendImpl* backend, 15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const scoped_refptr<base::SingleThreadTaskRunner>& background_thread); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~InFlightBackendIO(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Proxied operations. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Init(const net::CompletionCallback& callback); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenEntry(const std::string& key, Entry** entry, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateEntry(const std::string& key, Entry** entry, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoomEntry(const std::string& key, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoomAllEntries(const net::CompletionCallback& callback); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoomEntriesBetween(const base::Time initial_time, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time end_time, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoomEntriesSince(const base::Time initial_time, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback); 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OpenNextEntry(Rankings::Iterator* iterator, Entry** next_entry, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback); 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void EndEnumeration(scoped_ptr<Rankings::Iterator> iterator); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnExternalCacheHit(const std::string& key); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CloseEntryImpl(EntryImpl* entry); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DoomEntryImpl(EntryImpl* entry); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FlushQueue(const net::CompletionCallback& callback); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunTask(const base::Closure& task, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReadData(EntryImpl* entry, int index, int offset, net::IOBuffer* buf, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buf_len, const net::CompletionCallback& callback); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WriteData( 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EntryImpl* entry, int index, int offset, net::IOBuffer* buf, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buf_len, bool truncate, const net::CompletionCallback& callback); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReadSparseData(EntryImpl* entry, int64 offset, net::IOBuffer* buf, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buf_len, const net::CompletionCallback& callback); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WriteSparseData(EntryImpl* entry, int64 offset, net::IOBuffer* buf, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int buf_len, const net::CompletionCallback& callback); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetAvailableRange(EntryImpl* entry, int64 offset, int len, int64* start, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelSparseIO(EntryImpl* entry); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReadyForSparseIO(EntryImpl* entry, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Blocks until all operations are cancelled or completed. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WaitForPendingIO(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> background_thread() { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return background_thread_; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the current thread is the background thread. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool BackgroundIsCurrentThread() { 20103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return background_thread_->RunsTasksOnCurrentThread(); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtr<InFlightBackendIO> GetWeakPtr(); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnOperationComplete(BackgroundIO* operation, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool cancel) OVERRIDE; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PostOperation(BackendIO* operation); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BackendImpl* backend_; 21403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> background_thread_; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<InFlightBackendIO> ptr_factory_; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(InFlightBackendIO); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace disk_cache 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // NET_DISK_CACHE_BLOCKFILE_IN_FLIGHT_BACKEND_IO_H_ 223