Home | History | Annotate | Download | only in simple
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "net/disk_cache/simple/simple_entry_operation.h"
      6 
      7 #include "base/logging.h"
      8 #include "net/base/io_buffer.h"
      9 #include "net/disk_cache/disk_cache.h"
     10 #include "net/disk_cache/simple/simple_entry_impl.h"
     11 
     12 namespace disk_cache {
     13 
     14 namespace {
     15 
     16 bool IsReadWriteType(unsigned int type) {
     17   return type == SimpleEntryOperation::TYPE_READ ||
     18          type == SimpleEntryOperation::TYPE_WRITE ||
     19          type == SimpleEntryOperation::TYPE_READ_SPARSE ||
     20          type == SimpleEntryOperation::TYPE_WRITE_SPARSE;
     21 }
     22 
     23 bool IsReadType(unsigned type) {
     24   return type == SimpleEntryOperation::TYPE_READ ||
     25          type == SimpleEntryOperation::TYPE_READ_SPARSE;
     26 }
     27 
     28 bool IsSparseType(unsigned type) {
     29   return type == SimpleEntryOperation::TYPE_READ_SPARSE ||
     30          type == SimpleEntryOperation::TYPE_WRITE_SPARSE;
     31 }
     32 
     33 }
     34 
     35 SimpleEntryOperation::SimpleEntryOperation(const SimpleEntryOperation& other)
     36     : entry_(other.entry_.get()),
     37       buf_(other.buf_),
     38       callback_(other.callback_),
     39       out_entry_(other.out_entry_),
     40       offset_(other.offset_),
     41       sparse_offset_(other.sparse_offset_),
     42       length_(other.length_),
     43       out_start_(other.out_start_),
     44       type_(other.type_),
     45       have_index_(other.have_index_),
     46       index_(other.index_),
     47       truncate_(other.truncate_),
     48       optimistic_(other.optimistic_),
     49       alone_in_queue_(other.alone_in_queue_) {
     50 }
     51 
     52 SimpleEntryOperation::~SimpleEntryOperation() {}
     53 
     54 // static
     55 SimpleEntryOperation SimpleEntryOperation::OpenOperation(
     56     SimpleEntryImpl* entry,
     57     bool have_index,
     58     const CompletionCallback& callback,
     59     Entry** out_entry) {
     60   return SimpleEntryOperation(entry,
     61                               NULL,
     62                               callback,
     63                               out_entry,
     64                               0,
     65                               0,
     66                               0,
     67                               NULL,
     68                               TYPE_OPEN,
     69                               have_index,
     70                               0,
     71                               false,
     72                               false,
     73                               false);
     74 }
     75 
     76 // static
     77 SimpleEntryOperation SimpleEntryOperation::CreateOperation(
     78     SimpleEntryImpl* entry,
     79     bool have_index,
     80     const CompletionCallback& callback,
     81     Entry** out_entry) {
     82   return SimpleEntryOperation(entry,
     83                               NULL,
     84                               callback,
     85                               out_entry,
     86                               0,
     87                               0,
     88                               0,
     89                               NULL,
     90                               TYPE_CREATE,
     91                               have_index,
     92                               0,
     93                               false,
     94                               false,
     95                               false);
     96 }
     97 
     98 // static
     99 SimpleEntryOperation SimpleEntryOperation::CloseOperation(
    100     SimpleEntryImpl* entry) {
    101   return SimpleEntryOperation(entry,
    102                               NULL,
    103                               CompletionCallback(),
    104                               NULL,
    105                               0,
    106                               0,
    107                               0,
    108                               NULL,
    109                               TYPE_CLOSE,
    110                               false,
    111                               0,
    112                               false,
    113                               false,
    114                               false);
    115 }
    116 
    117 // static
    118 SimpleEntryOperation SimpleEntryOperation::ReadOperation(
    119     SimpleEntryImpl* entry,
    120     int index,
    121     int offset,
    122     int length,
    123     net::IOBuffer* buf,
    124     const CompletionCallback& callback,
    125     bool alone_in_queue) {
    126   return SimpleEntryOperation(entry,
    127                               buf,
    128                               callback,
    129                               NULL,
    130                               offset,
    131                               0,
    132                               length,
    133                               NULL,
    134                               TYPE_READ,
    135                               false,
    136                               index,
    137                               false,
    138                               false,
    139                               alone_in_queue);
    140 }
    141 
    142 // static
    143 SimpleEntryOperation SimpleEntryOperation::WriteOperation(
    144     SimpleEntryImpl* entry,
    145     int index,
    146     int offset,
    147     int length,
    148     net::IOBuffer* buf,
    149     bool truncate,
    150     bool optimistic,
    151     const CompletionCallback& callback) {
    152   return SimpleEntryOperation(entry,
    153                               buf,
    154                               callback,
    155                               NULL,
    156                               offset,
    157                               0,
    158                               length,
    159                               NULL,
    160                               TYPE_WRITE,
    161                               false,
    162                               index,
    163                               truncate,
    164                               optimistic,
    165                               false);
    166 }
    167 
    168 // static
    169 SimpleEntryOperation SimpleEntryOperation::ReadSparseOperation(
    170     SimpleEntryImpl* entry,
    171     int64 sparse_offset,
    172     int length,
    173     net::IOBuffer* buf,
    174     const CompletionCallback& callback) {
    175   return SimpleEntryOperation(entry,
    176                               buf,
    177                               callback,
    178                               NULL,
    179                               0,
    180                               sparse_offset,
    181                               length,
    182                               NULL,
    183                               TYPE_READ_SPARSE,
    184                               false,
    185                               0,
    186                               false,
    187                               false,
    188                               false);
    189 }
    190 
    191 // static
    192 SimpleEntryOperation SimpleEntryOperation::WriteSparseOperation(
    193     SimpleEntryImpl* entry,
    194     int64 sparse_offset,
    195     int length,
    196     net::IOBuffer* buf,
    197     const CompletionCallback& callback) {
    198   return SimpleEntryOperation(entry,
    199                               buf,
    200                               callback,
    201                               NULL,
    202                               0,
    203                               sparse_offset,
    204                               length,
    205                               NULL,
    206                               TYPE_WRITE_SPARSE,
    207                               false,
    208                               0,
    209                               false,
    210                               false,
    211                               false);
    212 }
    213 
    214 // static
    215 SimpleEntryOperation SimpleEntryOperation::GetAvailableRangeOperation(
    216     SimpleEntryImpl* entry,
    217     int64 sparse_offset,
    218     int length,
    219     int64* out_start,
    220     const CompletionCallback& callback) {
    221   return SimpleEntryOperation(entry,
    222                               NULL,
    223                               callback,
    224                               NULL,
    225                               0,
    226                               sparse_offset,
    227                               length,
    228                               out_start,
    229                               TYPE_GET_AVAILABLE_RANGE,
    230                               false,
    231                               0,
    232                               false,
    233                               false,
    234                               false);
    235 }
    236 
    237 // static
    238 SimpleEntryOperation SimpleEntryOperation::DoomOperation(
    239     SimpleEntryImpl* entry,
    240     const CompletionCallback& callback) {
    241   net::IOBuffer* const buf = NULL;
    242   Entry** const out_entry = NULL;
    243   const int offset = 0;
    244   const int64 sparse_offset = 0;
    245   const int length = 0;
    246   int64* const out_start = NULL;
    247   const bool have_index = false;
    248   const int index = 0;
    249   const bool truncate = false;
    250   const bool optimistic = false;
    251   const bool alone_in_queue = false;
    252   return SimpleEntryOperation(entry,
    253                               buf,
    254                               callback,
    255                               out_entry,
    256                               offset,
    257                               sparse_offset,
    258                               length,
    259                               out_start,
    260                               TYPE_DOOM,
    261                               have_index,
    262                               index,
    263                               truncate,
    264                               optimistic,
    265                               alone_in_queue);
    266 }
    267 
    268 bool SimpleEntryOperation::ConflictsWith(
    269     const SimpleEntryOperation& other_op) const {
    270   EntryOperationType other_type = other_op.type();
    271 
    272   // Non-read/write operations conflict with everything.
    273   if (!IsReadWriteType(type_) || !IsReadWriteType(other_type))
    274     return true;
    275 
    276   // Reads (sparse or otherwise) conflict with nothing.
    277   if (IsReadType(type_) && IsReadType(other_type))
    278     return false;
    279 
    280   // Sparse and non-sparse operations do not conflict with each other.
    281   if (IsSparseType(type_) != IsSparseType(other_type)) {
    282     return false;
    283   }
    284 
    285   // There must be two read/write operations, at least one must be a write, and
    286   // they must be either both non-sparse or both sparse.  Compare the streams
    287   // and offsets to see whether they overlap.
    288 
    289   if (IsSparseType(type_)) {
    290     int64 end = sparse_offset_ + length_;
    291     int64 other_op_end = other_op.sparse_offset() + other_op.length();
    292     return sparse_offset_ < other_op_end && other_op.sparse_offset() < end;
    293   }
    294 
    295   if (index_ != other_op.index_)
    296     return false;
    297   int end = (type_ == TYPE_WRITE && truncate_) ? INT_MAX : offset_ + length_;
    298   int other_op_end = (other_op.type() == TYPE_WRITE && other_op.truncate())
    299                          ? INT_MAX
    300                          : other_op.offset() + other_op.length();
    301   return offset_ < other_op_end && other_op.offset() < end;
    302 }
    303 
    304 void SimpleEntryOperation::ReleaseReferences() {
    305   callback_ = CompletionCallback();
    306   buf_ = NULL;
    307   entry_ = NULL;
    308 }
    309 
    310 SimpleEntryOperation::SimpleEntryOperation(SimpleEntryImpl* entry,
    311                                            net::IOBuffer* buf,
    312                                            const CompletionCallback& callback,
    313                                            Entry** out_entry,
    314                                            int offset,
    315                                            int64 sparse_offset,
    316                                            int length,
    317                                            int64* out_start,
    318                                            EntryOperationType type,
    319                                            bool have_index,
    320                                            int index,
    321                                            bool truncate,
    322                                            bool optimistic,
    323                                            bool alone_in_queue)
    324     : entry_(entry),
    325       buf_(buf),
    326       callback_(callback),
    327       out_entry_(out_entry),
    328       offset_(offset),
    329       sparse_offset_(sparse_offset),
    330       length_(length),
    331       out_start_(out_start),
    332       type_(type),
    333       have_index_(have_index),
    334       index_(index),
    335       truncate_(truncate),
    336       optimistic_(optimistic),
    337       alone_in_queue_(alone_in_queue) {
    338 }
    339 
    340 }  // namespace disk_cache
    341