/* */ #include "MultiFileAllocationIterator.h" #include "MultiDiskAdaptor.h" #include "FileEntry.h" #include "AdaptiveFileAllocationIterator.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()), offset_(0) {} 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. #ifdef HAVE_SOME_FALLOCATE if(diskAdaptor_->doesFallocate()) { fileAllocationIterator_.reset (new FallocFileAllocationIterator(entry->getDiskWriter().get(), entry->size(), fileEntry->getLength())); } else #endif // HAVE_SOME_FALLOCATE { fileAllocationIterator_.reset (new AdaptiveFileAllocationIterator(entry->getDiskWriter().get(), entry->size(), fileEntry->getLength())); } } } if(finished()) { return; } fileAllocationIterator_->allocateChunk(); } bool MultiFileAllocationIterator::finished() { return entries_.empty() && (!fileAllocationIterator_ || fileAllocationIterator_->finished()); } off_t MultiFileAllocationIterator::getCurrentLength() { if(!fileAllocationIterator_) { return 0; } else { return fileAllocationIterator_->getCurrentLength(); } } uint64_t MultiFileAllocationIterator::getTotalLength() { if(!fileAllocationIterator_) { return 0; } else { return fileAllocationIterator_->getTotalLength(); } } const std::deque >& MultiFileAllocationIterator::getDiskWriterEntries() const { return entries_; } } // namespace aria2