| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/disk_cache/in_flight_backend_io.h" | 5 #include "net/disk_cache/in_flight_backend_io.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 result_ = net::ERR_UNEXPECTED; | 280 result_ = net::ERR_UNEXPECTED; |
| 281 } | 281 } |
| 282 DCHECK_NE(net::ERR_IO_PENDING, result_); | 282 DCHECK_NE(net::ERR_IO_PENDING, result_); |
| 283 NotifyController(); | 283 NotifyController(); |
| 284 } | 284 } |
| 285 | 285 |
| 286 // Runs on the background thread. | 286 // Runs on the background thread. |
| 287 void BackendIO::ExecuteEntryOperation() { | 287 void BackendIO::ExecuteEntryOperation() { |
| 288 switch (operation_) { | 288 switch (operation_) { |
| 289 case OP_READ: | 289 case OP_READ: |
| 290 result_ = entry_->ReadDataImpl( | 290 result_ = |
| 291 index_, offset_, buf_, buf_len_, | 291 entry_->ReadDataImpl(index_, |
| 292 base::Bind(&BackendIO::OnIOComplete, this)); | 292 offset_, |
| 293 buf_.get(), |
| 294 buf_len_, |
| 295 base::Bind(&BackendIO::OnIOComplete, this)); |
| 293 break; | 296 break; |
| 294 case OP_WRITE: | 297 case OP_WRITE: |
| 295 result_ = entry_->WriteDataImpl( | 298 result_ = |
| 296 index_, offset_, buf_, buf_len_, | 299 entry_->WriteDataImpl(index_, |
| 297 base::Bind(&BackendIO::OnIOComplete, this), | 300 offset_, |
| 298 truncate_); | 301 buf_.get(), |
| 302 buf_len_, |
| 303 base::Bind(&BackendIO::OnIOComplete, this), |
| 304 truncate_); |
| 299 break; | 305 break; |
| 300 case OP_READ_SPARSE: | 306 case OP_READ_SPARSE: |
| 301 result_ = entry_->ReadSparseDataImpl( | 307 result_ = entry_->ReadSparseDataImpl( |
| 302 offset64_, buf_, buf_len_, | 308 offset64_, |
| 309 buf_.get(), |
| 310 buf_len_, |
| 303 base::Bind(&BackendIO::OnIOComplete, this)); | 311 base::Bind(&BackendIO::OnIOComplete, this)); |
| 304 break; | 312 break; |
| 305 case OP_WRITE_SPARSE: | 313 case OP_WRITE_SPARSE: |
| 306 result_ = entry_->WriteSparseDataImpl( | 314 result_ = entry_->WriteSparseDataImpl( |
| 307 offset64_, buf_, buf_len_, | 315 offset64_, |
| 316 buf_.get(), |
| 317 buf_len_, |
| 308 base::Bind(&BackendIO::OnIOComplete, this)); | 318 base::Bind(&BackendIO::OnIOComplete, this)); |
| 309 break; | 319 break; |
| 310 case OP_GET_RANGE: | 320 case OP_GET_RANGE: |
| 311 result_ = entry_->GetAvailableRangeImpl(offset64_, buf_len_, start_); | 321 result_ = entry_->GetAvailableRangeImpl(offset64_, buf_len_, start_); |
| 312 break; | 322 break; |
| 313 case OP_CANCEL_IO: | 323 case OP_CANCEL_IO: |
| 314 entry_->CancelSparseIOImpl(); | 324 entry_->CancelSparseIOImpl(); |
| 315 result_ = net::OK; | 325 result_ = net::OK; |
| 316 break; | 326 break; |
| 317 case OP_IS_READY: | 327 case OP_IS_READY: |
| (...skipping 15 matching lines...) Expand all Loading... |
| 333 background_thread_(background_thread), | 343 background_thread_(background_thread), |
| 334 ptr_factory_(this) { | 344 ptr_factory_(this) { |
| 335 } | 345 } |
| 336 | 346 |
| 337 InFlightBackendIO::~InFlightBackendIO() { | 347 InFlightBackendIO::~InFlightBackendIO() { |
| 338 } | 348 } |
| 339 | 349 |
| 340 void InFlightBackendIO::Init(const net::CompletionCallback& callback) { | 350 void InFlightBackendIO::Init(const net::CompletionCallback& callback) { |
| 341 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); | 351 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); |
| 342 operation->Init(); | 352 operation->Init(); |
| 343 PostOperation(operation); | 353 PostOperation(operation.get()); |
| 344 } | 354 } |
| 345 | 355 |
| 346 void InFlightBackendIO::OpenEntry(const std::string& key, Entry** entry, | 356 void InFlightBackendIO::OpenEntry(const std::string& key, Entry** entry, |
| 347 const net::CompletionCallback& callback) { | 357 const net::CompletionCallback& callback) { |
| 348 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); | 358 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); |
| 349 operation->OpenEntry(key, entry); | 359 operation->OpenEntry(key, entry); |
| 350 PostOperation(operation); | 360 PostOperation(operation.get()); |
| 351 } | 361 } |
| 352 | 362 |
| 353 void InFlightBackendIO::CreateEntry(const std::string& key, Entry** entry, | 363 void InFlightBackendIO::CreateEntry(const std::string& key, Entry** entry, |
| 354 const net::CompletionCallback& callback) { | 364 const net::CompletionCallback& callback) { |
| 355 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); | 365 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); |
| 356 operation->CreateEntry(key, entry); | 366 operation->CreateEntry(key, entry); |
| 357 PostOperation(operation); | 367 PostOperation(operation.get()); |
| 358 } | 368 } |
| 359 | 369 |
| 360 void InFlightBackendIO::DoomEntry(const std::string& key, | 370 void InFlightBackendIO::DoomEntry(const std::string& key, |
| 361 const net::CompletionCallback& callback) { | 371 const net::CompletionCallback& callback) { |
| 362 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); | 372 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); |
| 363 operation->DoomEntry(key); | 373 operation->DoomEntry(key); |
| 364 PostOperation(operation); | 374 PostOperation(operation.get()); |
| 365 } | 375 } |
| 366 | 376 |
| 367 void InFlightBackendIO::DoomAllEntries( | 377 void InFlightBackendIO::DoomAllEntries( |
| 368 const net::CompletionCallback& callback) { | 378 const net::CompletionCallback& callback) { |
| 369 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); | 379 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); |
| 370 operation->DoomAllEntries(); | 380 operation->DoomAllEntries(); |
| 371 PostOperation(operation); | 381 PostOperation(operation.get()); |
| 372 } | 382 } |
| 373 | 383 |
| 374 void InFlightBackendIO::DoomEntriesBetween(const base::Time initial_time, | 384 void InFlightBackendIO::DoomEntriesBetween(const base::Time initial_time, |
| 375 const base::Time end_time, | 385 const base::Time end_time, |
| 376 const net::CompletionCallback& callback) { | 386 const net::CompletionCallback& callback) { |
| 377 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); | 387 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); |
| 378 operation->DoomEntriesBetween(initial_time, end_time); | 388 operation->DoomEntriesBetween(initial_time, end_time); |
| 379 PostOperation(operation); | 389 PostOperation(operation.get()); |
| 380 } | 390 } |
| 381 | 391 |
| 382 void InFlightBackendIO::DoomEntriesSince( | 392 void InFlightBackendIO::DoomEntriesSince( |
| 383 const base::Time initial_time, const net::CompletionCallback& callback) { | 393 const base::Time initial_time, const net::CompletionCallback& callback) { |
| 384 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); | 394 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); |
| 385 operation->DoomEntriesSince(initial_time); | 395 operation->DoomEntriesSince(initial_time); |
| 386 PostOperation(operation); | 396 PostOperation(operation.get()); |
| 387 } | 397 } |
| 388 | 398 |
| 389 void InFlightBackendIO::OpenNextEntry(void** iter, Entry** next_entry, | 399 void InFlightBackendIO::OpenNextEntry(void** iter, Entry** next_entry, |
| 390 const net::CompletionCallback& callback) { | 400 const net::CompletionCallback& callback) { |
| 391 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); | 401 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); |
| 392 operation->OpenNextEntry(iter, next_entry); | 402 operation->OpenNextEntry(iter, next_entry); |
| 393 PostOperation(operation); | 403 PostOperation(operation.get()); |
| 394 } | 404 } |
| 395 | 405 |
| 396 void InFlightBackendIO::OpenPrevEntry(void** iter, Entry** prev_entry, | 406 void InFlightBackendIO::OpenPrevEntry(void** iter, Entry** prev_entry, |
| 397 const net::CompletionCallback& callback) { | 407 const net::CompletionCallback& callback) { |
| 398 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); | 408 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); |
| 399 operation->OpenPrevEntry(iter, prev_entry); | 409 operation->OpenPrevEntry(iter, prev_entry); |
| 400 PostOperation(operation); | 410 PostOperation(operation.get()); |
| 401 } | 411 } |
| 402 | 412 |
| 403 void InFlightBackendIO::EndEnumeration(void* iterator) { | 413 void InFlightBackendIO::EndEnumeration(void* iterator) { |
| 404 scoped_refptr<BackendIO> operation( | 414 scoped_refptr<BackendIO> operation( |
| 405 new BackendIO(this, backend_, net::CompletionCallback())); | 415 new BackendIO(this, backend_, net::CompletionCallback())); |
| 406 operation->EndEnumeration(iterator); | 416 operation->EndEnumeration(iterator); |
| 407 PostOperation(operation); | 417 PostOperation(operation.get()); |
| 408 } | 418 } |
| 409 | 419 |
| 410 void InFlightBackendIO::OnExternalCacheHit(const std::string& key) { | 420 void InFlightBackendIO::OnExternalCacheHit(const std::string& key) { |
| 411 scoped_refptr<BackendIO> operation( | 421 scoped_refptr<BackendIO> operation( |
| 412 new BackendIO(this, backend_, net::CompletionCallback())); | 422 new BackendIO(this, backend_, net::CompletionCallback())); |
| 413 operation->OnExternalCacheHit(key); | 423 operation->OnExternalCacheHit(key); |
| 414 PostOperation(operation); | 424 PostOperation(operation.get()); |
| 415 } | 425 } |
| 416 | 426 |
| 417 void InFlightBackendIO::CloseEntryImpl(EntryImpl* entry) { | 427 void InFlightBackendIO::CloseEntryImpl(EntryImpl* entry) { |
| 418 scoped_refptr<BackendIO> operation( | 428 scoped_refptr<BackendIO> operation( |
| 419 new BackendIO(this, backend_, net::CompletionCallback())); | 429 new BackendIO(this, backend_, net::CompletionCallback())); |
| 420 operation->CloseEntryImpl(entry); | 430 operation->CloseEntryImpl(entry); |
| 421 PostOperation(operation); | 431 PostOperation(operation.get()); |
| 422 } | 432 } |
| 423 | 433 |
| 424 void InFlightBackendIO::DoomEntryImpl(EntryImpl* entry) { | 434 void InFlightBackendIO::DoomEntryImpl(EntryImpl* entry) { |
| 425 scoped_refptr<BackendIO> operation( | 435 scoped_refptr<BackendIO> operation( |
| 426 new BackendIO(this, backend_, net::CompletionCallback())); | 436 new BackendIO(this, backend_, net::CompletionCallback())); |
| 427 operation->DoomEntryImpl(entry); | 437 operation->DoomEntryImpl(entry); |
| 428 PostOperation(operation); | 438 PostOperation(operation.get()); |
| 429 } | 439 } |
| 430 | 440 |
| 431 void InFlightBackendIO::FlushQueue(const net::CompletionCallback& callback) { | 441 void InFlightBackendIO::FlushQueue(const net::CompletionCallback& callback) { |
| 432 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); | 442 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); |
| 433 operation->FlushQueue(); | 443 operation->FlushQueue(); |
| 434 PostOperation(operation); | 444 PostOperation(operation.get()); |
| 435 } | 445 } |
| 436 | 446 |
| 437 void InFlightBackendIO::RunTask( | 447 void InFlightBackendIO::RunTask( |
| 438 const base::Closure& task, const net::CompletionCallback& callback) { | 448 const base::Closure& task, const net::CompletionCallback& callback) { |
| 439 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); | 449 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); |
| 440 operation->RunTask(task); | 450 operation->RunTask(task); |
| 441 PostOperation(operation); | 451 PostOperation(operation.get()); |
| 442 } | 452 } |
| 443 | 453 |
| 444 void InFlightBackendIO::ReadData(EntryImpl* entry, int index, int offset, | 454 void InFlightBackendIO::ReadData(EntryImpl* entry, int index, int offset, |
| 445 net::IOBuffer* buf, int buf_len, | 455 net::IOBuffer* buf, int buf_len, |
| 446 const net::CompletionCallback& callback) { | 456 const net::CompletionCallback& callback) { |
| 447 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); | 457 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); |
| 448 operation->ReadData(entry, index, offset, buf, buf_len); | 458 operation->ReadData(entry, index, offset, buf, buf_len); |
| 449 PostOperation(operation); | 459 PostOperation(operation.get()); |
| 450 } | 460 } |
| 451 | 461 |
| 452 void InFlightBackendIO::WriteData(EntryImpl* entry, int index, int offset, | 462 void InFlightBackendIO::WriteData(EntryImpl* entry, int index, int offset, |
| 453 net::IOBuffer* buf, int buf_len, | 463 net::IOBuffer* buf, int buf_len, |
| 454 bool truncate, | 464 bool truncate, |
| 455 const net::CompletionCallback& callback) { | 465 const net::CompletionCallback& callback) { |
| 456 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); | 466 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); |
| 457 operation->WriteData(entry, index, offset, buf, buf_len, truncate); | 467 operation->WriteData(entry, index, offset, buf, buf_len, truncate); |
| 458 PostOperation(operation); | 468 PostOperation(operation.get()); |
| 459 } | 469 } |
| 460 | 470 |
| 461 void InFlightBackendIO::ReadSparseData( | 471 void InFlightBackendIO::ReadSparseData( |
| 462 EntryImpl* entry, int64 offset, net::IOBuffer* buf, int buf_len, | 472 EntryImpl* entry, int64 offset, net::IOBuffer* buf, int buf_len, |
| 463 const net::CompletionCallback& callback) { | 473 const net::CompletionCallback& callback) { |
| 464 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); | 474 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); |
| 465 operation->ReadSparseData(entry, offset, buf, buf_len); | 475 operation->ReadSparseData(entry, offset, buf, buf_len); |
| 466 PostOperation(operation); | 476 PostOperation(operation.get()); |
| 467 } | 477 } |
| 468 | 478 |
| 469 void InFlightBackendIO::WriteSparseData( | 479 void InFlightBackendIO::WriteSparseData( |
| 470 EntryImpl* entry, int64 offset, net::IOBuffer* buf, int buf_len, | 480 EntryImpl* entry, int64 offset, net::IOBuffer* buf, int buf_len, |
| 471 const net::CompletionCallback& callback) { | 481 const net::CompletionCallback& callback) { |
| 472 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); | 482 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); |
| 473 operation->WriteSparseData(entry, offset, buf, buf_len); | 483 operation->WriteSparseData(entry, offset, buf, buf_len); |
| 474 PostOperation(operation); | 484 PostOperation(operation.get()); |
| 475 } | 485 } |
| 476 | 486 |
| 477 void InFlightBackendIO::GetAvailableRange( | 487 void InFlightBackendIO::GetAvailableRange( |
| 478 EntryImpl* entry, int64 offset, int len, int64* start, | 488 EntryImpl* entry, int64 offset, int len, int64* start, |
| 479 const net::CompletionCallback& callback) { | 489 const net::CompletionCallback& callback) { |
| 480 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); | 490 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); |
| 481 operation->GetAvailableRange(entry, offset, len, start); | 491 operation->GetAvailableRange(entry, offset, len, start); |
| 482 PostOperation(operation); | 492 PostOperation(operation.get()); |
| 483 } | 493 } |
| 484 | 494 |
| 485 void InFlightBackendIO::CancelSparseIO(EntryImpl* entry) { | 495 void InFlightBackendIO::CancelSparseIO(EntryImpl* entry) { |
| 486 scoped_refptr<BackendIO> operation( | 496 scoped_refptr<BackendIO> operation( |
| 487 new BackendIO(this, backend_, net::CompletionCallback())); | 497 new BackendIO(this, backend_, net::CompletionCallback())); |
| 488 operation->CancelSparseIO(entry); | 498 operation->CancelSparseIO(entry); |
| 489 PostOperation(operation); | 499 PostOperation(operation.get()); |
| 490 } | 500 } |
| 491 | 501 |
| 492 void InFlightBackendIO::ReadyForSparseIO( | 502 void InFlightBackendIO::ReadyForSparseIO( |
| 493 EntryImpl* entry, const net::CompletionCallback& callback) { | 503 EntryImpl* entry, const net::CompletionCallback& callback) { |
| 494 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); | 504 scoped_refptr<BackendIO> operation(new BackendIO(this, backend_, callback)); |
| 495 operation->ReadyForSparseIO(entry); | 505 operation->ReadyForSparseIO(entry); |
| 496 PostOperation(operation); | 506 PostOperation(operation.get()); |
| 497 } | 507 } |
| 498 | 508 |
| 499 void InFlightBackendIO::WaitForPendingIO() { | 509 void InFlightBackendIO::WaitForPendingIO() { |
| 500 InFlightIO::WaitForPendingIO(); | 510 InFlightIO::WaitForPendingIO(); |
| 501 } | 511 } |
| 502 | 512 |
| 503 void InFlightBackendIO::OnOperationComplete(BackgroundIO* operation, | 513 void InFlightBackendIO::OnOperationComplete(BackgroundIO* operation, |
| 504 bool cancel) { | 514 bool cancel) { |
| 505 BackendIO* op = static_cast<BackendIO*>(operation); | 515 BackendIO* op = static_cast<BackendIO*>(operation); |
| 506 op->OnDone(cancel); | 516 op->OnDone(cancel); |
| 507 | 517 |
| 508 if (!op->callback().is_null() && (!cancel || op->IsEntryOperation())) | 518 if (!op->callback().is_null() && (!cancel || op->IsEntryOperation())) |
| 509 op->callback().Run(op->result()); | 519 op->callback().Run(op->result()); |
| 510 } | 520 } |
| 511 | 521 |
| 512 void InFlightBackendIO::PostOperation(BackendIO* operation) { | 522 void InFlightBackendIO::PostOperation(BackendIO* operation) { |
| 513 background_thread_->PostTask(FROM_HERE, | 523 background_thread_->PostTask(FROM_HERE, |
| 514 base::Bind(&BackendIO::ExecuteOperation, operation)); | 524 base::Bind(&BackendIO::ExecuteOperation, operation)); |
| 515 OnOperationPosted(operation); | 525 OnOperationPosted(operation); |
| 516 } | 526 } |
| 517 | 527 |
| 518 base::WeakPtr<InFlightBackendIO> InFlightBackendIO::GetWeakPtr() { | 528 base::WeakPtr<InFlightBackendIO> InFlightBackendIO::GetWeakPtr() { |
| 519 return ptr_factory_.GetWeakPtr(); | 529 return ptr_factory_.GetWeakPtr(); |
| 520 } | 530 } |
| 521 | 531 |
| 522 } // namespace | 532 } // namespace |
| OLD | NEW |