1bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// found in the LICENSE file. 4bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 5bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#ifndef NET_DISK_CACHE_SIMPLE_SIMPLE_ENTRY_OPERATION_H_ 6bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#define NET_DISK_CACHE_SIMPLE_SIMPLE_ENTRY_OPERATION_H_ 7bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 8bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "base/memory/ref_counted.h" 9bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "net/base/completion_callback.h" 10bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "net/base/net_log.h" 11bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 12bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochnamespace net { 13bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass IOBuffer; 14bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 15bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 16bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochnamespace disk_cache { 17bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 18bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass Entry; 19bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass SimpleEntryImpl; 20bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 21bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// SimpleEntryOperation stores the information regarding operations in 22bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// SimpleEntryImpl, between the moment they are issued by users of the backend, 23bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// and the moment when they are executed. 24bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass SimpleEntryOperation { 25bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch public: 26bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch typedef net::CompletionCallback CompletionCallback; 27bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 28bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch enum EntryOperationType { 29bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch TYPE_OPEN = 0, 30bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch TYPE_CREATE = 1, 31bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch TYPE_CLOSE = 2, 32bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch TYPE_READ = 3, 33bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch TYPE_WRITE = 4, 340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) TYPE_READ_SPARSE = 5, 350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) TYPE_WRITE_SPARSE = 6, 360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) TYPE_GET_AVAILABLE_RANGE = 7, 370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) TYPE_DOOM = 8, 38bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch }; 39bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 40bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch SimpleEntryOperation(const SimpleEntryOperation& other); 41bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch ~SimpleEntryOperation(); 42bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 43bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch static SimpleEntryOperation OpenOperation(SimpleEntryImpl* entry, 44bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch bool have_index, 45bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const CompletionCallback& callback, 46bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch Entry** out_entry); 47bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch static SimpleEntryOperation CreateOperation( 48bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch SimpleEntryImpl* entry, 49bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch bool have_index, 50bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const CompletionCallback& callback, 51bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch Entry** out_entry); 52bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch static SimpleEntryOperation CloseOperation(SimpleEntryImpl* entry); 53bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch static SimpleEntryOperation ReadOperation(SimpleEntryImpl* entry, 54bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch int index, 55bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch int offset, 56bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch int length, 57bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch net::IOBuffer* buf, 58bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const CompletionCallback& callback, 59bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch bool alone_in_queue); 60bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch static SimpleEntryOperation WriteOperation( 61bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch SimpleEntryImpl* entry, 62bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch int index, 63bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch int offset, 64bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch int length, 65bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch net::IOBuffer* buf, 66bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch bool truncate, 67bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch bool optimistic, 68bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const CompletionCallback& callback); 690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) static SimpleEntryOperation ReadSparseOperation( 700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SimpleEntryImpl* entry, 710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int64 sparse_offset, 720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int length, 730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) net::IOBuffer* buf, 740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const CompletionCallback& callback); 750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) static SimpleEntryOperation WriteSparseOperation( 760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SimpleEntryImpl* entry, 770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int64 sparse_offset, 780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int length, 790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) net::IOBuffer* buf, 800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const CompletionCallback& callback); 810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) static SimpleEntryOperation GetAvailableRangeOperation( 820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) SimpleEntryImpl* entry, 830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int64 sparse_offset, 840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int length, 850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int64* out_start, 860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const CompletionCallback& callback); 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static SimpleEntryOperation DoomOperation( 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SimpleEntryImpl* entry, 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const CompletionCallback& callback); 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 91bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch bool ConflictsWith(const SimpleEntryOperation& other_op) const; 92bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // Releases all references. After calling this operation, SimpleEntryOperation 93bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // will only hold POD members. 94bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch void ReleaseReferences(); 95bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 96bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch EntryOperationType type() const { 97bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return static_cast<EntryOperationType>(type_); 98bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 99bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const CompletionCallback& callback() const { return callback_; } 100bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch Entry** out_entry() { return out_entry_; } 101bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch bool have_index() const { return have_index_; } 102bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch int index() const { return index_; } 103bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch int offset() const { return offset_; } 1040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int64 sparse_offset() const { return sparse_offset_; } 105bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch int length() const { return length_; } 1060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int64* out_start() { return out_start_; } 107bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch net::IOBuffer* buf() { return buf_.get(); } 108bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch bool truncate() const { return truncate_; } 109bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch bool optimistic() const { return optimistic_; } 110bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch bool alone_in_queue() const { return alone_in_queue_; } 111bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 112bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch private: 113bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch SimpleEntryOperation(SimpleEntryImpl* entry, 114bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch net::IOBuffer* buf, 115bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const CompletionCallback& callback, 116bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch Entry** out_entry, 117bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch int offset, 1180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int64 sparse_offset, 119bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch int length, 1200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int64* out_start, 121bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch EntryOperationType type, 122bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch bool have_index, 123bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch int index, 124bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch bool truncate, 125bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch bool optimistic, 126bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch bool alone_in_queue); 127bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 128bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // This ensures entry will not be deleted until the operation has ran. 129bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch scoped_refptr<SimpleEntryImpl> entry_; 130bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch scoped_refptr<net::IOBuffer> buf_; 131bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch CompletionCallback callback_; 132bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 133bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // Used in open and create operations. 134bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch Entry** out_entry_; 135bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 136bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // Used in write and read operations. 137bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const int offset_; 1380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const int64 sparse_offset_; 139bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch const int length_; 140bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 1410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Used in get available range operations. 1420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) int64* const out_start_; 1430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const EntryOperationType type_; 145bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // Used in open and create operations. 1460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const bool have_index_; 147bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // Used in write and read operations. 1480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const unsigned int index_; 149bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // Used only in write operations. 1500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const bool truncate_; 1510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const bool optimistic_; 152bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch // Used only in SimpleCache.ReadIsParallelizable histogram. 1530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const bool alone_in_queue_; 154bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}; 155bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 156bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} // namespace disk_cache 157bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 158bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif // NET_DISK_CACHE_SIMPLE_SIMPLE_ENTRY_OPERATION_H_ 159