diff options
Diffstat (limited to 'src/MultiFileAllocationIterator.cc')
| -rw-r--r-- | src/MultiFileAllocationIterator.cc | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/src/MultiFileAllocationIterator.cc b/src/MultiFileAllocationIterator.cc index 1b234c0a..225d8a00 100644 --- a/src/MultiFileAllocationIterator.cc +++ b/src/MultiFileAllocationIterator.cc @@ -41,6 +41,7 @@ # include "FallocFileAllocationIterator.h" #endif // HAVE_SOME_FALLOCATE #include "DiskWriter.h" +#include "DefaultDiskWriterFactory.h" namespace aria2 { @@ -50,37 +51,57 @@ MultiFileAllocationIterator::MultiFileAllocationIterator entryItr_{std::begin(diskAdaptor_->getDiskWriterEntries())} {} -MultiFileAllocationIterator::~MultiFileAllocationIterator() {} +MultiFileAllocationIterator::~MultiFileAllocationIterator() { + if(diskWriter_) { + diskWriter_->closeFile(); + } +} void MultiFileAllocationIterator::allocateChunk() { while((!fileAllocationIterator_ || fileAllocationIterator_->finished()) && entryItr_ != std::end(diskAdaptor_->getDiskWriterEntries())) { + if (diskWriter_) { + diskWriter_->closeFile(); + diskWriter_.reset(); + } + fileAllocationIterator_.reset(); + if(!(*entryItr_)->getDiskWriter()) { + ++entryItr_; + continue; + } auto& fileEntry = (*entryItr_)->getFileEntry(); + // we use dedicated DiskWriter instead of + // (*entryItr_)->getDiskWriter(). This is because + // SingleFileAllocationIterator cannot reopen file if file is + // closed by OpenedFileCounter. + diskWriter_ = + DefaultDiskWriterFactory().newDiskWriter((*entryItr_)->getFilePath()); // Open file before calling DiskWriterEntry::size(). Calling // private function of MultiDiskAdaptor. - diskAdaptor_->openIfNot((*entryItr_).get(), &DiskWriterEntry::openFile); + diskWriter_->openFile(fileEntry->getLength()); + if((*entryItr_)->needsFileAllocation() && (*entryItr_)->size() < fileEntry->getLength()) { switch(diskAdaptor_->getFileAllocationMethod()) { #ifdef HAVE_SOME_FALLOCATE case(DiskAdaptor::FILE_ALLOC_FALLOC): fileAllocationIterator_ = make_unique<FallocFileAllocationIterator> - ((*entryItr_)->getDiskWriter().get(), + (diskWriter_.get(), (*entryItr_)->size(), fileEntry->getLength()); break; #endif // HAVE_SOME_FALLOCATE case(DiskAdaptor::FILE_ALLOC_TRUNC): fileAllocationIterator_ = make_unique<TruncFileAllocationIterator> - ((*entryItr_)->getDiskWriter().get(), + (diskWriter_.get(), (*entryItr_)->size(), fileEntry->getLength()); break; default: fileAllocationIterator_ = make_unique<AdaptiveFileAllocationIterator> - ((*entryItr_)->getDiskWriter().get(), + (diskWriter_.get(), (*entryItr_)->size(), fileEntry->getLength()); break; |
