diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2016-03-26 17:12:52 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2016-03-26 17:20:27 +0900 |
| commit | d64089632e82a2548752c7a6baaa68365a795a74 (patch) | |
| tree | 57fc7b85a8c1290975d58fa4761b04a7695bf7e3 /src/MultiFileAllocationIterator.cc | |
| parent | c81b1321122e8509b55c94c0cbca0d8d6d319f0c (diff) | |
| parent | a7cd943a06b1a5ff4515b57060b84037f8d01f9f (diff) | |
Merge branch 'master' into random-webseeding
Diffstat (limited to 'src/MultiFileAllocationIterator.cc')
| -rw-r--r-- | src/MultiFileAllocationIterator.cc | 90 |
1 files changed, 51 insertions, 39 deletions
diff --git a/src/MultiFileAllocationIterator.cc b/src/MultiFileAllocationIterator.cc index 225d8a00..6ed22444 100644 --- a/src/MultiFileAllocationIterator.cc +++ b/src/MultiFileAllocationIterator.cc @@ -38,39 +38,50 @@ #include "AdaptiveFileAllocationIterator.h" #include "TruncFileAllocationIterator.h" #ifdef HAVE_SOME_FALLOCATE -# include "FallocFileAllocationIterator.h" +#include "FallocFileAllocationIterator.h" #endif // HAVE_SOME_FALLOCATE #include "DiskWriter.h" #include "DefaultDiskWriterFactory.h" +#include "LogFactory.h" namespace aria2 { -MultiFileAllocationIterator::MultiFileAllocationIterator -(MultiDiskAdaptor* diskAdaptor) - : diskAdaptor_{diskAdaptor}, - entryItr_{std::begin(diskAdaptor_->getDiskWriterEntries())} -{} +MultiFileAllocationIterator::MultiFileAllocationIterator( + MultiDiskAdaptor* diskAdaptor) + : diskAdaptor_{diskAdaptor}, + entryItr_{std::begin(diskAdaptor_->getDiskWriterEntries())} +{ +} -MultiFileAllocationIterator::~MultiFileAllocationIterator() { - if(diskWriter_) { +MultiFileAllocationIterator::~MultiFileAllocationIterator() +{ + if (diskWriter_) { diskWriter_->closeFile(); } } void MultiFileAllocationIterator::allocateChunk() { - while((!fileAllocationIterator_ || - fileAllocationIterator_->finished()) && - entryItr_ != std::end(diskAdaptor_->getDiskWriterEntries())) { + if (fileAllocationIterator_) { + if (!fileAllocationIterator_->finished()) { + fileAllocationIterator_->allocateChunk(); + return; + } + if (diskWriter_) { diskWriter_->closeFile(); diskWriter_.reset(); } fileAllocationIterator_.reset(); - if(!(*entryItr_)->getDiskWriter()) { + ++entryItr_; + } + + while (entryItr_ != std::end(diskAdaptor_->getDiskWriterEntries())) { + if (!(*entryItr_)->getDiskWriter()) { ++entryItr_; continue; } + auto& fileEntry = (*entryItr_)->getFileEntry(); // we use dedicated DiskWriter instead of // (*entryItr_)->getDiskWriter(). This is because @@ -82,60 +93,61 @@ void MultiFileAllocationIterator::allocateChunk() // private function of MultiDiskAdaptor. diskWriter_->openFile(fileEntry->getLength()); - if((*entryItr_)->needsFileAllocation() && - (*entryItr_)->size() < fileEntry->getLength()) { - switch(diskAdaptor_->getFileAllocationMethod()) { + if ((*entryItr_)->needsFileAllocation() && + (*entryItr_)->size() < fileEntry->getLength()) { + A2_LOG_INFO(fmt("Allocating file %s: target size=%" PRId64 + ", current size=%" PRId64, + (*entryItr_)->getFilePath().c_str(), + fileEntry->getLength(), (*entryItr_)->size())); + switch (diskAdaptor_->getFileAllocationMethod()) { #ifdef HAVE_SOME_FALLOCATE - case(DiskAdaptor::FILE_ALLOC_FALLOC): - fileAllocationIterator_ = make_unique<FallocFileAllocationIterator> - (diskWriter_.get(), - (*entryItr_)->size(), - fileEntry->getLength()); + case (DiskAdaptor::FILE_ALLOC_FALLOC): + fileAllocationIterator_ = make_unique<FallocFileAllocationIterator>( + diskWriter_.get(), (*entryItr_)->size(), fileEntry->getLength()); break; #endif // HAVE_SOME_FALLOCATE - case(DiskAdaptor::FILE_ALLOC_TRUNC): - fileAllocationIterator_ = make_unique<TruncFileAllocationIterator> - (diskWriter_.get(), - (*entryItr_)->size(), - fileEntry->getLength()); + case (DiskAdaptor::FILE_ALLOC_TRUNC): + fileAllocationIterator_ = make_unique<TruncFileAllocationIterator>( + diskWriter_.get(), (*entryItr_)->size(), fileEntry->getLength()); break; default: - fileAllocationIterator_ = make_unique<AdaptiveFileAllocationIterator> - (diskWriter_.get(), - (*entryItr_)->size(), - fileEntry->getLength()); + fileAllocationIterator_ = make_unique<AdaptiveFileAllocationIterator>( + diskWriter_.get(), (*entryItr_)->size(), fileEntry->getLength()); break; } - break; + fileAllocationIterator_->allocateChunk(); + return; } + + diskWriter_->closeFile(); + diskWriter_.reset(); + ++entryItr_; } - if(finished()) { - return; - } - fileAllocationIterator_->allocateChunk(); } bool MultiFileAllocationIterator::finished() { return entryItr_ == std::end(diskAdaptor_->getDiskWriterEntries()) && - (!fileAllocationIterator_ || fileAllocationIterator_->finished()); + (!fileAllocationIterator_ || fileAllocationIterator_->finished()); } int64_t MultiFileAllocationIterator::getCurrentLength() { - if(!fileAllocationIterator_) { + if (!fileAllocationIterator_) { return 0; - } else { + } + else { return fileAllocationIterator_->getCurrentLength(); } } int64_t MultiFileAllocationIterator::getTotalLength() { - if(!fileAllocationIterator_) { + if (!fileAllocationIterator_) { return 0; - } else { + } + else { return fileAllocationIterator_->getTotalLength(); } } |
