| OLD | NEW |
| (Empty) |
| 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 | |
| OLD | NEW |