| OLD | NEW | 
|---|
| 1 // Copyright (c) 2009-2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009-2010 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/sparse_control.h" | 5 #include "net/disk_cache/sparse_control.h" | 
| 6 | 6 | 
| 7 #include "base/format_macros.h" | 7 #include "base/format_macros.h" | 
| 8 #include "base/logging.h" | 8 #include "base/logging.h" | 
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" | 
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" | 
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 119   // And wait until OnFileIOComplete gets called. | 119   // And wait until OnFileIOComplete gets called. | 
| 120 } | 120 } | 
| 121 | 121 | 
| 122 void ChildrenDeleter::DeleteChildren() { | 122 void ChildrenDeleter::DeleteChildren() { | 
| 123   int child_id = 0; | 123   int child_id = 0; | 
| 124   if (!children_map_.FindNextSetBit(&child_id)) { | 124   if (!children_map_.FindNextSetBit(&child_id)) { | 
| 125     // We are done. Just delete this object. | 125     // We are done. Just delete this object. | 
| 126     return Release(); | 126     return Release(); | 
| 127   } | 127   } | 
| 128   std::string child_name = GenerateChildName(name_, signature_, child_id); | 128   std::string child_name = GenerateChildName(name_, signature_, child_id); | 
| 129   backend_->SyncDoomEntry(child_name); | 129   backend_->DoomEntry(child_name); | 
| 130   children_map_.Set(child_id, false); | 130   children_map_.Set(child_id, false); | 
| 131 | 131 | 
| 132   // Post a task to delete the next child. | 132   // Post a task to delete the next child. | 
| 133   MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( | 133   MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod( | 
| 134       this, &ChildrenDeleter::DeleteChildren)); | 134       this, &ChildrenDeleter::DeleteChildren)); | 
| 135 } | 135 } | 
| 136 | 136 | 
| 137 }  // namespace. | 137 }  // namespace. | 
| 138 | 138 | 
| 139 namespace disk_cache { | 139 namespace disk_cache { | 
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 366   DCHECK_GE(result_, 0); | 366   DCHECK_GE(result_, 0); | 
| 367 | 367 | 
| 368   std::string key = GenerateChildKey(); | 368   std::string key = GenerateChildKey(); | 
| 369   if (child_) { | 369   if (child_) { | 
| 370     // Keep using the same child or open another one?. | 370     // Keep using the same child or open another one?. | 
| 371     if (key == child_->GetKey()) | 371     if (key == child_->GetKey()) | 
| 372       return true; | 372       return true; | 
| 373     CloseChild(); | 373     CloseChild(); | 
| 374   } | 374   } | 
| 375 | 375 | 
| 376   // See if we are tracking this child. | 376   // Se if we are tracking this child. | 
| 377   if (!ChildPresent()) | 377   if (!ChildPresent()) | 
| 378     return ContinueWithoutChild(key); | 378     return ContinueWithoutChild(key); | 
| 379 | 379 | 
| 380   child_ = entry_->backend_->OpenEntryImpl(key); | 380   child_ = entry_->backend_->OpenEntryImpl(key); | 
| 381   if (!child_) | 381   if (!child_) | 
| 382     return ContinueWithoutChild(key); | 382     return ContinueWithoutChild(key); | 
| 383 | 383 | 
| 384   EntryImpl* child = static_cast<EntryImpl*>(child_); | 384   EntryImpl* child = static_cast<EntryImpl*>(child_); | 
| 385   if (!(CHILD_ENTRY & child->GetEntryFlags()) || | 385   if (!(CHILD_ENTRY & child->GetEntryFlags()) || | 
| 386       child->GetDataSize(kSparseIndex) < | 386       child->GetDataSize(kSparseIndex) < | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
| 411 | 411 | 
| 412 void SparseControl::CloseChild() { | 412 void SparseControl::CloseChild() { | 
| 413   scoped_refptr<net::WrappedIOBuffer> buf = | 413   scoped_refptr<net::WrappedIOBuffer> buf = | 
| 414       new net::WrappedIOBuffer(reinterpret_cast<char*>(&child_data_)); | 414       new net::WrappedIOBuffer(reinterpret_cast<char*>(&child_data_)); | 
| 415 | 415 | 
| 416   // Save the allocation bitmap before closing the child entry. | 416   // Save the allocation bitmap before closing the child entry. | 
| 417   int rv = child_->WriteData(kSparseIndex, 0, buf, sizeof(child_data_), | 417   int rv = child_->WriteData(kSparseIndex, 0, buf, sizeof(child_data_), | 
| 418                              NULL, false); | 418                              NULL, false); | 
| 419   if (rv != sizeof(child_data_)) | 419   if (rv != sizeof(child_data_)) | 
| 420     DLOG(ERROR) << "Failed to save child data"; | 420     DLOG(ERROR) << "Failed to save child data"; | 
| 421   child_->Release(); | 421   child_->Close(); | 
| 422   child_ = NULL; | 422   child_ = NULL; | 
| 423 } | 423 } | 
| 424 | 424 | 
| 425 std::string SparseControl::GenerateChildKey() { | 425 std::string SparseControl::GenerateChildKey() { | 
| 426   return GenerateChildName(entry_->GetKey(), sparse_header_.signature, | 426   return GenerateChildName(entry_->GetKey(), sparse_header_.signature, | 
| 427                            offset_ >> 20); | 427                            offset_ >> 20); | 
| 428 } | 428 } | 
| 429 | 429 | 
| 430 // We are deleting the child because something went wrong. | 430 // We are deleting the child because something went wrong. | 
| 431 bool SparseControl::KillChildAndContinue(const std::string& key, bool fatal) { | 431 bool SparseControl::KillChildAndContinue(const std::string& key, bool fatal) { | 
| 432   SetChildBit(false); | 432   SetChildBit(false); | 
| 433   child_->DoomImpl(); | 433   child_->Doom(); | 
| 434   child_->Release(); | 434   child_->Close(); | 
| 435   child_ = NULL; | 435   child_ = NULL; | 
| 436   if (fatal) { | 436   if (fatal) { | 
| 437     result_ = net::ERR_CACHE_READ_FAILURE; | 437     result_ = net::ERR_CACHE_READ_FAILURE; | 
| 438     return false; | 438     return false; | 
| 439   } | 439   } | 
| 440   return ContinueWithoutChild(key); | 440   return ContinueWithoutChild(key); | 
| 441 } | 441 } | 
| 442 | 442 | 
| 443 // We were not able to open this child; see what we can do. | 443 // We were not able to open this child; see what we can do. | 
| 444 bool SparseControl::ContinueWithoutChild(const std::string& key) { | 444 bool SparseControl::ContinueWithoutChild(const std::string& key) { | 
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 610   if (!VerifyRange()) | 610   if (!VerifyRange()) | 
| 611     return false; | 611     return false; | 
| 612 | 612 | 
| 613   // We have more work to do. Let's not trigger a callback to the caller. | 613   // We have more work to do. Let's not trigger a callback to the caller. | 
| 614   finished_ = false; | 614   finished_ = false; | 
| 615   net::CompletionCallback* callback = user_callback_ ? &child_callback_ : NULL; | 615   net::CompletionCallback* callback = user_callback_ ? &child_callback_ : NULL; | 
| 616 | 616 | 
| 617   int rv = 0; | 617   int rv = 0; | 
| 618   switch (operation_) { | 618   switch (operation_) { | 
| 619     case kReadOperation: | 619     case kReadOperation: | 
| 620       rv = child_->ReadDataImpl(kSparseData, child_offset_, user_buf_, | 620       rv = child_->ReadData(kSparseData, child_offset_, user_buf_, child_len_, | 
| 621                                 child_len_, callback); | 621                             callback); | 
| 622       break; | 622       break; | 
| 623     case kWriteOperation: | 623     case kWriteOperation: | 
| 624       rv = child_->WriteDataImpl(kSparseData, child_offset_, user_buf_, | 624       rv = child_->WriteData(kSparseData, child_offset_, user_buf_, child_len_, | 
| 625                                  child_len_, callback, false); | 625                              callback, false); | 
| 626       break; | 626       break; | 
| 627     case kGetRangeOperation: | 627     case kGetRangeOperation: | 
| 628       rv = DoGetAvailableRange(); | 628       rv = DoGetAvailableRange(); | 
| 629       break; | 629       break; | 
| 630     default: | 630     default: | 
| 631       NOTREACHED(); | 631       NOTREACHED(); | 
| 632   } | 632   } | 
| 633 | 633 | 
| 634   if (rv == net::ERR_IO_PENDING) { | 634   if (rv == net::ERR_IO_PENDING) { | 
| 635     if (!pending_) { | 635     if (!pending_) { | 
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 749     net::CompletionCallback* c = abort_callbacks_[i]; | 749     net::CompletionCallback* c = abort_callbacks_[i]; | 
| 750     if (i == abort_callbacks_.size() - 1) | 750     if (i == abort_callbacks_.size() - 1) | 
| 751       abort_callbacks_.clear(); | 751       abort_callbacks_.clear(); | 
| 752 | 752 | 
| 753     entry_->Release();  // Don't touch object after this line. | 753     entry_->Release();  // Don't touch object after this line. | 
| 754     c->Run(net::OK); | 754     c->Run(net::OK); | 
| 755   } | 755   } | 
| 756 } | 756 } | 
| 757 | 757 | 
| 758 }  // namespace disk_cache | 758 }  // namespace disk_cache | 
| OLD | NEW | 
|---|