/* */ #include "MultiFileAllocationIterator.h" #include "MultiDiskAdaptor.h" #include "FileEntry.h" #include "AdaptiveFileAllocationIterator.h" #include "TruncFileAllocationIterator.h" #ifdef HAVE_SOME_FALLOCATE # include "FallocFileAllocationIterator.h" #endif // HAVE_SOME_FALLOCATE #include "DiskWriter.h" namespace aria2 { MultiFileAllocationIterator::MultiFileAllocationIterator (MultiDiskAdaptor* diskAdaptor): diskAdaptor_(diskAdaptor), entries_(diskAdaptor_->diskWriterEntries_.begin(), diskAdaptor_->diskWriterEntries_.end()) {} MultiFileAllocationIterator::~MultiFileAllocationIterator() {} void MultiFileAllocationIterator::allocateChunk() { while(!fileAllocationIterator_ || fileAllocationIterator_->finished()) { if(entries_.empty()) { break; } SharedHandle entry = entries_.front(); entries_.pop_front(); SharedHandle fileEntry = entry->getFileEntry(); // Open file before calling DiskWriterEntry::size() diskAdaptor_->openIfNot(entry, &DiskWriterEntry::openFile); if(entry->needsFileAllocation() && entry->size() < fileEntry->getLength()) { // Calling private function of MultiDiskAdaptor. switch(diskAdaptor_->getFileAllocationMethod()) { #ifdef HAVE_SOME_FALLOCATE case(DiskAdaptor::FILE_ALLOC_FALLOC): fileAllocationIterator_.reset (new FallocFileAllocationIterator(entry->getDiskWriter().get(), entry->size(), fileEntry->getLength())); break; #endif // HAVE_SOME_FALLOCATE case(DiskAdaptor::FILE_ALLOC_TRUNC): fileAllocationIterator_.reset (new TruncFileAllocationIterator(entry->getDiskWriter().get(), entry->size(), fileEntry->getLength())); break; default: fileAllocationIterator_.reset (new AdaptiveFileAllocationIterator(entry->getDiskWriter().get(), entry->size(), fileEntry->getLength())); break; } } } if(finished()) { return; } fileAllocationIterator_->allocateChunk(); } bool MultiFileAllocationIterator::finished() { return entries_.empty() && (!fileAllocationIterator_ || fileAllocationIterator_->finished()); } int64_t MultiFileAllocationIterator::getCurrentLength() { if(!fileAllocationIterator_) { return 0; } else { return fileAllocationIterator_->getCurrentLength(); } } int64_t MultiFileAllocationIterator::getTotalLength() { if(!fileAllocationIterator_) { return 0; } else { return fileAllocationIterator_->getTotalLength(); } } const std::deque >& MultiFileAllocationIterator::getDiskWriterEntries() const { return entries_; } } // namespace aria2